在講 BFC 以前,咱們先來了解一下常見的定位方案,定位方案是控制元素的佈局,有三種常見方案:css
在普通流中,元素按照其在 HTML 中的前後位置至上而下佈局,在這個過程當中,行內元素水平排列,直到當行被佔滿而後換行,塊級元素則會被渲染爲完整的一個新行,除非另外指定,不然全部元素默認都是普通流定位,也能夠說,普通流中元素的位置由該元素在 HTML 文檔中的位置決定。
在浮動佈局中,元素首先按照普通流的位置出現,而後根據浮動的方向儘量的向左邊或右邊偏移,其效果與印刷排版中的文本環繞類似。
在絕對定位佈局中,元素會總體脫離普通流,所以絕對定位元素不會對其兄弟元素形成影響,而元素具體的位置由絕對定位的座標決定。
Formatting context(格式化上下文) 是 W3C CSS2.1 規範中的一個概念。它是頁面中的一塊渲染區域,而且有一套渲染規則,它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。html
那麼 BFC 是什麼呢? 佈局
BFC 即 Block Formatting Contexts (塊級格式化上下文),它屬於上述定位方案的普通流。 flex
**具備 BFC 特性的元素能夠看做是隔離了的獨立容器,容器裏面的元素不會在佈局上影響到外面的元素,而且 BFC 具備普通容器所沒有的一些特性。
**spa
通俗一點來說,能夠把 BFC 理解爲一個封閉的大箱子,箱子內部的元素不管如何翻江倒海,都不會影響到外部。3d
只要元素知足下面任一條件便可觸發 BFC 特性:code
1. 同一個 BFC 下外邊距會發生摺疊orm
<head> div{ width: 100px; height: 100px; background: lightblue; margin: 100px; } </head> <body> <div></div> <div></div> </body>
從效果上看,由於兩個 div 元素都處於同一個 BFC 容器下 (這裏指 body 元素) 因此第一個 div 的下邊距和第二個 div 的上邊距發生了重疊,因此兩個盒子之間距離只有 100px,而不是 200px。htm
首先這不是 CSS 的 bug,咱們能夠理解爲一種規範,若是想要避免外邊距的重疊,能夠將其放在不一樣的 BFC 容器中。blog
<div class="container"> <p></p> </div> <div class="container"> <p></p> </div>
.container { overflow: hidden; } p { width: 100px; height: 100px; background: lightblue; margin: 100px; }
這時候,兩個盒子邊距就變成了 200px
2. BFC 能夠包含浮動的元素(清除浮動)
咱們都知道,浮動的元素會脫離普通文檔流,來看下下面一個例子
<div style="border: 1px solid #000;"> <div style="width: 100px;height: 100px;background: #eee;float: left;"></div> </div>
因爲容器內元素浮動,脫離了文檔流,因此容器只剩下 2px 的邊距高度。若是使觸發容器的 BFC,那麼容器將會包裹着浮動元素。
<div style="border: 1px solid #000;overflow: hidden"> <div style="width: 100px;height: 100px;background: #eee;float: left;"></div> </div>
效果如圖:
3. BFC 能夠阻止元素被浮動元素覆蓋
先來看一個文字環繞效果:
<div style="height: 100px;width: 100px;float: left;background: lightblue">我是一個左浮動的元素</div> <div style="width: 200px; height: 200px;background: #eee">我是一個沒有設置浮動, 也沒有觸發 BFC 元素, width: 200px; height:200px; background: #eee;</div>
這時候其實第二個元素有部分被浮動元素所覆蓋,(可是文本信息不會被浮動元素所覆蓋) 若是想避免元素被覆蓋,可觸第二個元素的 BFC 特性,在第二個元素中加入overflow: hidden,就會變成:
這個方法能夠用來實現兩列自適應佈局,效果不錯,這時候左邊的寬度固定,右邊的內容自適應寬度(去掉上面右邊內容的寬度)。