整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          關于前端CSS寫法104個知識點匯總(一)



          SS 面試知識點總結

          最近在整理 CSS 的時候發現遇到了很多面試中常見的面試題,本部分主要原作者在 Github 等各大論壇收錄的 CSS 相關知識和一些相關面試題時所做的筆記,分享這份總結給大家,對大家對 CSS 的可以來一次全方位的檢漏和排查,感謝原作者 CavsZhouyou 的付出,原文鏈接放在文章最下方,如果出現錯誤,希望大家共同指出!

          1.介紹一下標準的 CSS 的盒子模型?低版本 IE 的盒子模型有什么不同的?

          相關知識點:

          (1)有兩種盒子模型:IE盒模型(border-box)、W3C標準盒模型(content-box)
          (2)盒模型:分為內容(content)、填充(padding)、邊界(margin)、邊框(border)四個部分
          
          IE盒模型和W3C標準盒模型的區別:
          
          (1)W3C標準盒模型:屬性width,height只包含內容content,不包含border和padding
          (2)IE盒模型:屬性width,height包含content、border和padding,指的是content
          +padding+border。
          
          在ie8+瀏覽器中使用哪個盒模型可以由box-sizing(CSS新增的屬性)控制,默認值為content-box,即標準盒模型;
          如果將box-sizing設為border-box則用的是IE盒模型。如果在ie6,7,8中DOCTYPE缺失會將盒子模型解釋為IE
          盒子模型。若在頁面中聲明了DOCTYPE類型,所有的瀏覽器都會把盒模型解釋為W3C盒模型。

          回答:

          盒模型都是由四個部分組成的,分別是margin、border、padding和content。
          
          標準盒模型和IE盒模型的區別在于設置width和height時,所對應的范圍不同。標準盒模型的width和height屬性的
          范圍只包含了content,而IE盒模型的width和height屬性的范圍包含了border、padding和content。
          
          一般來說,我們可以通過修改元素的box-sizing屬性來改變元素的盒模型。

          詳細的資料可以參考:《CSS 盒模型詳解》

          2.CSS 選擇符有哪些?

          (1)id選擇器(#myid)
          (2)類選擇器(.myclassname)
          (3)標簽選擇器(div,h1,p)
          (4)后代選擇器(h1p)
          (5)相鄰后代選擇器(子)選擇器(ul>li)
          (6)兄弟選擇器(li~a)
          (7)相鄰兄弟選擇器(li+a)
          (8)屬性選擇器(a[rel="external"])
          (9)偽類選擇器(a:hover,li:nth-child)
          (10)偽元素選擇器(::before、::after)
          (11)通配符選擇器(*)

          3.::before 和:after 中雙冒號和單冒號有什么區別?解釋一下這 2 個偽元素的作用。

          相關知識點:

          單冒號(:)用于CSS3偽類,雙冒號(::)用于CSS3偽元素。(偽元素由雙冒號和偽元素名稱組成)
          雙冒號是在當前規范中引入的,用于區分偽類和偽元素。不過瀏覽器需要同時支持舊的已經存在的偽元素寫法,
          比如:first-line、:first-letter、:before、:after等,
          而新的在CSS3中引入的偽元素則不允許再支持舊的單冒號的寫法。
          
          想讓插入的內容出現在其它內容前,使用::before,否者,使用::after;
          在代碼順序上,::after生成的內容也比::before生成的內容靠后。
          如果按堆棧視角,::after生成的內容會在::before生成的內容之上。

          回答:

          在css3中使用單冒號來表示偽類,用雙冒號來表示偽元素。但是為了兼容已有的偽元素的寫法,在一些瀏覽器中也可以使用單冒號
          來表示偽元素。
          
          偽類一般匹配的是元素的一些特殊狀態,如hover、link等,而偽元素一般匹配的特殊的位置,比如after、before等。

          4.偽類與偽元素的區別

          css引入偽類和偽元素概念是為了格式化文檔樹以外的信息。也就是說,偽類和偽元素是用來修飾不在文檔樹中的部分,比如,一句
          話中的第一個字母,或者是列表中的第一個元素。
          
          偽類用于當已有的元素處于某個狀態時,為其添加對應的樣式,這個狀態是根據用戶行為而動態變化的。比如說,當用戶懸停在指定的
          元素時,我們可以通過:hover來描述這個元素的狀態。
          
          偽元素用于創建一些不在文檔樹中的元素,并為其添加樣式。它們允許我們為元素的某些部分設置樣式。比如說,我們可以通過::be
          fore來在一個元素前增加一些文本,并為這些文本添加樣式。雖然用戶可以看到這些文本,但是這些文本實際上不在文檔樹中。
          
          有時你會發現偽元素使用了兩個冒號(::)而不是一個冒號(:)。這是CSS3的一部分,并嘗試區分偽類和偽元素。大多數瀏覽
          器都支持這兩個值。按照規則應該使用(::)而不是(:),從而區分偽類和偽元素。但是,由于在舊版本的W3C規范并未對此進行
          特別區分,因此目前絕大多數的瀏覽器都支持使用這兩種方式表示偽元素。

          詳細資料可以參考:《總結偽類與偽元素》

          5.CSS 中哪些屬性可以繼承?

          相關資料:

          每個CSS屬性定義的概述都指出了這個屬性是默認繼承的,還是默認不繼承的。這決定了當你沒有為元素的屬性指定值時該如何計算
          值。
          
          當元素的一個繼承屬性沒有指定值時,則取父元素的同屬性的計算值。只有文檔根元素取該屬性的概述中給定的初始值(這里的意思應
          該是在該屬性本身的定義中的默認值)。
          
          當元素的一個非繼承屬性(在Mozillacode里有時稱之為resetproperty)沒有指定值時,則取屬性的初始值initialv
          alue(該值在該屬性的概述里被指定)。
          
          有繼承性的屬性:
          
          (1)字體系列屬性
          font、font-family、font-weight、font-size、font-style、font-variant、font-stretch、font-size-adjust
          
          (2)文本系列屬性
          text-indent、text-align、text-shadow、line-height、word-spacing、letter-spacing、
          text-transform、direction、color
          
          (3)表格布局屬性
          caption-sideborder-collapseempty-cells
          
          (4)列表屬性
          list-style-type、list-style-image、list-style-position、list-style
          
          (5)光標屬性
          cursor
          
          (6)元素可見性
          visibility
          
          (7)還有一些不常用的;speak,page,設置嵌套引用的引號類型quotes等屬性
          
          
          注意:當一個屬性不是繼承屬性時,可以使用inherit關鍵字指定一個屬性應從父元素繼承它的值,inherit關鍵字用于顯式地
          指定繼承性,可用于任何繼承性/非繼承性屬性。

          回答:

          每一個屬性在定義中都給出了這個屬性是否具有繼承性,一個具有繼承性的屬性會在沒有指定值的時候,會使用父元素的同屬性的值
          來作為自己的值。
          
          一般具有繼承性的屬性有,字體相關的屬性,font-size和font-weight等。文本相關的屬性,color和text-align等。
          表格的一些布局屬性、列表屬性如list-style等。還有光標屬性cursor、元素可見性visibility。
          
          當一個屬性不是繼承屬性的時候,我們也可以通過將它的值設置為inherit來使它從父元素那獲取同名的屬性值來繼承。

          詳細的資料可以參考:《繼承屬性》《CSS 有哪些屬性可以繼承?》

          6.CSS 優先級算法如何計算?

          相關知識點:

          CSS的優先級是根據樣式聲明的特殊性值來判斷的。
          
          選擇器的特殊性值分為四個等級,如下:
          
          (1)標簽內選擇符x,0,0,0
          (2)ID選擇符0,x,0,0
          (3)class選擇符/屬性選擇符/偽類選擇符    0,0,x,0
          (4)元素和偽元素選擇符0,0,0,x
          
          計算方法:
          
          (1)每個等級的初始值為0
          (2)每個等級的疊加為選擇器出現的次數相加
          (3)不可進位,比如0,99,99,99
          (4)依次表示為:0,0,0,0
          (5)每個等級計數之間沒關聯
          (6)等級判斷從左向右,如果某一位數值相同,則判斷下一位數值
          (7)如果兩個優先級相同,則最后出現的優先級高,!important也適用
          (8)通配符選擇器的特殊性值為:0,0,0,0
          (9)繼承樣式優先級最低,通配符樣式優先級高于繼承樣式
          (10)!important(權重),它沒有特殊性值,但它的優先級是最高的,為了方便記憶,可以認為它的特殊性值為1,0,0,0,0。
          
          計算實例:
          
          (1)#demoa{color:orange;}/*特殊性值:0,1,0,1*/
          (2)div#demoa{color:red;}/*特殊性值:0,1,0,2*/
          
          
          注意:
          (1)樣式應用時,css會先查看規則的權重(!important),加了權重的優先級最高,當權重相同的時候,會比較規則的特殊性。
          
          (2)特殊性值越大的聲明優先級越高。
          
          (3)相同特殊性值的聲明,根據樣式引入的順序,后聲明的規則優先級高(距離元素出現最近的)

          回答:

          判斷優先級時,首先我們會判斷一條屬性聲明是否有權重,也就是是否在聲明后面加上了!important。一條聲明如果加上了權重,
          那么它的優先級就是最高的,前提是它之后不再出現相同權重的聲明。如果權重相同,我們則需要去比較匹配規則的特殊性。
          
          一條匹配規則一般由多個選擇器組成,一條規則的特殊性由組成它的選擇器的特殊性累加而成。選擇器的特殊性可以分為四個等級,
          第一個等級是行內樣式,為1000,第二個等級是id選擇器,為0100,第三個等級是類選擇器、偽類選擇器和屬性選擇器,為0010,
          第四個等級是元素選擇器和偽元素選擇器,為0001。規則中每出現一個選擇器,就將它的特殊性進行疊加,這個疊加只限于對應的等
          級的疊加,不會產生進位。選擇器特殊性值的比較是從左向右排序的,也就是說以1開頭的特殊性值比所有以0開頭的特殊性值要大。
          比如說特殊性值為1000的的規則優先級就要比特殊性值為0999的規則高。如果兩個規則的特殊性值相等的時候,那么就會根據它們引
          入的順序,后出現的規則的優先級最高。

          對于組合聲明的特殊性值計算可以參考:《CSS 優先級計算及應用》《CSS 優先級計算規則》

          7.關于偽類 LVHA 的解釋?

          a標簽有四種狀態:鏈接訪問前、鏈接訪問后、鼠標滑過、激活,分別對應四種偽類:link、:visited、:hover、:active;
          
          當鏈接未訪問過時:
          
          (1)當鼠標滑過a鏈接時,滿足:link和:hover兩種狀態,要改變a標簽的顏色,就必須將:hover偽類在:link偽
          類后面聲明;
          (2)當鼠標點擊激活a鏈接時,同時滿足:link、:hover、:active三種狀態,要顯示a標簽激活時的樣式(:active),
          必須將:active聲明放到:link和:hover之后。因此得出LVHA這個順序。
          
          當鏈接訪問過時,情況基本同上,只不過需要將:link換成:visited。
          
          這個順序能不能變?可以,但也只有:link和:visited可以交換位置,因為一個鏈接要么訪問過要么沒訪問過,不可能同時滿足,
          也就不存在覆蓋的問題。

          8.CSS3 新增偽類有那些?

          (1)elem:nth-child(n)選中父元素下的第n個子元素,并且這個子元素的標簽名為elem,n可以接受具體的數
          值,也可以接受函數。
          
          (2)elem:nth-last-child(n)作用同上,不過是從后開始查找。
          
          (3)elem:last-child選中最后一個子元素。
          
          (4)elem:only-child如果elem是父元素下唯一的子元素,則選中之。
          
          (5)elem:nth-of-type(n)選中父元素下第n個elem類型元素,n可以接受具體的數值,也可以接受函數。
          
          (6)elem:first-of-type選中父元素下第一個elem類型元素。
          
          (7)elem:last-of-type選中父元素下最后一個elem類型元素。
          
          (8)elem:only-of-type如果父元素下的子元素只有一個elem類型元素,則選中該元素。
          
          (9)elem:empty選中不包含子元素和內容的elem類型元素。
          
          (10)elem:target選擇當前活動的elem元素。
          
          (11):not(elem)選擇非elem元素的每個元素。
          
          (12):enabled    控制表單控件的禁用狀態。
          
          (13):disabled        控制表單控件的禁用狀態。
          
          (14):checked單選框或復選框被選中。
          

          詳細的資料可以參考:《CSS3 新特性總結(偽類)》《淺談 CSS 偽類和偽元素及 CSS3 新增偽類》

          9.如何居中 div?

          -水平居中:給 div 設置一個寬度,然后添加 margin:0auto 屬性

          div {
            width: 200px;
            margin: 0auto;
          }

          -水平居中,利用 text-align:center 實現

          .container {
            background: rgba(0, 0, 0, 0.5);
            text-align: center;
            font-size: 0;
          }
          
          .box {
            display: inline-block;
            width: 500px;
            height: 400px;
            background-color: pink;
          }

          -讓絕對定位的 div 居中

          div {
            position: absolute;
            width: 300px;
            height: 300px;
            margin: auto;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            background-color: pink; /*方便看效果*/
          }

          -水平垂直居中一

          /*確定容器的寬高寬500高300的層設置層的外邊距div{*/
          position:absolute;/*絕對定位*/
          width:500px;
          height:300px;
          top:50%;
          left:50%;
          margin:-150px00-250px;/*外邊距為自身寬高的一半*/
          background-color:pink;/*方便看效果*/
          }

          -水平垂直居中二

          /*未知容器的寬高,利用`transform`屬性*/
          div {
            position: absolute; /*相對定位或絕對定位均可*/
            width: 500px;
            height: 300px;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background-color: pink; /*方便看效果*/
          }

          -水平垂直居中三

          /*利用flex布局實際使用時應考慮兼容性*/
          .container {
            display: flex;
            align-items: center; /*垂直居中*/
            justify-content: center; /*水平居中*/
          }
          .containerdiv {
            width: 100px;
            height: 100px;
            background-color: pink; /*方便看效果*/
          }

          -水平垂直居中四

          /*利用text-align:center和vertical-align:middle屬性*/
          .container {
            position: fixed;
            top: 0;
            right: 0;
            bottom: 0;
            left: 0;
            background: rgba(0, 0, 0, 0.5);
            text-align: center;
            font-size: 0;
            white-space: nowrap;
            overflow: auto;
          }
          
          .container::after {
            content: "";
            display: inline-block;
            height: 100%;
            vertical-align: middle;
          }
          
          .box {
            display: inline-block;
            width: 500px;
            height: 400px;
            background-color: pink;
            white-space: normal;
            vertical-align: middle;
          }

          回答:

          一般常見的幾種居中的方法有:
          
          對于寬高固定的元素
          
          (1)我們可以利用margin:0auto來實現元素的水平居中。
          
          (2)利用絕對定位,設置四個方向的值都為0,并將margin設置為auto,由于寬高固定,因此對應方向實現平分,可以實現水
          平和垂直方向上的居中。
          
          (3)利用絕對定位,先將元素的左上角通過top:50%和left:50%定位到頁面的中心,然后再通過margin負值來調整元素
          的中心點到頁面的中心。
          
          (4)利用絕對定位,先將元素的左上角通過top:50%和left:50%定位到頁面的中心,然后再通過translate來調整元素
          的中心點到頁面的中心。
          
          (5)使用flex布局,通過align-items:center和justify-content:center設置容器的垂直和水平方向上為居中對
          齊,然后它的子元素也可以實現垂直和水平的居中。
          
          對于寬高不定的元素,上面的后面兩種方法,可以實現元素的垂直和水平的居中。

          10.display 有哪些值?說明他們的作用。

          block    塊類型。默認寬度為父元素寬度,可設置寬高,換行顯示。
          none    元素不顯示,并從文檔流中移除。
          inline    行內元素類型。默認寬度為內容寬度,不可設置寬高,同行顯示。
          inline-block默認寬度為內容寬度,可以設置寬高,同行顯示。
          list-item    像塊類型元素一樣顯示,并添加樣式列表標記。
          table    此元素會作為塊級表格來顯示。
          inherit    規定應該從父元素繼承display屬性的值。

          詳細資料可以參考:《CSSdisplay 屬性》

          11.position 的值 relative 和 absolute 定位原點是?

          相關知識點:

          absolute
          生成絕對定位的元素,相對于值不為static的第一個父元素的paddingbox進行定位,也可以理解為離自己這一級元素最近的
          一級position設置為absolute或者relative的父元素的paddingbox的左上角為原點的。
          
          fixed(老IE不支持)
          生成絕對定位的元素,相對于瀏覽器窗口進行定位。
          
          relative
          生成相對定位的元素,相對于其元素本身所在正常位置進行定位。
          
          static
          默認值。沒有定位,元素出現在正常的流中(忽略top,bottom,left,right,z-index聲明)。
          
          inherit
          規定從父元素繼承position屬性的值。

          回答:

          relative定位的元素,是相對于元素本身的正常位置來進行定位的。
          
          absolute定位的元素,是相對于它的第一個position值不為static的祖先元素的paddingbox來進行定位的。這句話
          我們可以這樣來理解,我們首先需要找到絕對定位元素的一個position的值不為static的祖先元素,然后相對于這個祖先元
          素的paddingbox來定位,也就是說在計算定位距離的時候,padding的值也要算進去。

          12.CSS3 有哪些新特性?(根據項目回答)

          新增各種CSS選擇器    (:not(.input):所有class不是“input”的節點)
          圓角        (border-radius:8px)
          多列布局    (multi-columnlayout)
          陰影和反射    (Shadow\Reflect)
          文字特效        (text-shadow)
          文字渲染        (Text-decoration)
          線性漸變        (gradient)
          旋轉            (transform)
          縮放,定位,傾斜,動畫,多背景
          例如:transform:\scale(0.85,0.90)\translate(0px,-30px)\skew(-9deg,0deg)\Animation:

          13.請解釋一下 CSS3 的 Flexbox(彈性盒布局模型),以及適用場景?

          相關知識點:

          Flex是FlexibleBox的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。
          
          任何一個容器都可以指定為Flex布局。行內元素也可以使用Flex布局。注意,設為Flex布局以后,子元素的float、cl
          ear和vertical-align屬性將失效。
          
          采用Flex布局的元素,稱為Flex容器(flexcontainer),簡稱"容器"。它的所有子元素自動成為容器成員,稱為Flex
          項目(flexitem),簡稱"項目"。
          
          容器默認存在兩根軸:水平的主軸(mainaxis)和垂直的交叉軸(crossaxis),項目默認沿主軸排列。
          
          
          以下6個屬性設置在容器上。
          
          flex-direction屬性決定主軸的方向(即項目的排列方向)。
          
          flex-wrap屬性定義,如果一條軸線排不下,如何換行。
          
          flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為rownowrap。
          
          justify-content屬性定義了項目在主軸上的對齊方式。
          
          align-items屬性定義項目在交叉軸上如何對齊。
          
          align-content屬性定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。
          
          
          以下6個屬性設置在項目上。
          
          order屬性定義項目的排列順序。數值越小,排列越靠前,默認為0。
          
          flex-grow屬性定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。
          
          flex-shrink屬性定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。
          
          flex-basis屬性定義了在分配多余空間之前,項目占據的主軸空間。瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認
          值為auto,即項目的本來大小。
          
          flex屬性是flex-grow,flex-shrink和flex-basis的簡寫,默認值為01auto。
          
          align-self屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認值為auto,表示繼承父
          元素的align-items屬性,如果沒有父元素,則等同于stretch。

          回答:

          flex布局是CSS3新增的一種布局方式,我們可以通過將一個元素的display屬性值設置為flex從而使它成為一個flex
          容器,它的所有子元素都會成為它的項目。
          
          一個容器默認有兩條軸,一個是水平的主軸,一個是與主軸垂直的交叉軸。我們可以使用flex-direction來指定主軸的方向。
          我們可以使用justify-content來指定元素在主軸上的排列方式,使用align-items來指定元素在交叉軸上的排列方式。還
          可以使用flex-wrap來規定當一行排列不下時的換行方式。
          
          對于容器中的項目,我們可以使用order屬性來指定項目的排列順序,還可以使用flex-grow來指定當排列空間有剩余的時候,
          項目的放大比例。還可以使用flex-shrink來指定當排列空間不足時,項目的縮小比例。

          詳細資料可以參考:《Flex 布局教程:語法篇》《Flex 布局教程:實例篇》

          14.用純 CSS 創建一個三角形的原理是什么?

          采用的是相鄰邊框連接處的均分原理。
            將元素的寬高設為0,只設置
            border
            ,把任意三條邊隱藏掉(顏色設為
            transparent),剩下的就是一個三角形。
            #demo {
            width: 0;
            height: 0;
            border-width: 20px;
            border-style: solid;
            border-color: transparenttransparentredtransparent;
          }

          15.一個滿屏品字布局如何設計?

          簡單的方式:
              上面的div寬100%,
              下面的兩個div分別寬50%,
              然后用float或者inline使其不換行即可

          16.CSS 多列等高如何實現?

          (1)利用padding-bottom|margin-bottom正負值相抵,不會影響頁面布局的特點。設置父容器設置超出隱藏(overflow:
          hidden),這樣父容器的高度就還是它里面的列沒有設定padding-bottom時的高度,當它里面的任一列高度增加了,則
          父容器的高度被撐到里面最高那列的高度,其他比這列矮的列會用它們的padding-bottom補償這部分高度差。
          
          (2)利用table-cell所有單元格高度都相等的特性,來實現多列等高。
          
          (3)利用flex布局中項目align-items屬性默認為stretch,如果項目未設置高度或設為auto,將占滿整個容器的高度
          的特性,來實現多列等高。
          

          詳細資料可以參考:《前端應該掌握的 CSS 實現多列等高布局》《CSS:多列等高布局》

          17.經常遇到的瀏覽器的兼容性有哪些?原因,解決方法是什么,常用 hack 的技巧?

          (1)png24位的圖片在iE6瀏覽器上出現背景
          解決方案:做成PNG8,也可以引用一段腳本處理。
          
          (2)瀏覽器默認的margin和padding不同
          解決方案:加一個全局的*{margin:0;padding:0;}來統一。
          
          (3)IE6雙邊距bug:在IE6下,如果對元素設置了浮動,同時又設置了margin-left或
          margin-right,margin值會加倍。
          
          #box{float:left;width:10px;margin:00010px;}
          
          這種情況之下IE會產生20px的距離
          解決方案:在float的標簽樣式控制中加入_display:inline;將其轉化為行內屬性。(_這個符號只有ie6會識別)
          
          (4)漸進識別的方式,從總體中逐漸排除局部。
          首先,巧妙的使用"\9"這一標記,將IE游覽器從所有情況中分離出來。
          接著,再次使用"+"將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
          .bb{
          background-color:#f1ee18;/*所有識別*/
          .background-color:#00deff\9;/*IE6、7、8識別*/
          +background-color:#a200ff;/*IE6、7識別*/
          _background-color:#1e0bd1;/*IE6識別*/
          }
          
          (5)IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用getAttribute()獲取自定義
          屬性;Firefox下,只能使用getAttribute()獲取自定義屬性
          解決方法:統一通過getAttribute()獲取自定義屬性。
          
          (6)IE下,event對象有x、y屬性,但是沒有pageX、pageY屬性;Firefox下,event對象有
          pageX、pageY屬性,但是沒有x、y屬性。
          解決方法:(條件注釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。
          
          (7)Chrome中文界面下默認會將小于12px的文本強制按照12px顯示
          解決方法:
          
          1.可通過加入CSS屬性-webkit-text-size-adjust:none;解決。但是,在chrome
          更新到27版本之后就不可以用了。
          
          2.還可以使用-webkit-transform:scale(0.5);注意-webkit-transform:scale(0.75);
          收縮的是整個span的大小,這時候,必須要將span轉換成塊元素,可以使用display:block/inline-block/...;
          
          (8)超鏈接訪問過后hover樣式就不出現了,被點擊訪問過的超鏈接樣式不再具有hover和active了
          解決方法:改變CSS屬性的排列順序L-V-H-A
          
          (9)怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標準模式來解析網頁,但在IE中會觸發怪異模
          式。為避免怪異模式給我們帶來不必要的麻煩,最好養成書寫DTD聲明的好習慣。

          18.li 與 li 之間有看不見的空白間隔是什么原因引起的?有什么解決辦法?

          瀏覽器會把inline元素間的空白字符(空格、換行、Tab等)渲染成一個空格。而為了美觀。我們通常是一個<li>放在一行,
          這導致<li>換行后產生換行字符,它變成一個空格,占用了一個字符的寬度。
          
          解決辦法:
          
          (1)為<li>設置float:left。不足:有些容器是不能設置浮動,如左右切換的焦點圖等。
          
          (2)將所有<li>寫在同一行。不足:代碼不美觀。
          
          (3)將<ul>內的字符尺寸直接設為0,即font-size:0。不足:<ul>中的其他字符尺寸也被設為0,需要額外重新設定其他
          字符尺寸,且在Safari瀏覽器依然會出現空白間隔。
          
          (4)消除<ul>的字符間隔letter-spacing:-8px,不足:這也設置了<li>內的字符間隔,因此需要將<li>內的字符
          間隔設為默認letter-spacing:normal。

          詳細資料可以參考:《li 與 li 之間有看不見的空白間隔是什么原因引起的?》

          19.為什么要初始化 CSS 樣式?

          -因為瀏覽器的兼容問題,不同瀏覽器對有些標簽的默認值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。
          
          -當然,初始化樣式會對SEO有一定的影響,但魚和熊掌不可兼得,但力求影響最小的情況下初始化。
          
          最簡單的初始化方法:*{padding:0;margin:0;}(強烈不建議)
          
          淘寶的樣式初始化代碼:
          body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend
          ,button,input,textarea,th,td{margin:0;padding:0;}
          body,button,input,select,textarea{font:12px/1.5tahoma,arial,\5b8b\4f53;}
          h1,h2,h3,h4,h5,h6{font-size:100%;}
          address,cite,dfn,em,var{font-style:normal;}
          code,kbd,pre,samp{font-family:couriernew,courier,monospace;}
          small{font-size:12px;}
          ul,ol{list-style:none;}
          a{text-decoration:none;}
          a:hover{text-decoration:underline;}
          sup{vertical-align:text-top;}
          sub{vertical-align:text-bottom;}
          legend{color:#000;}
          fieldset,img{border:0;}
          button,input,select,textarea{font-size:100%;}
          table{border-collapse:collapse;border-spacing:0;}

          20.什么是包含塊,對于包含塊的理解?

          包含塊(containingblock)就是元素用來計算和定位的一個框。
          
          (1)根元素(很多場景下可以看成是<html>)被稱為“初始包含塊”,其尺寸等同于瀏覽器可視窗口的大小。
          
          (2)對于其他元素,如果該元素的position是relative或者static,則“包含塊”由其最近的塊容器祖先盒的contentbox
          邊界形成。
          
          (3)如果元素position:fixed,則“包含塊”是“初始包含塊”。
          
          (4)如果元素position:absolute,則“包含塊”由最近的position不為static的祖先元素建立,具體方式如下:
          
          如果該祖先元素是純inline元素,則規則略復雜:
          ?假設給內聯元素的前后各生成一個寬度為0的內聯盒子(inlinebox),則這兩個內聯盒子的paddingbox外面的包
          圍盒就是內聯元素的“包含塊”;
          ?如果該內聯元素被跨行分割了,那么“包含塊”是未定義的,也就是CSS2.1規范并沒有明確定義,瀏覽器自行發揮
          否則,“包含塊”由該祖先的paddingbox邊界形成。
          
          如果沒有符合條件的祖先元素,則“包含塊”是“初始包含塊”。

          21.CSS 里的 visibility 屬性有個 collapse 屬性值是干嘛用的?在不同瀏覽器下以后什么區別?

          (1)對于一般的元素,它的表現跟visibility:hidden;是一樣的。元素是不可見的,但此時仍占用頁面空間。
          
          (2)但例外的是,如果這個元素是table相關的元素,例如table行,tablegroup,table列,tablecolumngroup,它的
          表現卻跟display:none一樣,也就是說,它們占用的空間也會釋放。
          
          在不同瀏覽器下的區別:
          
          在谷歌瀏覽器里,使用collapse值和使用hidden值沒有什么區別。
          
          在火狐瀏覽器、Opera和IE11里,使用collapse值的效果就如它的字面意思:table的行會消失,它的下面一行會補充它的位
          置。
          

          詳細資料可以參考:《CSS 里的 visibility 屬性有個鮮為人知的屬性值:collapse》

          22.width:auto 和 width:100%的區別

          一般而言
          
          width:100%會使元素box的寬度等于父元素的contentbox的寬度。
          
          width:auto會使元素撐滿整個父元素,margin、border、padding、content區域會自動分配水平空間。

          23.絕對定位元素與非絕對定位元素的百分比計算的區別

          絕對定位元素的寬高百分比是相對于臨近的position不為static的祖先元素的paddingbox來計算的。
          
          非絕對定位元素的寬高百分比則是相對于父元素的contentbox來計算的。

          24.簡單介紹使用圖片 base64 編碼的優點和缺點。

          base64編碼是一種圖片處理格式,通過特定的算法將圖片編碼成一長串字符串,在頁面上顯示的時候,可以用該字符串來代替圖片的
          url屬性。
          
          使用base64的優點是:
          
          (1)減少一個圖片的HTTP請求
          
          使用base64的缺點是:
          
          (1)根據base64的編碼原理,編碼后的大小會比原文件大小大1/3,如果把大圖片編碼到html/css中,不僅會造成文件體
          積的增加,影響文件的加載速度,還會增加瀏覽器對html或css文件解析渲染的時間。
          
          (2)使用base64無法直接緩存,要緩存只能緩存包含base64的文件,比如HTML或者CSS,這相比域直接緩存圖片的效果要
          差很多。
          
          (3)兼容性的問題,ie8以前的瀏覽器不支持。
          
          一般一些網站的小圖標可以使用base64圖片來引入。

          詳細資料可以參考:《玩轉圖片 base64 編碼》《前端開發中,使用 base64 圖片的弊端是什么?》《小 tip:base64:URL 背景圖片與 web 頁面性能優化》

          25.'display'、'position'和'float'的相互關系?

          (1)首先我們判斷display屬性是否為none,如果為none,則position和float屬性的值不影響元素最后的表現。
          
          (2)然后判斷position的值是否為absolute或者fixed,如果是,則float屬性失效,并且display的值應該被
          設置為table或者block,具體轉換需要看初始轉換值。
          
          (3)如果position的值不為absolute或者fixed,則判斷float屬性的值是否為none,如果不是,則display
          的值則按上面的規則轉換。注意,如果position的值為relative并且float屬性的值存在,則relative相對
          于浮動后的最終位置定位。
          
          (4)如果float的值為none,則判斷元素是否為根元素,如果是根元素則display屬性按照上面的規則轉換,如果不是,
          則保持指定的display屬性值不變。
          
          總的來說,可以把它看作是一個類似優先級的機制,"position:absolute"和"position:fixed"優先級最高,有它存在
          的時候,浮動不起作用,'display'的值也需要調整;其次,元素的'float'特性的值不是"none"的時候或者它是根元素
          的時候,調整'display'的值;最后,非根元素,并且非浮動元素,并且非絕對定位的元素,'display'特性值同設置值。
          

          詳細資料可以參考:《position 跟 display、margincollapse、overflow、float 這些特性相互疊加后會怎么樣?》

          26.margin 重疊問題的理解。

          相關知識點:

          塊級元素的上外邊距(margin-top)與下外邊距(margin-bottom)有時會合并為單個外邊距,這樣的現象稱為“margin合
          并”。
          
          產生折疊的必備條件:margin必須是鄰接的!
          
          而根據w3c規范,兩個margin是鄰接的必須滿足以下條件:
          
          ?必須是處于常規文檔流(非float和絕對定位)的塊級盒子,并且處于同一個BFC當中。
          ?沒有線盒,沒有空隙,沒有padding和border將他們分隔開
          ?都屬于垂直方向上相鄰的外邊距,可以是下面任意一種情況
          ?元素的margin-top與其第一個常規文檔流的子元素的margin-top
          ?元素的margin-bottom與其下一個常規文檔流的兄弟元素的margin-top
          ?height為auto的元素的margin-bottom與其最后一個常規文檔流的子元素的margin-bottom
          ?高度為0并且最小高度也為0,不包含常規文檔流的子元素,并且自身沒有建立新的BFC的元素的margin-top
          和margin-bottom
          
          
          margin合并的3種場景:
          
          (1)相鄰兄弟元素margin合并。
          
          解決辦法:
          ?設置塊狀格式化上下文元素(BFC)
          
          (2)父級和第一個/最后一個子元素的margin合并。
          
          解決辦法:
          
          對于margin-top合并,可以進行如下操作(滿足一個條件即可):
          ?父元素設置為塊狀格式化上下文元素;
          ?父元素設置border-top值;
          ?父元素設置padding-top值;
          ?父元素和第一個子元素之間添加內聯元素進行分隔。
          
          對于margin-bottom合并,可以進行如下操作(滿足一個條件即可):
          ?父元素設置為塊狀格式化上下文元素;
          ?父元素設置border-bottom值;
          ?父元素設置padding-bottom值;
          ?父元素和最后一個子元素之間添加內聯元素進行分隔;
          ?父元素設置height、min-height或max-height。
          
          (3)空塊級元素的margin合并。
          
          解決辦法:
          ?設置垂直方向的border;
          ?設置垂直方向的padding;
          ?里面添加內聯元素(直接Space鍵空格是沒用的);
          ?設置height或者min-height。

          回答:

          margin重疊指的是在垂直方向上,兩個相鄰元素的margin發生重疊的情況。
          
          一般來說可以分為四種情形:
          
          第一種是相鄰兄弟元素的marin-bottom和margin-top的值發生重疊。這種情況下我們可以通過設置其中一個元素為BFC
          來解決。
          
          第二種是父元素的margin-top和子元素的margin-top發生重疊。它們發生重疊是因為它們是相鄰的,所以我們可以通過這
          一點來解決這個問題。我們可以為父元素設置border-top、padding-top值來分隔它們,當然我們也可以將父元素設置為BFC
          來解決。
          
          第三種是高度為auto的父元素的margin-bottom和子元素的margin-bottom發生重疊。它們發生重疊一個是因為它們相
          鄰,一個是因為父元素的高度不固定。因此我們可以為父元素設置border-bottom、padding-bottom來分隔它們,也可以為
          父元素設置一個高度,max-height和min-height也能解決這個問題。當然將父元素設置為BFC是最簡單的方法。
          
          第四種情況,是沒有內容的元素,自身的margin-top和margin-bottom發生的重疊。我們可以通過為其設置border、pa
          dding或者高度來解決這個問題。

          27.對 BFC 規范(塊級格式化上下文:blockformattingcontext)的理解?

          相關知識點:

          塊格式化上下文(BlockFormattingContext,BFC)是Web頁面的可視化CSS渲染的一部分,是布局過程中生成塊級盒
          子的區域,也是浮動元素與其他元素的交互限定區域。
          
          通俗來講
          
          ?BFC是一個獨立的布局環境,可以理解為一個容器,在這個容器中按照一定規則進行物品擺放,并且不會影響其它環境中的物品。
          ?如果一個元素符合觸發BFC的條件,則BFC中的元素布局不受外部影響。
          
          創建BFC
          
          (1)根元素或包含根元素的元素
          (2)浮動元素float=left|right或inherit(≠none)
          (3)絕對定位元素position=absolute或fixed
          (4)display=inline-block|flex|inline-flex|table-cell或table-caption
          (5)overflow=hidden|auto或scroll(≠visible)
          

          回答:

          BFC指的是塊級格式化上下文,一個元素形成了BFC之后,那么它內部元素產生的布局不會影響到外部元素,外部元素的布局也
          不會影響到BFC中的內部元素。一個BFC就像是一個隔離區域,和其他區域互不影響。
          
          一般來說根元素是一個BFC區域,浮動和絕對定位的元素也會形成BFC,display屬性的值為inline-block、flex這些
          屬性時也會創建BFC。還有就是元素的overflow的值不為visible時都會創建BFC。

          詳細資料可以參考:《深入理解 BFC 和 MarginCollapse》《前端面試題-BFC(塊格式化上下文)》

          28.IFC 是什么?

          IFC指的是行級格式化上下文,它有這樣的一些布局規則:
          
          (1)行級上下文內部的盒子會在水平方向,一個接一個地放置。
          (2)當一行不夠的時候會自動切換到下一行。
          (3)行級上下文的高度由內部最高的內聯盒子的高度決定。

          詳細資料可以參考:

          《BFC 和 IFC 的理解(布局)》

          29.請解釋一下為什么需要清除浮動?清除浮動的方式

          浮動元素可以左右移動,直到遇到另一個浮動元素或者遇到它外邊緣的包含框。浮動框不屬于文檔流中的普通流,當元素浮動之后,
          不會影響塊級元素的布局,只會影響內聯元素布局。此時文檔流中的普通流就會表現得該浮動框不存在一樣的布局模式。當包含框
          的高度小于浮動框的時候,此時就會出現“高度塌陷”。
          
          清除浮動是為了清除使用浮動元素產生的影響。浮動的元素,高度會塌陷,而高度的塌陷使我們頁面后面的布局不能正常顯示。
          
          清除浮動的方式
          
          (1)使用clear屬性清除浮動。參考28。
          
          (2)使用BFC塊級格式化上下文來清除浮動。參考26。
          
          因為BFC元素不會影響外部元素的特點,所以BFC元素也可以用來清除浮動的影響,因為如果不清除,子元素浮動則父元
          素高度塌陷,必然會影響后面元素布局和定位,這顯然有違BFC元素的子元素不會影響外部元素的設定。

          30.使用 clear 屬性清除浮動的原理?

          使用clear屬性清除浮動,其語法如下:
          
          clear:none|left|right|both
          
          如果單看字面意思,clear:left應該是“清除左浮動”,clear:right應該是“清除右浮動”的意思,實際上,這種解釋是有問
          題的,因為浮動一直還在,并沒有清除。
          
          官方對clear屬性的解釋是:“元素盒子的邊不能和前面的浮動元素相鄰。”,我們對元素設置clear屬性是為了避免浮動元素
          對該元素的影響,而不是清除掉浮動。
          
          還需要注意的一點是clear屬性指的是元素盒子的邊不能和前面的浮動元素相鄰,注意這里“前面的”3個字,也就是clear屬
          性對“后面的”浮動元素是不聞不問的。考慮到float屬性要么是left,要么是right,不可能同時存在,同時由于clear
          屬性對“后面的”浮動元素不聞不問,因此,當clear:left有效的時候,clear:right必定無效,也就是此時clear:left
          等同于設置clear:both;同樣地,clear:right如果有效也是等同于設置clear:both。由此可見,clear:left和cle
          ar:right這兩個聲明就沒有任何使用的價值,至少在CSS世界中是如此,直接使用clear:both吧。
          
          一般使用偽元素的方式清除浮動
          
          .clear::after{
          content:'';
          display:table;//也可以是'block',或者是'list-item'
          clear:both;
          }
          
          clear屬性只有塊級元素才有效的,而::after等偽元素默認都是內聯水平,這就是借助偽元素清除浮動影響時需要設置disp
          lay屬性值的原因。

          31.zoom:1 的清除浮動原理?

          清除浮動,觸發hasLayout;
          zoom屬性是IE瀏覽器的專有屬性,它可以設置或檢索對象的縮放比例。解決ie下比較奇葩的bug。譬如外邊距(margin)
          的重疊,浮動清除,觸發ie的haslayout屬性等。
          
          來龍去脈大概如下:
          當設置了zoom的值之后,所設置的元素就會就會擴大或者縮小,高度寬度就會重新計算了,這里一旦改變zoom值時其實也會發
          生重新渲染,運用這個原理,也就解決了ie下子元素浮動時候父元素不隨著自動擴大的問題。
          
          zoom屬性是IE瀏覽器的專有屬性,火狐和老版本的webkit核心的瀏覽器都不支持這個屬性。然而,zoom現在已經被逐步標
          準化,出現在CSS3.0規范草案中。
          
          目前非ie由于不支持這個屬性,它們又是通過什么屬性來實現元素的縮放呢?可以通過css3里面的動畫屬性scale進行縮放。

          32.移動端的布局用過媒體查詢嗎?

          假設你現在正用一臺顯示設備來閱讀這篇文章,同時你也想把它投影到屏幕上,或者打印出來,而顯示設備、屏幕投影和打印等這些
          媒介都有自己的特點,CSS就是為文檔提供在不同媒介上展示的適配方法
          
          當媒體查詢為真時,相關的樣式表或樣式規則會按照正常的級聯規被應用。當媒體查詢返回假,標簽上帶有媒體查詢的樣式表仍將被
          下載(只不過不會被應用)。
          
          包含了一個媒體類型和至少一個使用寬度、高度和顏色等媒體屬性來限制樣式表范圍的表達式。CSS3加入的媒體查詢使得無需修改
          內容便可以使樣式應用于某些特定的設備范圍。

          詳細資料可以參考:《CSS3@media 查詢》《響應式布局和自適應布局詳解》

          33.使用 CSS 預處理器嗎?喜歡哪個?

          SASS(SASS、LESS沒有本質區別,只因為團隊前端都是用的SASS)

          34.CSS 優化、提高性能的方法有哪些?

          加載性能:
          
          (1)css壓縮:將寫好的css進行打包壓縮,可以減少很多的體積。
          (2)css單一樣式:當需要下邊距和左邊距的時候,很多時候選擇:margin:top0bottom0;但margin-bottom:bot
          tom;margin-left:left;執行的效率更高。
          (3)減少使用@import,而建議使用link,因為后者在頁面加載時一起加載,前者是等待頁面加載完成之后再進行加載。
          
          選擇器性能:
          
          (1)關鍵選擇器(keyselector)。選擇器的最后面的部分為關鍵選擇器(即用來匹配目標元素的部分)。CSS選擇符是從右到
          左進行匹配的。當使用后代選擇器的時候,瀏覽器會遍歷所有子元素來確定是否是指定的元素等等;
          
          (2)如果規則擁有ID選擇器作為其關鍵選擇器,則不要為規則增加標簽。過濾掉無關的規則(這樣樣式系統就不會浪費時間去匹
          配它們了)。
          
          (3)避免使用通配規則,如*{}計算次數驚人!只對需要用到的元素進行選擇。
          
          (4)盡量少的去對標簽進行選擇,而是用class。
          
          (5)盡量少的去使用后代選擇器,降低選擇器的權重值。后代選擇器的開銷是最高的,盡量將選擇器的深度降到最低,最高不要超過
          三層,更多的使用類來關聯每一個標簽元素。
          
          (6)了解哪些屬性是可以通過繼承而來的,然后避免對這些屬性重復指定規則。
          
          渲染性能:
          
          (1)慎重使用高性能屬性:浮動、定位。
          
          (2)盡量減少頁面重排、重繪。
          
          (3)去除空規則:{}。空規則的產生原因一般來說是為了預留樣式。去除這些空規則無疑能減少css文檔體積。
          
          (4)屬性值為0時,不加單位。
          
          (5)屬性值為浮動小數0.**,可以省略小數點之前的0。
          
          (6)標準化各種瀏覽器前綴:帶瀏覽器前綴的在前。標準屬性在后。
          
          (7)不使用@import前綴,它會影響css的加載速度。
          
          (8)選擇器優化嵌套,盡量避免層級過深。
          
          (9)css雪碧圖,同一頁面相近部分的小圖標,方便使用,減少頁面的請求次數,但是同時圖片本身會變大,使用時,優劣考慮清
          楚,再使用。
          
          (10)正確使用display的屬性,由于display的作用,某些樣式組合會無效,徒增樣式體積的同時也影響解析性能。
          
          (11)不濫用web字體。對于中文網站來說WebFonts可能很陌生,國外卻很流行。webfonts通常體積龐大,而且一些瀏
          覽器在下載webfonts時會阻塞頁面渲染損傷性能。
          
          可維護性、健壯性:
          
          (1)將具有相同屬性的樣式抽離出來,整合并通過class在頁面中進行使用,提高css的可維護性。
          (2)樣式與內容分離:將css代碼定義到外部css中。

          詳細資料可以參考:《CSS 優化、提高性能的方法有哪些?》《CSS 優化,提高性能的方法》

          35.瀏覽器是怎樣解析 CSS 選擇器的?

          樣式系統從關鍵選擇器開始匹配,然后左移查找規則選擇器的祖先元素。只要選擇器的子樹一直在工作,樣式系統就會持續左移,直
          到和規則匹配,或者是因為不匹配而放棄該規則。
          
          試想一下,如果采用從左至右的方式讀取CSS規則,那么大多數規則讀到最后(最右)才會發現是不匹配的,這樣做會費時耗能,
          最后有很多都是無用的;而如果采取從右向左的方式,那么只要發現最右邊選擇器不匹配,就可以直接舍棄了,避免了許多無效匹配。

          詳細資料可以參考:《探究 CSS 解析原理》

          36.在網頁中應該使用奇數還是偶數的字體?為什么呢?

          (1)偶數字號相對更容易和web設計的其他部分構成比例關系。比如:當我用了14px的正文字號,我可能會在一些地方用14
          ×0.5=7px的margin,在另一些地方用14×1.5=21px的標題字號。
          (2)瀏覽器緣故,低版本的瀏覽器ie6會把奇數字體強制轉化為偶數,即13px渲染為14px。
          (3)系統差別,早期的Windows里,中易宋體點陣只有12和14、15、16px,唯獨缺少13px。

          詳細資料可以參考:《談談網頁中使用奇數字體和偶數字體》《現在網頁設計中的為什么少有人用 11px、13px、15px 等奇數的字體?》

          37.margin 和 padding 分別適合什么場景使用?

          margin是用來隔開元素與元素的間距;padding是用來隔開元素與內容的間隔。
          margin用于布局分開元素使元素與元素互不相干。
          padding用于元素與內容之間的間隔,讓內容(文字)與(包裹)元素之間有一段距離。
          
          何時應當使用margin:
          ?需要在border外側添加空白時。
          ?空白處不需要背景(色)時。
          ?上下相連的兩個盒子之間的空白,需要相互抵消時。如15px+20px的margin,將得到20px的空白。
          
          何時應當時用padding:
          ?需要在border內測添加空白時。
          ?空白處需要背景(色)時。
          ?上下相連的兩個盒子之間的空白,希望等于兩者之和時。如15px+20px的padding,將得到35px的空白。

          38.抽離樣式模塊怎么寫,說出思路,有無實踐經驗?[阿里航旅的面試題]

          我的理解是把常用的css樣式單獨做成css文件……通用的和業務相關的分離出來,通用的做成樣式模塊兒共享,業務相關的,放
          進業務相關的庫里面做成對應功能的模塊兒。

          詳細資料可以參考:《CSS 規范-分類方法》

          39.簡單說一下 css3 的 all 屬性。

          all屬性實際上是所有CSS屬性的縮寫,表示,所有的CSS屬性都怎樣怎樣,但是,不包括unicode-bidi和direction
          這兩個CSS屬性。支持三個CSS通用屬性值,initial,inherit,unset。
          
          initial是初始值的意思,也就是該元素元素都除了unicode-bidi和direction以外的CSS屬性都使用屬性的默認初始
          值。
          
          inherit是繼承的意思,也就是該元素除了unicode-bidi和direction以外的CSS屬性都繼承父元素的屬性值。
          
          unset是取消設置的意思,也就是當前元素瀏覽器或用戶設置的CSS忽略,然后如果是具有繼承特性的CSS,如color,則
          使用繼承值;如果是沒有繼承特性的CSS屬性,如background-color,則使用初始值。
          

          詳細資料可以參考:《簡單了解 CSS3 的 all 屬性》

          40.為什么不建議使用統配符初始化 css 樣式。

          采用*{pading:0;margin:0;}這樣的寫法好處是寫起來很簡單,但是是通配符,需要把所有的標簽都遍歷一遍,當網站較大時,
          樣式比較多,這樣寫就大大的加強了網站運行的負載,會使網站加載的時候需要很長一段時間,因此一般大型的網站都有分層次的一
          套初始化樣式。
          
          出于性能的考慮,并不是所有標簽都會有padding和margin,因此對常見的具有默認padding和margin的元素初始化即
          可,并不需使用通配符*來初始化。

          41.absolute 的 containingblock(包含塊)計算方式跟正常流有什么不同?

          (1)內聯元素也可以作為“包含塊”所在的元素;
          
          (2)“包含塊”所在的元素不是父塊級元素,而是最近的position不為static的祖先元素或根元素;
          
          (3)邊界是paddingbox而不是contentbox。

          42.對于 hasLayout 的理解?

          hasLayout是IE特有的一個屬性。很多的IE下的cssbug都與其息息相關。在IE中,一個元素要么自己對自身的內容進
          行計算大小和組織,要么依賴于父元素來計算尺寸和組織內容。當一個元素的hasLayout屬性值為true時,它負責對自己和可
          能的子孫元素進行尺寸計算和定位。雖然這意味著這個元素需要花更多的代價來維護自身和里面的內容,而不是依賴于祖先元素來完
          成這些工作。

          詳細資料可以參考:《CSS 基礎篇--CSS 中 IE 瀏覽器的 hasLayout,IE 低版本的 bug 根源》《CSS 魔法堂:hasLayout 原來是這樣的!》

          43.元素豎向的百分比設定是相對于容器的高度嗎?

          如果是height的話,是相對于包含塊的高度。
          
          如果是padding或者margin豎直方向的屬性則是相對于包含塊的寬度。

          44.全屏滾動的原理是什么?用到了 CSS 的哪些屬性?(待深入實踐)

          原理:有點類似于輪播,整體的元素一直排列下去,假設有5個需要展示的全屏頁面,那么高度是500%,只是展示100%,容器及容
          器內的頁面取當前可視區高度,同時容器的父級元素overflow屬性值設為hidden,通過更改容器可視區的位置來實現全
          屏滾動效果。主要是響應鼠標事件,頁面通過CSS的動畫效果,進行移動。
          
          overflow:hidden;transition:all1000msease;

          詳細資料可以參考:《js 實現網頁全屏切換(平滑過渡),鼠標滾動切換》《用 ES6 寫全屏滾動插件》

          45.什么是響應式設計?響應式設計的基本原理是什么?如何兼容低版本的 IE?(待深入了解)

          響應式網站設計是一個網站能夠兼容多個終端,而不是為每一個終端做一個特定的版本。基本原理是通過媒體查詢檢測不同的設備屏
          幕尺寸做處理。頁面頭部必須有meta聲明的viewport。

          詳細資料可以參考:《響應式布局原理》《響應式布局的實現方法和原理》

          46.視差滾動效果,如何給每頁做不同的動畫?(回到頂部,向下滑動要再次出現,和只出現一次分別怎么做?)

          視差滾動是指多層背景以不同的速度移動,形成立體的運動效果,帶來非常出色的視覺體驗。

          詳細資料可以參考:《如何實現視差滾動效果的網頁?》

          47.如何修改 chrome 記住密碼后自動填充表單的黃色背景?

          chrome表單自動填充后,input文本框的背景會變成黃色的,通過審查元素可以看到這是由于chrome會默認給自動填充的in
          put表單加上input:-webkit-autofill私有屬性,然后對其賦予以下樣式:
          
          {
          background-color:rgb(250,255,189)!important;
          background-image:none!important;
          color:rgb(0,0,0)!important;
          }
          
          對chrome默認定義的background-color,background-image,color使用important是不能提高其優先級的,但是
          其他屬性可使用。
          
          使用足夠大的純色內陰影來覆蓋input輸入框的黃色背景,處理如下
          
          input:-webkit-autofill,textarea:-webkit-autofill,select:-webkit-autofill{
          -webkit-box-shadow:000px1000pxwhiteinset;
          border:1pxsolid#CCC!important;
          }
          

          詳細資料可以參考:《去掉 chrome 記住密碼后的默認填充樣式》《修改谷歌瀏覽器 chrome 記住密碼后自動填充表單的黃色背景》

          48.怎么讓 Chrome 支持小于 12px 的文字?

          在谷歌下css設置字體大小為12px及以下時,顯示都是一樣大小,都是默認12px。
          
          解決辦法:
          
          (1)可以使用Webkit的內核的-webkit-text-size-adjust的私有CSS屬性來解決,只要加了-webkit-text-size
          -adjust:none;字體大小就不受限制了。但是chrome更新到27版本之后就不可以用了。所以高版本chrome谷歌瀏覽器
          已經不再支持-webkit-text-size-adjust樣式,所以要使用時候慎用。
          
          (2)還可以使用css3的transform縮放屬性-webkit-transform:scale(0.5);注意-webkit-transform:scale(0.
          75);收縮的是整個元素的大小,這時候,如果是內聯元素,必須要將內聯元素轉換成塊元素,可以使用display:block/
          inline-block/...;
          
          (3)使用圖片:如果是內容固定不變情況下,使用將小于12px文字內容切出做圖片,這樣不影響兼容也不影響美觀。

          詳細資料可以參考:《谷歌瀏覽器不支持 CSS 設置小于 12px 的文字怎么辦?》

          49.讓頁面里的字體變清晰,變細用 CSS 怎么做?

          webkit內核的私有屬性:-webkit-font-smoothing,用于字體抗鋸齒,使用后字體看起來會更清晰舒服。
          
          在MacOS測試環境下面設置-webkit-font-smoothing:antialiased;但是這個屬性僅僅是面向MacOS,其他操作系統設
          置后無效。

          詳細資料可以參考:《讓字體變的更清晰 CSS 中-webkit-font-smoothing》

          50.font-style 屬性中 italic 和 oblique 的區別?

          italic和oblique這兩個關鍵字都表示“斜體”的意思。
          
          它們的區別在于,italic是使用當前字體的斜體字體,而oblique只是單純地讓文字傾斜。如果當前字體沒有對應的斜體字體,
          則退而求其次,解析為oblique,也就是單純形狀傾斜。

          51.設備像素、css 像素、設備獨立像素、dpr、ppi 之間的區別?

          設備像素指的是物理像素,一般手機的分辨率指的就是設備像素,一個設備的設備像素是不可變的。
          
          css像素和設備獨立像素是等價的,不管在何種分辨率的設備上,css像素的大小應該是一致的,css像素是一個相對單位,它是相
          對于設備像素的,一個css像素的大小取決于頁面縮放程度和dpr的大小。
          
          dpr指的是設備像素和設備獨立像素的比值,一般的pc屏幕,dpr=1。在iphone4時,蘋果推出了retina屏幕,它的dpr
          為2。屏幕的縮放會改變dpr的值。
          
          ppi指的是每英寸的物理像素的密度,ppi越大,屏幕的分辨率越大。

          詳細資料可以參考:《什么是物理像素、虛擬像素、邏輯像素、設備像素,什么又是 PPI,DPI,DPR 和 DIP》《前端工程師需要明白的「像素」》《CSS 像素、物理像素、邏輯像素、設備像素比、PPI、Viewport》《前端開發中像素的概念》

          52.layoutviewport、visualviewport 和 idealviewport 的區別?

          相關知識點:

          如果把移動設備上瀏覽器的可視區域設為viewport的話,某些網站就會因為viewport太窄而顯示錯亂,所以這些瀏覽器就決定
          默認情況下把viewport設為一個較寬的值,比如980px,這樣的話即使是那些為桌面設計的網站也能在移動瀏覽器上正常顯示了。
          ppk把這個瀏覽器默認的viewport叫做layoutviewport。
          
          layoutviewport的寬度是大于瀏覽器可視區域的寬度的,所以我們還需要一個viewport來代表瀏覽器可視區域的大小,ppk把
          這個viewport叫做visualviewport。
          
          idealviewport是最適合移動設備的viewport,idealviewport的寬度等于移動設備的屏幕寬度,只要在css中把某一元
          素的寬度設為idealviewport的寬度(單位用px),那么這個元素的寬度就是設備屏幕的寬度了,也就是寬度為100%的效果。i
          dealviewport的意義在于,無論在何種分辨率的屏幕下,那些針對idealviewport而設計的網站,不需要用戶手動縮放,也
          不需要出現橫向滾動條,都可以完美的呈現給用戶。

          回答:

          移動端一共需要理解三個viewport的概念的理解。
          
          第一個視口是布局視口,在移動端顯示網頁時,由于移動端的屏幕尺寸比較小,如果網頁使用移動端的屏幕尺寸進行布局的話,那么整
          個頁面的布局都會顯示錯亂。所以移動端瀏覽器提供了一個layoutviewport布局視口的概念,使用這個視口來對頁面進行布局展
          示,一般layoutviewport的大小為980px,因此頁面布局不會有太大的變化,我們可以通過拖動和縮放來查看到這個頁面。
          
          第二個視口指的是視覺視口,visualviewport指的是移動設備上我們可見的區域的視口大小,一般為屏幕的分辨率的大小。visu
          alviewport和layoutviewport的關系,就像是我們通過窗戶看外面的風景,視覺視口就是窗戶,而外面的風景就是布局視口
          中的網頁內容。
          
          第三個視口是理想視口,由于layoutviewport一般比visualviewport要大,所以想要看到整個頁面必須通過拖動和縮放才
          能實現。所以又提出了idealviewport的概念,idealviewport下用戶不用縮放和滾動條就能夠查看到整個頁面,并且頁面在
          不同分辨率下顯示的內容大小相同。idealviewport其實就是通過修改layoutviewport的大小,讓它等于設備的寬度,這個
          寬度可以理解為是設備獨立像素,因此根據idealviewport設計的頁面,在不同分辨率的屏幕下,顯示應該相同。

          詳細資料可以參考:

          《移動前端開發之 viewport 的深入理解》

          《說說移動前端中 viewport(視口)》

          《移動端適配知識你到底知多少》

          推薦

          筆者再次墻裂推薦收藏這篇原文,轉載于 CavsZhouyou - 前端面試復習筆記,這個倉庫是原作者校招時的前端復習筆記,主要總結一些比較重要的知識點和前端面試問題,希望對大家有所幫助。

          最后如果文章和筆記能帶您一絲幫助或者啟發,請不要吝嗇你的贊和收藏,你的肯定是我前進的最大動力

          還未完結,后續53-104個知識點,敬請關注

          轉載鏈接:https://github.com/CavsZhouyou/Front-End-Interview-Notebook/blob/master/Css/Css.md

          1. 使用XHTML格式寫代碼,并定義好DOCTYPE,因為這個會影響CSS的處理

          2. div 的垂直居中問題

          vertical-align:middle;將行距增加到和整個DIV一樣高(line-height:100px;),然后插入文字,就能垂直居中了。

          缺點:需要控制內容不換行

          3. margin 加倍問題

          設置為float的div在IE下設置的margin會加倍,這是IE6的BUG。

          解決:在此DIV上加入:display:inline;

          4. 浮動IE產生雙倍距離

          #box{float:left;width:100px;margin:0 0 0 100px;}

          此情況下IE會產生200px的距離 display:inline;-->使浮動忽略

          Tips:

          block與inline的區別:

          block:總是在新行上開始、高度、寬度、行高、邊距都可以控制(塊元素)

          inline:和其它元素在同一行上,不可控制(內嵌元素)

          #box{display:block;} --> 可以為內嵌元素模擬為塊元素

          #box{display:inline;} --> 實現同一行排列的效果

          #box{display:table;} -->

          5. IE 寬度與高度的問題

          IE不認min-*這個定義,但實際上它把正常的width和height當作有min的情況來處理。

          如果只用寬度和高度,正常的瀏覽器這兩個值都不會變

          如果只用min-width和min-height,則IE下面就沒有設置寬度和高度

          解決:

          #box{width:80px;height:35px;}

          改為:

          #box{width:auto;height:auto;min-width:80px;min-height:35px;}

          6. 頁面的最小寬度

          min-width指定最小寬度,可以保證排版正確性。但IE不認識,解決如下:

          把div放到body下,并給指定如下的樣式:

          #container{min-width:600px;width:expression(document.body.clientWidth < 600 ? '600px' : 'auto');}

          Tips: 第二個width使用了js來判斷,不太規范

          7. DIV浮動IE文本產生3像素的BUG

          左邊對象浮動,右邊采用外補丁的左邊距來定位,右邊對象內的文本會離左邊有3px的間距

          #box{float:left;width:800px;}

          #left{float:left;width:50%;}

          #right{width:50%;}

          *html #left{margin-right:3px;} // 關鍵

          <div id='box'>

          <div id='left'></div>

          <div id='right'></div>

          </div>

          8. IE 捉迷藏問題

          當DIV應用復雜的時候每個欄中又有一些鏈接,IE會出問題:有些內容顯示不出來,但鼠標選擇這個區域的時候,內容又是有的

          解決:設置line-height或者給固定高度和寬度

          9. 無法定義1px左右的高度的容器

          解決:overflow:hidden; / zoom:0.08; / line-height:1px;

          10. 讓層顯示在 FLASH 之上

          給flash設置透明: <param name='wmode' value='transparent'/>

          11. 定位一個層垂直居中于瀏覽器中

          技巧: 百分比絕對定位與外補丁負值。Tips: 負值的大小為自身寬度高度除以2

          參考樣式:

          <style type="text/css">

          div {

          position: absolute;

          top: 50%;

          left: 50%;

          margin: -100px 0 0 -100px;

          width: 200px;

          height: 100px;

          border: solid 1px #F00;

          }

          </style>

          12. DIV 居中問題

          div設置margin-left:auto;margin-right:auto;時已居中,但IE不認,需要在body中居中,即在父級元素中定義text-align:center;

          即:在父級元素內的內容居中

          13. a標簽加邊框與背景色

          需要設置其為 display:block;且設置float:left;來保證不換行

          14. 鏈接訪問過hover樣式就不出現了

          解決:改變屬性的排序-> L -> V -> H -> A

          參考樣式:

          <style type="text/css">

          a:link{}

          a:visited{}

          a:hover{}

          a:active{}

          </style>

          15. cursor

          cursor:pointer;兼容IE與FF,但hand僅在IE有用

          16. ul的margin與padding

          ul在FF中默認有padding值,而在IE中只有margin有值,所以需要預先就定義ul{margin:0;padding:0;}

          17. form標簽

          在IE中,form會有邊距,而FF中margin則為0;

          解決: form{margin:0;padding:0;}

          18. 實在沒有解決了,可以使用 !important 配置

          )CSS簡介

          CSS:層疊樣式表(Cascading Style Sheets)其作用就是美化HTML頁面;一般經常設置的CSS屬性比如文字或元素的顏色 color背景顏色 background-color背景圖像 background-image 字體 font-family 文字大小 font-size 列表樣式 list 鼠標樣式 cursor 邊框樣式 border 外邊距 margin 等...

          CSS由選擇器和聲明塊組成;其選擇器有多種形式比如標簽,類,Id等選擇器;對單個屬性和值要用冒號隔開如果是多個屬性時需要使用分號將所有的屬性和值分開等

          設置標簽樣式;

          注意:設置字體時一定要設置為絕大多數客戶端都有的字體類型

          2)CSS嵌入網頁的方式

          2.1鏈入外部的樣式表文件,其樣式文件的擴展名為.css

          2.2頁面內嵌,一般寫在<head>標簽內部的<style type="text/css"></style>標簽內

          2.3元素內聯(行內樣式),一般寫在元素的style屬性中

          注意:樣式的屬性會被繼承或覆蓋,其樣式屬性應用的優先順序為:內聯>內嵌>外部

          <!DOCTYPE html>
          <html>
          <head>
              <link href="1.css" rel="stylesheet" />
              <title>層疊樣式表</title>
              <style type="text/css">
                  h6 {
                      color: blue;
                      font-size: 10px;
                  }
              </style>
          </head>
          <body>
              <h6 style="color:red;font-size:30px;">虎年快樂</h6>
          </body>
          </html>

          三種嵌入樣式表方式

          頁面嵌入CSS樣式表的規范(推薦):

          1)把盡可能多的樣式寫到單獨的css文件中,以便于復用(相當于C#中的方法)

          2)如果是頁面特有的樣式就寫在<style>中

          3)如果是元素特有的樣式就寫在元素的style屬性中

          CSS樣式表的套用規則:嵌入方式的規則不變(內聯>內嵌>外部),在此基礎上不同級別(選擇器)的樣式,子級元素會覆蓋父級及以上的樣式;有些特有的樣式還存在瀏覽器兼容性問題,不再測試說明

          CSS樣式內容太多想自學的可以去搜索類似"W3School"的網站或者下載"W3School離線手冊.chm"


          主站蜘蛛池模板: 国产激情一区二区三区在线观看| 狠狠色成人一区二区三区| 日韩有码一区二区| 亚洲熟女少妇一区二区| 久久中文字幕无码一区二区| 国产在线精品一区二区在线观看 | 麻豆视频一区二区三区| 亚洲色偷偷偷网站色偷一区| 亚洲福利视频一区二区| 美女AV一区二区三区| 精品一区二区三区免费毛片| 日本一区二区免费看| 亚洲一区欧洲一区| 怡红院一区二区在线观看| 国产aⅴ精品一区二区三区久久 | 成人一区二区三区视频在线观看| 亚洲av无码一区二区三区不卡| 久久久久国产一区二区| 爆乳熟妇一区二区三区| 无码人妻精品一区二区蜜桃百度| 人妻夜夜爽天天爽爽一区| 一区二区乱子伦在线播放| 国产午夜精品一区二区三区小说 | 精品久久国产一区二区三区香蕉 | 久久精品国内一区二区三区| 亚洲天堂一区二区三区| 亚洲av无码一区二区乱子伦as| 久久精品国产亚洲一区二区三区| 免费无码一区二区三区| 色欲AV无码一区二区三区| 天美传媒一区二区三区| 动漫精品一区二区三区3d| 无遮挡免费一区二区三区| 激情综合丝袜美女一区二区| 日韩精品一区二区三区在线观看 | 波多野结衣在线观看一区| 视频一区二区三区在线观看| 亚洲视频在线一区二区| 国产午夜福利精品一区二区三区| 无码国产精品一区二区免费3p| 97人妻无码一区二区精品免费|