CSS知識點面試總結

rennn發表於2020-02-24

一、盒子模型

1.標準盒子模型和IE盒子模型

  • **標準(W3C)盒子模型:**內容content+填充padding+邊框border+邊界margin

​ 寬高指的是 content 的寬高

  • **低版本IE盒子模型:**內容(content+padding+border)+ 邊界margin,

​ 寬高指的是 content+padding+border 部分的寬高

2.CSS如何設定這兩種模型

box-sizing : content-box  
box-sizing : border-box
複製程式碼

3.JS如何設定獲取盒子模型對應的寬和高

dom.style.width/height;//設定獲取的是內聯樣式
dom.currentStyle.width/height;//只有IE支援
window.getComputedStyle(dom).width/height;//相容性好
dom.getBoundingClientRect().width/height;//適用場所:計算一個元素的絕對位置
複製程式碼

4.margin塌陷/margin重疊

標準文件流中,豎直方向的margin不疊加,只取較大的值作為margin(水平方向的margin是可以疊加的,即水平方向沒有塌陷現象)。

PS:如果不在標準流,比如盒子都浮動了,那麼兩個盒子之間是沒有margin重疊的現象的。

  • 兄弟元素之間

    豎直方向的margin不疊加,以較大的為準

  • 父子元素之間

    margin這個屬性,本質上描述的是兄弟和兄弟之間的距離; 最好不要用這個marign表達父子之間的距離。

    所以,如果要表達父子之間的距離,我們一定要善於使用父親的padding,而不是兒子的margin。

5.BFC

BFC 即 Block Formatting Contexts (塊級格式化上下文),它屬於上述定位方案的普通流。

具有 BFC 特性的元素可以看作是隔離了的獨立容器,容器裡面的元素不會在佈局上影響到外面的元素,並且 BFC 具有普通容器所沒有的一些特性。

通俗一點來講,可以把 BFC 理解為一個封閉的大箱子,箱子內部的元素無論如何翻江倒海,都不會影響到外部。

1.如何生成BFC

只要元素滿足下面任一條件即可觸發 BFC 特性:

  • body 根元素
  • 浮動元素:float 除 none 以外的值
  • 絕對定位元素:position (absolute、fixed)
  • display 為 inline-block、table-cells、flex
  • overflow 除了 visible 以外的值 (hidden、auto、scroll)【最常用】

2.BFC的原理/BFC的佈局規則

  • BFC 內部的子元素,在垂直方向,邊距會發生重疊
  • BFC在頁面中是獨立的容器,外面的元素不會影響裡面的元素,反之亦然。(稍後看舉例1
  • BFC區域不與旁邊的float box區域重疊。(可以用來清除浮動帶來的影響)。(稍後看舉例2
  • 計算BFC的高度時,浮動的子元素也參與計算。(稍後看舉例3

3.BFC的應用

  • 解決margin重疊

    當父元素和子元素髮生 margin 重疊時,解決辦法:給子元素或父元素建立BFC

  • BFC區域不與float區域重疊

  • 清除浮動

參考連結:CSS盒模型及BFC

10 分鐘理解 BFC 原理

二、選擇器

1.常用CSS選擇器

  • id選擇器(#myid)
  • 類選擇器(.myclass)
  • 標籤選擇器(div, h1,p)
  • 萬用字元選擇器(*)
  • 相鄰選擇器(h1 + p)
  • 子選擇器(ul > li)
  • 後代選擇器(li a)
  • 屬性選擇器(a[rel="external"])
  • 偽類選擇器(:link, :visited, :active , :hover, :before, :after)

2.CSS3新增偽類

  • :first-child 匹配父元素中第一個子元素
  • :last-child 匹配父元素中最後一個子元素
  • :nth-child() 匹配父元素中第n個子元素(n可以是一個數字,一個關鍵字,或者一個公式)
    • 引數n時選中所有行
    • 引數為n+i時表示從第i行開始下面的都被選中,如n+3,從第3行開始下面全部選中
    • 引數為-n+i時表示選中前i個元素,如-n+6表示選中前6個
    • 2n表示2的倍數行被選中,選中偶數行
    • 2n+1表示選中奇數行
    • 3n表示每個3行選中一次
    • odd表示奇數,even表示偶數
  • :nth-last-child(n) 匹配倒數第n個同級兄弟元素
  • :nth-of-type(n) 匹配同型別中的第n個同級兄弟元素
  • :root 根元素
  • :not(selector)

三、樣式

1.優先順序計算規則

  • 最近的祖先樣式比其他祖先樣式優先順序高
  • "直接樣式"比"祖先樣式"優先順序高
  • 內聯樣式 > ID 選擇器 (權重100)> 類選擇器 (權重10)= 屬性選擇器 = 偽類選擇器 > 標籤選擇器 (權重1)= 偽元素選擇器
  • !important 擁有最高優先順序

2.HTML中引入CSS的方式

  • 內聯方式:直接在 HTML 標籤中的 style 屬性中新增 CSS

    <div style="background: red"></div>

  • 嵌入方式:在 HTML 頭部中的 <style> 標籤下書寫 CSS 程式碼

    <head>
        <style>
    
        .content {
            background: red;
        }
    
        </style>
    </head>
    複製程式碼
  • 連結方式:使用 HTML 頭部的<head>標籤引入外部的 CSS 檔案

    <head>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    複製程式碼
  • 匯入方式指的是使用 CSS 規則引入外部 CSS 檔案

    <style>
        @import url(style.css);
    </style>
    複製程式碼

比較連結方式和匯入方式(link和@import的區別)

  1. link屬於html標籤,除了引入css樣式以外還可以定義RSS等其他事物,@import是css提供的,只能引入css
  2. lilnk在頁面載入的時候會同時載入,@import引用的css要等頁面載入結束後再載入
  3. link是html標籤,沒有相容性,@import只有ie5以上才能識別

3.常見單位

  • px:絕對單位,頁面按精確畫素展示

  • em:相對單位,基準點為父節點字型的大小,如果自身定義了font-size按自身來計算(瀏覽器預設字型是16px),整個頁面內1em不是一個固定的值

  • rem:相對單位,可理解為”root em”, 相對根節點html的字型大小來計算,CSS3新加屬性,chrome/firefox/IE9+支援

  • vw:viewpoint width,視窗寬度,1vw等於視窗寬度的1%

  • vh:viewpoint height,視窗高度,1vh等於視窗高度的1%

  • vmin:vw和vh中較小的那個

  • vmax:vw和vh中較大的那個

  • %:百分比

四、字型

1.如何使用自定義字型

通過@font-face新增樣式

支援的字型檔案型別:

  • EOT
  • OTF
  • TTF
  • WOFF
  • WOFF2
@font-face {
  font-family: 'Open Sans';
  src: url('OpenSans-Regular.ttf') format('truetype');
}

#text-element {
  font-family: 'Open Sans', Arial, sans-serif;
}
複製程式碼

2.如何使用字型圖示

推薦:阿里巴巴圖示庫

  1. 找到網站,搜尋需要的圖示

  2. 將圖片加入購物車,點選頁面右上角的購物車按鈕,將所有圖示新增到自定義專案中。

  3. 在彈出的頁面中,點選下載至本地。

  4. 解壓下載後的資料夾,我們需要的是fonts資料夾style.css, 將這個檔案放入你的專案中,style.css檔案中引入了字型檔案,所以會有路徑,這個時候你在使用的時候要注意路徑問題,程式碼如下:(這裡的多種字型檔案是為了相容瀏覽器)

    @font-face {  font-family: 'icomoon';  src:  url('../fonts/icomoon.eot?snsrp8');  src:  url('../fonts/icomoon.eot?snsrp8#iefix') format('embedded-opentype'),    url('../fonts/icomoon.ttf?snsrp8') format('truetype'),    url('../fonts/icomoon.woff?snsrp8') format('woff'),    url('../fonts/icomoon.svg?snsrp8#icomoon') format('svg');  font-weight: normal;  font-style: normal;}
    
    複製程式碼
  5. 在頁面中,我們只要給一個元素新增相應的類名就行,因為在style.css中已經將類名對應的圖示寫好了。

    .icon-account:before {
    content: "\e900";
    }
    .icon-caifu:before {
    content: "\e901";
    }
    .icon-edit:before {
    content: "\e902";
    }
    複製程式碼
    <span class="icon-account"></span>
    複製程式碼

3.讓頁面裡的字型變清晰,變細用CSS怎麼做?

-webkit-font-smoothing在window系統下沒有起作用,

但是在IOS裝置上起作用-webkit-font-smoothing:antialiased是最佳的,灰度平滑

五、文字屬性

1.多行文字省略

text-overflow:ellipsis

使用text-overflow時需要滿足:

  1. 塊級元素
  2. overflow:hidden(非visible)
  3. width:具體值(max-width,flex也可)
  4. white-space:nowrap|pre;(不折行)

2.CSS有哪些屬性可以繼承?

  1. 字型系列屬性:如font,font-family,font-size,font-weight,font-style
  2. 文字系列屬性:如color,text-indent(文字縮排),text-align(文字水平對齊),line-height,word-spacing(字間隔)
  3. 元素可見性:visibility
  4. 表格佈局屬性:caption-side、border-collapse、border-spacing、empty-cells、table-layout
  5. 列表屬性:list-style-type、list-style-image、list-style-position、list-style
  6. cursor

參考連結:css有哪些屬性可以繼承

六、基本視覺格式化

1.display有哪些值

  • inline(預設)–內聯
  • none–隱藏
    • block–塊顯示
    • table–表格顯示
    • list-item–專案列表
    • inline-block-內聯塊
    • flex
    • grid-網格佈局

2.display:inline-block產生間距解決方法

  • 為什麼產生間距?

    歸根結底這是一個西文排版的問題。舉一個很簡單的例子:

    I am very happy

    南京市長江大橋歡迎您

    英文有空格作為詞分界,而中文則沒有。(這背後延伸出一箇中文分詞的問題)

    這個問題的原因可以上述到SGML(標準通用標記語言)和TeX(排版工具),它實際上是一個行內(inline)的問題,它由空格、換行或回車所產生空白符所致

  • 解決方法

    • 改變書寫方式:去掉html中的空格
    • 在父容器使用 font-size:0
    • 使用margin負值
    • 使用word-spacing或letter-spacing

3.display:none 與 visibility:hidden 的區別是什麼?

  • 是否佔據空間

    display:none,該元素不佔據任何空間,在文件渲染時,該元素如同不存在(但依然存在文件物件模型樹中)。 visibility:hidden,該元素空間依舊存在。 即一個(display:none)不會在渲染樹中出現,一個(visibility :hidden)會。

  • 是否渲染

    display:none,會觸發reflow(迴流),進行渲染。 visibility:hidden,只會觸發repaint(重繪),因為沒有發現位置變化,不進行渲染。

  • 是否是繼承屬性

    display:none,display不是繼承屬性,元素及其子元素都會消失。 visibility:hidden,visibility是繼承屬性,若子元素使用 visibility:visible,則不繼承,這個子孫元素又會顯現出來。

  • 讀屏器是否讀取

    讀屏器不會讀取display:none的元素內容,而會讀取visibility:hidden的元素內容。

4.visibility:collapse

  • 對於一般的元素,它的表現跟display:hidden是一樣的。

  • 但例外的是,如果這個元素是table相關的元素,例如table行,table group,table列,table column group,它的表現卻跟display: none一樣,也就是說,它們佔用的空間也會釋放。

在不同瀏覽器下的區別:

  • 在谷歌瀏覽器裡,使用collapse值和使用hidden值沒有什麼區別。
  • 在火狐瀏覽器、Opera和IE11裡,使用collapse值的效果就如它的字面意思:table的行會消失,它的下面一行會補充它的位置。

5.rgba和opacity透明有何不同?

  • rgba()只作用於元素自身的顏色或背景色,對元素的內容沒有影響。

  • opacity在作用於元素自身的顏色或背景色的同時,也作用於元素內的內容的透明度。

七、定位

1.position有哪些值

  • static:預設值。沒有定位,元素出現在正常的文件流中(忽略 top, bottom, left, right 或者 z-index 宣告)

  • relative:生成相對定位的元素,相對於其正常位置進行定位,不脫離文件流

  • absolute:生成絕對定位的元素,相對於 static 定位以外的第一個父元素進行定位

  • fixed:生成固定定位的元素,相對於瀏覽器視窗進行定位。(老IE不支援)

  • inherit:規定應該從父元素繼承 position 屬性的值

  • sticky:粘性定位,它主要用在對 scroll 事件的監聽上

2. 居中

絕對定位技巧:

定位參照物件的寬度 = left + right + margin-left + margin-right + 絕對定位元素的實際寬度

定位參照物件的高度 = top + bottom + margin-top + margin-bottom + 絕對定位元素的實際高度

1.1 如何居中div?

參考連結:blog.csdn.net/weixin_3758…

1.1.1 水平居中

  • 行內元素:父元素是塊級元素,給父元素設定text-align:center,父元素不是塊級元素,先將父元素設定為塊級元素,再給父元素設定text-align:center
  • 圖片:給圖片設定clear:both;display:block;margin:auto;
  • 塊級元素

​ 方案一:(1)寬度定,需要誰居中,就給誰設定margin:0 auto;

​ (2)寬度不定,預設子元素寬度與父元素寬度一樣,給子元素設定display:inline-block;display:inline,將其轉換成行內塊級元素/行內元素,給父元素設定text-align:center

​ 方案二:使用定位屬性

​ 子元素設定絕對定位,父元素設定相對定位,left:50%,margin-left:-子元素的寬度的一半(寬度定),或者transform:translateX(-50%)(寬度不定)

​ 方案三:使用flexbox佈局實現(寬度定不定都行)

​ 父元素設定display:flex;justify-content:center;

1.1.2 垂直居中

  • 單行的行內元素:設定 行高=父元素的高

  • 多行的行內元素:父元素設定display:table-cell;vertical-align:middle(行級、塊級、圖片都通殺)

  • 塊級元素:

    ​ 方案一:子元素設定絕對定位,父元素設定相對定位,子元素設定top:50%;``margin-top:-子元素高度的一半(高度定),transform:translateY(-50%);(高度不定)

    ​ 方案二:flex佈局,給父元素設定display:flex;align-items:center;(行級、塊級、圖片都通殺)

1.1.3 水平垂直居中

  • 已知高度和寬度的元素

    ​ 方案一:子元素設定絕對定位,父元素設定相對定位,子元素設定left:0;right:0;top:0;bottom:0;margin:auto;

    ​ 方案二:子元素設定絕對定位,父元素設定相對定位,子元素設定top:50%;left:50%(左上角垂直居中),margin-top:-子元素高的一半,margin-left:-子元素寬的一半

  • 未知高度和寬度的元素

    ​ 方案一:(定位屬性)子元素設定絕對定位,父元素設定相對定位,子元素設定top:50%;left:50%(左上角垂直居中),transform:translate(-50%,-50%)(根據自身定位實現偏移)

    ​ 方案二:(flex佈局)父元素定義display:flex;justify-content:center;align-items:center;

1.2 如何居中絕對定位的div?

1.3 如何居中一個浮動元素?

參考連結:segmentfault.com/a/119000001…

  • 水平居中

    • 定寬:relative + margin-left + left

    ​ 給浮動元素本身設定position:relative;left:50%;margin-left:-浮動元素寬的一半

    • 不定寬:父float + 父relative + 子relative

    ​ 給父元素清除浮動,設定float:left;,父元素設定position:relative;left:50%;,內部浮動元素設定position:relative;left:-50%;或right:50%;

    • 不管定寬還是不定寬:flex

      父元素設定display:flex;justify-content:center;

  • 垂直居中

    • 定高:(父relative + 子absolute + line-height) + top/bottom或margin-top
方式一:relative + absolute + line-height + top/bottom
   #outer {
      position: relative;
    }
    #inner {
      line-height:100px;
      position: absolute;
      top: 0;
      bottom: 0;
      margin: auto;
    }

方式二:relative + absolute + line-height + margin-top
#outer {
      position: relative;
}
#inner {
      line-height:100px;
      position: absolute;
      top: 50%;
      margin-top:-50px
}

<div id="outer" style="height:200px;">
  <div id="inner" style="float: left;height: 100px;">我是垂直居中的元素</div>
</div>
複製程式碼
    • 通用:flex
    #outer {
        display:flex;
        align-items:center;
    }
    
    <div id="outer" style="height:200px;">
      <div id="inner">我是垂直居中的元素</div>
    </div>
    複製程式碼
  • 水平垂直居中

    • flex
    • 子元素可以設定 mairgin 以及word-wrap:break-word; 方便效果

八、浮動

1.為什麼出現浮動

浮動的初衷,是實現類似word裡的文字環繞圖片的效果。

普通文件流,因為從上到下,從左到右,規定的太死了,每個元素都被限制了位置。所以才引入了浮動,形成豐富的頁面效果。

定位的引入,更加增強了,頁面佈局的可能。

2.浮動的工作原理

浮動元素脫離文件流,不佔據空間。浮動元素碰到包含它的邊框或者浮動元素的邊框停留。

3.浮動元素引起的問題

  • 父元素的高度無法被撐開,影響與父元素同級的元素

  • 與浮動元素同級的非浮動元素會跟隨其後

  • 若非第一個元素浮動,則該元素之前的元素也需要浮動,否則會影響頁面顯示的結構

4.清除浮動的方式

  • 父級div定義height

    • 原理:父級div手動定義height,就解決了父級div無法自動獲取到高度的問題

    • 優點:簡單,程式碼少,容易掌握

    • 缺點:只適合高度固定的佈局,要給出精確的高度,如果高度和父級div不一樣時,會產生問題

    • 建議:不推薦使用,只建議高度固定的佈局時使用

  • 額外標籤法

    • 原理:新增一個空div,利用css提高的clear:both清除浮動,讓父級div能自動獲取到高度
    • 優點:簡單,程式碼少,瀏覽器支援好,不容易出現怪問題
    • clear屬性只適用於塊級元素。這個辦法會增加額外的標籤使HTML結構看起來不夠簡潔。
    • 建議:不推薦使用,但此方法是以前主要使用的一種清除浮動方法
  • 父級 div 定義 overflow:hidden

    • 原理:必須定義width或zoom:1,同時不能定義height,使用overflow:hidden時,瀏覽器會自動檢查浮動區域的高度
    • 優點:簡單,程式碼少,瀏覽器支援好
    • 缺點:不能和position配合使用,因為超出的尺寸的會被隱藏
    • 建議:只推薦沒有使用position或對overflow:hidden理解比較深的朋友使用
  • 父級div定義偽類:after和zoom

    • 原理:IE8以上和非IE瀏覽器才支援:after,原理和方法2有點類似,zoom(IE專有屬性)可解決ie6,ie7浮動問題

    • 優點:瀏覽器支援好,不容易出現怪問題(目前:大型網站都有使用,如:騰迅,網易,新浪等等)

    • 缺點:程式碼多,不少初學者不理解原理,要兩句程式碼結合使用,才能讓主流瀏覽器都支援

    • 建議:推薦使用,建議定義公共類,以減少CSS程式碼

    .clearfix:after{
        content:"\0020"; //父元素結尾放一個空白符
        height:0; //讓這個空白字元不顯示出來
        display:block;
        clear:both; //確保這個空白字元是非浮動的獨立塊
    }
    .clearfix{
        zoom:1; //相容IE6
    }
    複製程式碼

5.設定元素浮動後,該元素的display值是多少?

自動變為display:block

九、Sass、Less、Stylus區別

1.什麼是CSS前處理器?

CSS前處理器是一種語言用來為CSS增加一些程式設計的特性,無需考慮瀏覽器相容問題,例如你可以在CSS中使用變數,簡單的程式邏輯、函式等在程式語言中的一些基本技巧,可以讓CSS更加簡潔,適應性更強,程式碼更直觀等諸多好處

2.區別

  • 基本語法區別

    • Sass是以.sass為副檔名,Less是以.less為副檔名,Stylus是以.styl為副檔名
  • 變數的區別

    • Sass 變數必須是以$開頭的,然後變數和值之間使用冒號(:)隔開,和css屬性是一樣的。

    • Less 變數是以@開頭的,其餘sass都是一樣的。

    • Stylus 對變數是沒有任何設定的,可以是以$開頭或者任意字元,而且變數之間可以冒號,空格隔開,但是在stylus中不能用@開頭

  • 三種前處理器都有:巢狀、運算子、顏色函式、匯入、繼承、混入。Stylus還有一些高階特性。例如迴圈、判斷等

十、flex佈局

1.基本概念

  • Flex佈局元素,稱為Flex容器,簡稱"容器"。它的所有子元素自動成為容器元素,簡稱"專案"。
  • 容器預設存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的排列方式:從左到右;交叉軸的排列方式:從上到下;

2.容器的屬性

1.flex-direction

屬性決定主軸的方向 (即專案的排列方式)

  • row 主軸水平方向,起點在左端
  • row-reverse 主軸水平方向,起點在末端
  • column 主軸垂直方向,起點在上沿
  • colunm-reverse 主軸垂直方向,起點在下沿

2.flex-wrap

  • nowrap 預設,不換行
  • wrap 換行,第一行在上面
  • wrap-reverse 換行,第一行在下面

3.flex-flow

是flex-direction 屬性和flex-wrap屬性的簡寫,預設值row、nowrap

4.justify-content

屬性定義了專案在主軸上的對齊方式

  • flex-start 預設值,左對齊
  • flex-end 右對齊
  • center 居中
  • space-between 兩端對齊,專案之間間隔相等
  • space-around 兩端間隔是中間專案的一半
  • space-evenly 專案之間間隔均分(包括與兩端的間隔)

5.align-items

定義專案交叉軸上如何對齊(單行)

  • flex-start 交叉軸起點對齊
  • flex-end 交叉軸終點對齊
  • center 垂直方向,居中對齊
  • baseline 專案第一行文字基線對齊
  • stretch 預設值,如果專案未設定高度或設為auto,將佔滿整個容器的高度

6.align-content

多行軸線對齊,用法痛align-items

3.專案的屬性

1.order

定義專案排列順序,數值越小越靠前,預設為0

2.flex-grow

定義專案放大比例,預設為0

3.flex-shrink

定義專案縮小比例,預設為1,如果空間不足則會縮小,值為0不能縮小

4.flex-basis

定義專案自身大小,預設auto

5.flex

屬性是flex-grow,flex-shrink ,flex-basis的簡寫,預設值為0、1、auto

6.align-self

專案自身對齊

十一、頁面佈局

參考連結:各種頁面常見佈局

頁面佈局

1.兩欄式佈局

1.1 左列定寬,右列自適應

1.2 左列自適應,右列定寬

1.3 一列不定,一列自適應

2.三欄式佈局

2.1 兩列定寬,一列自適應

2.2 兩側定寬,中間自適應

1.浮動

左側設定左浮動,右側設定右浮動即可,中間會自動地自適應。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            .layout article div{
                height:100px;
            }
            .layout.float .left{
                float:left;
                width:300px;
                background-color:red;
            }
            .layout.float .right{
                float:right;
                width:300px;
                background-color:blue;
            }
            .layout.float .center{
                background-color:green;
            }
        </style>
    </head>
    <body>
        <section class="layout float">
        	<article class="left-center-right">
            	<div class="left">
                    我是left
                </div>
                <div class="center">
                    我是center
                </div>
                <div class="right">
                    我是right
                </div>
            </article>
        </section>
    </body>
</html>
複製程式碼

2.絕對定位

左側設定為絕對定位, left:0px。右側設定為絕對定位, right:0px。中間設定為絕對定位,left 和right 都為300px,即可。中間的寬度會自適應。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            .layout article div{
                height:100px;
            }
             .layout.absolute .left-center-right {
            position: relative;
        }

        .layout.absolute .left {
            position: absolute;
            left: 0;
            width: 300px;
            background: red;
        }

        /* 【重要】中間的區域,左側定位300px,右側定位為300px,即可完成。寬度會自使用 */
        .layout.absolute .center {
            position: absolute;
            left: 300px;
            right: 300px;
            background: green;
        }

        .layout.absolute .right {
            position: absolute;
            right: 0;
            width: 300px;
            background: blue;
        }
        </style>
    </head>
    <body>
        <section class="layout absolute">
        	<article class="left-center-right">
            	<div class="left">
                    我是left
                </div>
                <div class="center">
                    我是center
                </div>
                <div class="right">
                    我是right
                </div>
            </article>
        </section>
    </body>
</html>
複製程式碼

3.flexbox佈局

將左中右所在的容器設定為display: flex,設定兩側的寬度後,然後讓中間的flex = 1,即可。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        html * {
            padding: 0;
            margin: 0;
        }

        .layout article div {
            height: 100px;
        }

        .left-center-right {
            display: flex;
        }

        .layout.flex .left {
            width: 300px;
            background: red;
        }

        .layout.flex .center {
            flex: 1;
            background: green;
        }

        .layout.flex .right {
            width: 300px;
            background: blue;
        }
    </style>

</head>

<body>
    <section class="layout flex">
        <article class="left-center-right">
            <div class="left">
                我是 left
            </div>
            <div class="center">
                <h1>flex佈局解決方案</h1>
                我是 center
            </div>
            <div class="right">
                我是 right
            </div>

        </article>
    </section>

</body>

</html>
複製程式碼

4.表格佈局

設定整個容器的寬度為100%,設定三個部分均為表格(display:table-cell),然後左邊的單元格為 300px,右邊的單元格為 300px,即可。中間的單元格會自適應。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        html * {
            padding: 0;
            margin: 0;
        }

        .layout.table div {
            height: 100px;
        }

        /* 重要:設定容器為表格佈局,寬度為100% */
        .layout.table .left-center-right {
            width: 100%;
            display: table;
            height: 100px;

        }

        .layout.table .left-center-right div {
            display: table-cell; /* 重要:設定三個模組為表格裡的單元*/
        }

        .layout.table .left {
            width: 300px;
            background: red;
        }

        .layout.table .center {
            background: green;
        }

        .layout.table .right {
            width: 300px;
            background: blue;
        }
    </style>

</head>

<body>
    <section class="layout table">
        <article class="left-center-right">
            <div class="left">
                我是 left
            </div>
            <div class="center">
                <h1>表格佈局解決方案</h1>
                我是 center
            </div>
            <div class="right">
                我是 right
            </div>

        </article>
    </section>

</body>

</html>
複製程式碼

5.網格佈局grid

設定容器為網格佈局,寬度為100%,設定網格為三列,並設定每列的寬度,即可。

方法1:浮動:

  • 優點:相容性好。
  • 缺點:浮動會脫離標準文件流,因此要清除浮動。我們解決好這個問題即可。

方法:2:絕對定位

  • 優點:快捷。
  • 缺點:導致子元素也脫離了標準文件流,可實用性差。

方法3:flex 佈局(CSS3中出現的)

  • 優點:解決上面兩個方法的不足,flex佈局比較完美。移動端基本用 flex佈局。

方法4:表格佈局

  • 優點:表格佈局在很多場景中很實用,相容性非常好。因為IE8不支援 flex,此時可以嘗試表格佈局
  • 缺點:因為三個部分都當成了單元格來對待,此時,如果中間的部分變高了,其會部分也會被迫調整高度。但是,在很多場景下,我們並不需要兩側的高度增高。

什麼時候用 flex 佈局 or 表格佈局,看具體的場景。二者沒有絕對的優勢,也沒有絕對的不足。

方法5:網格佈局

  • CSS3中引入的佈局,很好用。程式碼量簡化了很多。

PS:面試提到網格佈局,說明我們對新技術是有追求的。

延伸:如果題目中去掉高度已知

問題:題目中,如果去掉高度已知,我們往中間的模組裡塞很多內容,讓中間的模組撐開。會發生什麼變化?哪個佈局就不能用了?

分析:其實可以這樣理解,我們回去看上面的動畫效果,當中間的模組變得很擠時,會發生什麼效果?就是我們想要的答案。

答案是:flex 佈局和表格佈局可以通用,其他三個佈局都不能用了。

3.多列布局

3.1 等寬佈局

3.2 九宮格佈局

3.3 柵格系統

十二、CSS優化、提高效能的方法

  1. 避免過度約束

  2. 避免後代選擇符

  3. 避免鏈式選擇符

  4. 使用緊湊的語法

  5. 避免不必要的名稱空間

  6. 避免不必要的重複

  7. 最好使用表示語義的名字。一個好的類名應該是描述他是什麼而不是像什麼

  8. 避免!important,可以選擇其他選擇器

  9. 儘可能的精簡規則,你可以合併不同類裡的重複規則

  10. 修復解析錯誤

  11. 避免使用多類選擇符

  12. 移除空的css規則

  13. 正確使用display的屬性:由於display的作用,某些樣式組合會無效,徒增樣式體積的同時也影響解析效能。

  14. display:inline後不應該再使用width、height、margin、padding以及float。

  15. display:inline-block後不應該再使用float。

  16. display:block後不應該再使用vertical-align。

  17. display:table-*後不應該再使用margin或者float。

  18. 不濫用浮動:雖然浮動不可避免,但不可否認很多css bug是由於浮動而引起。

  19. 不濫用web字型

  20. 對於中文網站來說Web Fonts可能很陌生,國外卻很流行。web fonts通常體積龐大,而且一些瀏覽器在下載web fonts時會阻塞頁面渲染損傷效能。

  21. 不宣告過多的font-size:這是設計層面的問題,設計精良的頁面不會有過多的font-size宣告。

  22. 不在選擇符中使用ID識別符號,主要考慮到樣式重用性以及與頁面的耦合性。

  23. 不給h1~h6元素定義過多的樣式

  24. 全站統一定義一遍heading元素即可,若需額外定製樣式,可使用其他選擇符作為代替。

  25. 不重複定義h1~h6元素

  26. 值為0時不需要任何單位

  27. 標準化各種瀏覽器字首:通常將瀏覽器字首置於前面,將標準樣式屬性置於最後,類似:.foo{

  28.     -moz-border-radius: 5px;
        border-radius: 5px; 
    }複製程式碼
    複製程式碼
  29. 使用CSS漸變等高階特性,需指定所有瀏覽器的字首

  30. 避免讓選擇符看起來像正規表示式

  31. CSS3新增了一些類似~=等複雜屬性,也不是所有瀏覽器都支援,需謹慎使用。

  32. 遵守盒模型規則(Beware of broken box models)

十三、響應式設計

  • 響應式設計就是網站能夠相容多個終端,而不是為每個終端做一個特定的版本

  • 基本原理是利用CSS3媒體查詢,為不同尺寸的裝置適配不同樣式

  • 對於低版本的IE,可採用JS獲取螢幕寬度,然後通過resize方法來實現相容:

    $(window).resize(function () {
      screenRespond();
    });
    screenRespond();
    function screenRespond(){
    var screenWidth = $(window).width();
    if(screenWidth <= 1800){
      $("body").attr("class", "w1800");
    }
    if(screenWidth <= 1400){
      $("body").attr("class", "w1400");
    }
    if(screenWidth > 1800){
      $("body").attr("class", "");
    }
    }
    複製程式碼

相關文章