FC(formatting context)是CSS規範中的一個概念,指的是頁面佈局中的一塊渲染區域,在這塊區域內有一套渲染規則,用來決定其子元素如何佈局,以及與其餘元素之間的關係和相互做用。普通流中的每一個盒子都會參與到一個FC中,多是BFC,也多是IFC,但不可能便是BFC又是IFC。css
CSS2定義了兩種FC類型:BFC(Block formatting context)和IFC(Inline formatting context)。html
CSS3中又新增了兩種:GFC(grid formatting context)和FFC(flex formatting context)。瀏覽器
只有block-level元素參與的渲染區域,BFC規定並管理內部block-level元素的佈局方式。ide
BFC內的盒子均沿着垂直方向逐個排列。佈局
BFC內盒子之間的垂直距離由margin屬性決定,垂直方向上直接相鄰的margin會發生塌陷/合併(不存在padding和border),而且以最大的margin值做爲最終的margin值。flex
父子元素ui
<div style="display:inline-block; border: 1px dotted black;">
<div style="margin: 10px;">
<div style="margin: 15px; width: 100px; height: 50px; background-color: blue;"></div>
</div>
</div>
複製代碼
橙色框均表示元素的外邊距。圖1展現的是子元素的外邊距,圖2則是父元素的。 可見,父子元素相鄰的垂直外邊距出現合而且最終使用了較大的外邊距,而水平外邊距不存在重疊問題。 兄弟元素spa
<div style="border:1px solid black; width: 100px;">
<div style="margin: 10px; height: 50px; background-color: blue;"></div>
<div style="margin: 5px; height: 20px; background-color: blue;"></div>
</div>
複製代碼
外邊距相同的兄弟元素,相鄰的垂直外邊距發生了合併。圖中兄弟元素的垂直間距不是10px+10px,而是max(10px, 10px)。 空盒子3d
<div style="border: 1px solid black; width: 200px;">
<div style="margin: 10px;"></div>
</div>
複製代碼
空盒子的垂直margin直接相鄰,也會發生合併。 BFC內盒子的左外邊緣都會接觸包含塊的左邊緣(若是從右到左進行排版,那麼右邊發生接觸),即便存在浮動盒子也是如此。code
BFC的內容不會與浮動元素髮生重疊,且浮動元素也會參與BFC的高度計算。
BFC是一個隔離的獨立容器,容器裏面的子元素不會影響外面的元素,反過來也同樣。
<html>
知足上述任一條件便可在其內部產生BFC。(更多詳細的可參考MDN文檔)
根據BFC佈局規則: 同一個BFC內相鄰盒子之間的外邊距會發生合併。
建立新的BFC,不屬於同一個BFC的盒子不會出現外邊距合併。
<div style="border:1px solid black; width: 100px;">
<div style="margin: 10px; height: 50px; background-color: blue;"></div>
<!--建立新的BFC-->
<div style="overflow: hidden;">
<div style="margin: 10px; height: 20px; background-color: blue;"></div>
</div>
</div>
複製代碼
根據BFC佈局規則: BFC內浮動元素也會參與BFC的高度計算。
<div style="border: 2px solid black; width: 200px;">
<div style="float: left; width: 50px; height: 150px; background-color: red;">浮動</div>
<div style="height: 100px; background-color: blue;"></div>
</div>
複製代碼
在包含塊內存在一個浮動元素。浮動元素脫離文檔流存在,所以包含塊沒有辦法「掌握」整個浮動元素。一旦浮動元素的高度大於它旁邊的元素,那它會穿透包含塊。
經過設置overflow: hidden或display: inline-block等方式,在包含浮動元素的容器內建立BFC。BFC在計算高度的時候會將識別並計算浮動元素,效果至關於清除內部浮動。
<!--overflow: hidden-->
<div style="overflow: hidden;border: 2px solid black; width: 200px;">
<div style="float: left; width: 50px; height: 150px; background-color: red;">浮動</div>
<div style="height: 100px; background-color: blue;"></div>
</div>
複製代碼
根據BFC的佈局規則: BFC的內容不會與浮動元素髮生重疊。
<div style="overflow: hidden;border: 2px solid black; width: 200px;">
<div style="float: left; width: 50px; height: 100px; background-color: red;">浮動</div>
<div style="height: 100px; background-color: blue;">這是一段內容。</div>
</div>
複製代碼
BFC的內容環繞在浮動元素周圍,不會與其發生重疊,能夠經過這種方式實現自適應兩欄/多欄的佈局。
只有inline-level元素參與的渲染區域,IFC規定並管理inline-level元素的佈局方式。
根據IFC的佈局規則: 水平方向上,經過text-align改變對齊方式。
根據IFC的佈局規則: 垂直方向上,經過vertical-align改變對齊方式。
聲明display:grid/inline-grid能建立一個網格容器,網格容器會爲其內容產生GFC。
網格佈局引入了二維網格佈局系統,經過一組相交的水平線和垂直線來定義網格的列和行,網格元素被佈局到這些行和列相關的位置上。
參考網格佈局。
聲明display:flex/inline-flex能建立一個彈性容器,彈性容器會爲其內容產生FFC。
參考彈性佈局。
參考連接: