1. 程式人生 > >【轉】前端精選文摘:BFC 神奇背後的原理

【轉】前端精選文摘:BFC 神奇背後的原理

level r12 get com 不同類 absolute position 方向 增加

BFC 已經是一個耳聽熟聞的詞語了,網上有許多關於 BFC 的文章,介紹了如何觸發 BFC 以及 BFC 的一些用處(如清浮動,防止 margin 重疊等)。雖然我知道如何利用 BFC 解決這些問題,但當別人問我 BFC 是什麽,我還是不能很有底氣地解釋清楚。於是這兩天仔細閱讀了CSS2.1 spec 和許多文章來全面地理解BFC。

一、BFC是什麽?

  在解釋 BFC 是什麽之前,需要先介紹 Box、Formatting Context的概念。

  Box: CSS布局的基本單位

  Box 是 CSS 布局的對象和基本單位, 直觀點來說,就是一個頁面是由很多個 Box 組成的。元素的類型和 display 屬性,決定了這個 Box 的類型。 不同類型的 Box, 會參與不同的 Formatting Context(一個決定如何渲染文檔的容器),因此Box內的元素會以不同的方式渲染。讓我們看看有哪些盒子:

  • block-level box:display 屬性為 block, list-item, table 的元素,會生成 block-level box。並且參與 block fomatting context;
  • inline-level box:display 屬性為 inline, inline-block, inline-table 的元素,會生成 inline-level box。並且參與 inline formatting context;
  • run-in box: css3 中才有, 這兒先不講了。

  Formatting context

  Formatting context 是 W3C CSS2.1 規範中的一個概念。它是頁面中的一塊渲染區域,並且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。最常見的 Formatting context 有 Block fomatting context (簡稱BFC)和 Inline formatting context (簡稱IFC)。

  CSS2.1 中只有 BFC IFC, CSS3 中還增加了 GFC FFC。

  BFC 定義

  BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block-level box參與, 它規定了內部的Block-level Box如何布局,並且與這個區域外部毫不相幹。

  BFC布局規則:

  1. 內部的Box會在垂直方向,一個接一個地放置。
  2. Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊
  3. 每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。
  4. BFC的區域不會與float box重疊。
  5. BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。反之也如此。
  6. 計算BFC的高度時,浮動元素也參與計算

二、哪些元素會生成BFC?

  1. 根元素
  2. float屬性不為none
  3. position為absolute或fixed
  4. display為inline-block, table-cell, table-caption, flex, inline-flex
  5. overflow不為visible

三、BFC的作用及原理

  1. 自適應兩欄布局

  代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <style> body { width: 300px; position: relative; } .aside { width: 100px; height: 150px; float: left; background: #f66; } .main { height: 200px; background: #fcc; } </style> <body> <div class="aside"></div> <div class="main"></div> </body>

  頁面:
  技術分享圖片

  根據BFC布局規則第3條:

每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。

  因此,雖然存在浮動的元素aslide,但main的左邊依然會與包含塊的左邊相接觸。

  根據BFC布局規則第四條:

BFC的區域不會與float box重疊。

  我們可以通過通過觸發main生成BFC, 來實現自適應兩欄布局。

1 2 3 .main { overflow: hidden; }

  當觸發main生成BFC後,這個新的BFC不會與浮動的aside重疊。因此會根據包含塊的寬度,和aside的寬度,自動變窄。效果如下:

  技術分享圖片

  2. 清除內部浮動

  代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <style> .par { border: 5px solid #fcc; width: 300px; } .child { border: 5px solid #f66; width:100px; height: 100px; float: left; } </style> <body> <div class="par"> <div class="child"></div> <div class="child"></div> </div> </body>

  頁面:
  技術分享圖片

  根據BFC布局規則第六條:

計算BFC的高度時,浮動元素也參與計算

  為達到清除內部浮動,我們可以觸發par生成BFC,那麽par在計算高度時,par內部的浮動元素child也會參與計算。

  代碼:

1 2 3 .par { overflow: hidden; }

  效果如下:
  技術分享圖片 ?

  3. 防止垂直 margin 重疊

  代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 <style> p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align:center; margin: 100px; } </style> <body> <p>Haha</p> <p>Hehe</p> </body>

  頁面:
  技術分享圖片

  兩個p之間的距離為100px,發送了margin重疊。
  根據BFC布局規則第二條:

Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊

  我們可以在p外面包裹一層容器,並觸發該容器生成一個BFC。那麽兩個P便不屬於同一個BFC,就不會發生margin重疊了。
  代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <style> .wrap { overflow: hidden; } p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align:center; margin: 100px; } </style> <body> <p>Haha</p> <div class="wrap"> <p>Hehe</p> </div> </body>

  效果如下:
  技術分享圖片

總結

  其實以上的幾個例子都體現了BFC布局規則第五條:

BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。反之也如此。

  因為BFC內部的元素和外部的元素絕對不會互相影響,因此, 當BFC外部存在浮動時,它不應該影響BFC內部Box的布局,BFC會通過變窄,而不與浮動有重疊。同樣的,當BFC內部有浮動時,為了不影響外部元素的布局,BFC計算高度時會包括浮動的高度。避免margin重疊也是這樣的一個道理。

您可能感興趣的相關文章
  • 使用 CSS3 實現超炫的加載動畫效果
  • 你想不到的!CSS 實現的各種球體效果
  • 精心挑選的在線 CSS3 代碼生成工具
  • 推薦10個特別方便的 CSS3 開發工具
  • 推薦收集的40款優秀的免費 CSS 工具

原文來自:前端文摘:BFC 神奇背後的原理 via Melon Space

【轉】前端精選文摘:BFC 神奇背後的原理