塊格式化上下文(Block Formatting Context,BFC)是Web頁面的可視化CSS渲染的一部分,是佈局過程當中生成塊級盒子的區域,也是浮動元素與其餘元素的交互限定區域。
問題舉例:如上左圖所示,容器(container)沒有高度或者 height = auto ,而且其子元素(sibling)是浮動元素,因此該容器的高度是不會被撐開的,即高度塌陷。css
解決方法:在容器(container)中建立 BFC。html
HTML前端
<div class="container"> <div class="Sibling"></div> <div class="Sibling"></div> </div>
CSSweb
.container { overflow: hidden; /* creates block formatting context */ background-color: green; } .container .Sibling { float: left; margin: 10px; background-color: lightgreen; }
特別提示:面試
相鄰的兩個盒子(多是兄弟關係也多是祖先關係)的垂直邊距相遇時, 它們將造成一個外邊距。這個外邊距的高度等於兩個發生摺疊的外邊距的高度中的較大者。segmentfault
HTML佈局
<div class="Container"> <p>Sibling 1</p> <p>Sibling 2</p> </div>
CSSflex
.Container { background-color: red; overflow: hidden; /* creates a block formatting context */ } p { background-color: lightgreen; margin: 10px 0; }
如上圖所示:紅色盒子(Container)中包含兩個綠色的兄弟元素(P),而且紅色盒子設置 overflow: hidden; 則一個BFC 已經被建立,即致使外邊距摺疊。spa
理論上兩個兄弟元素之間的邊距應該是兩個元素的邊距之和(20px),但實際是 10px。這就是外邊距摺疊致使的。3d
2.1 摺疊外邊距的值
2.2 外邊距摺疊的條件是 margin 必須相鄰!
這一聽起來可能有些困惑,由於咱們在前面討論了 BFC 致使外邊距摺疊的問題。但咱們必須記住的是外邊距摺疊(Margin collapsing)只會發生在屬於同一BFC的塊級元素之間。若是它們屬於不一樣的 BFC,它們之間的外邊距則不會摺疊。因此經過建立一個不一樣的 BFC ,就能夠避免外邊距摺疊。
修改前面的例子並添加第三個兄弟元素,CSS不變。
HTML
<div class="Container"> <p>Sibling 1</p> <p>Sibling 2</p> <p>Sibling 3</p> </div>
結果不會改變,還會摺疊外邊距,三個兄弟元素(P)將會以垂直距離爲 10px 的距離分開。緣由是三個兄弟元素都屬於同一個 BFC。
建立一個不一樣的 BFC ,就能夠避免外邊距摺疊。
HTML
<div class="Container"> <p>Sibling 1</p> <p>Sibling 2</p> <div class="newBFC"> <p>Sibling 3</p> </div> </div>
CSS
.Container { background-color: red; overflow: hidden; /* creates a block formatting context */ } p { background-color: lightgreen; margin: 10px 0; } .newBFC { overflow: hidden; /* creates new block formatting context */ }
當第二和第三個兄弟元素屬於不一樣的 BFC 時,它們之間就沒有外邊距摺疊。