1. 程式人生 > >淺析CSS裡的 BFC 和 IFC

淺析CSS裡的 BFC 和 IFC

前言

之前一直聽到有人提到 CSS裡的BFC,正巧在 IFE的練習裡遇到了外邊距摺疊的問題,所以正好弄清楚BFC的機制。

一 什麼是 BFC

和之前所有博文一樣,還是先從What的角度開始介紹,由淺入深的理解BFC。 所謂的 Formatting context(格式化上下文), 它是 W3C CSS2.1 規範中的一個概念。

它是頁面中的一塊渲染區域,並且有一套渲染規則. 它決定了其子元素將如何定位,以及和其他元素的關係和相互作用。

而 Block Formatting Contexts (BFC,塊級格式化上下文),就是 一個塊級元素 的渲染顯示規則。通俗一點講,可以把 BFC 理解為一個封閉的大箱子,,容器裡面的子元素不會影響到外面的元素,反之也如此。

BFC的佈局規則如下: 1 內部的盒子會在垂直方向,一個個地放置; 2 BFC是頁面上的一個隔離的獨立容器; 3 屬於同一個BFC的 兩個相鄰Box的 上下margin會發生重疊 ; 4 計算BFC的高度時,浮動元素也參與計算 5 每個元素的左邊,與包含的盒子的左邊相接觸,即使存在浮動也是如此; 6 BFC的區域不會與float重疊;

那麼如何觸發 BFC呢?只要元素滿足下面任一條件即可觸發 BFC 特性:

  • body 根元素;

  • 浮動元素:float 不為none的屬性值;

  • 絕對定位元素:position (absolute、fixed)

  • display為: inline-block、table-cells、flex

  • overflow 除了visible以外的值 (hidden、auto、scroll)

二 BFC的特性及應用

接下來介紹BFC常見的特性和應用,這一部分 在解釋原因時,會用到上文的佈局規則 和 觸發條件,所以需要注意一下。

1 兩個 相鄰的普通流中的 塊元素垂直方向上的 margin會摺疊

  1. <head>

  2. .p {  

  3.  width:200px;  

  4.  height:50px;  

  5.  margin:50px 0;  

  6.  background-color:red;  

  7. }  

  8. </head>

  9. <body>

  10. <divclass="p"></div>

  11. <divclass

    ="p"></div>

  12. </body>

效果圖是:640?wx_fmt=jpeg

根據BFC規則的第3條:

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

上文的例子 之所以發生外邊距摺疊,是因為他們 同屬於 body這個根元素, 所以我們需要讓 它們 不屬於同一個BFC,就能避免外邊距摺疊:

  1. <divclass="p"></div>

  2. <divclass="wrap">

  3. <divclass="p"></div>

  4. </div>

  1. .wrap {

  2.  overflow:hidden;

  3. .p {

  4.  width:200px;

  5.  height:50px;

  6.  margin:50px0;

  7.  background-color:red;

效果圖是:640?wx_fmt=jpeg

2 BFC可以包含浮動的元素(清除浮動)

正常情況下,浮動的元素會脫離普通文件流,所以下面的程式碼裡:

  1. <divstyle="border:1px solid #000;">

  2. <divstyle="width:50px; height:50px; background:#eee;

  3. float: left;">

  4. </div>

  5. </div>

外層的div會無法包含 內部浮動的div,效果見下圖:640?wx_fmt=jpeg

但如果我們 觸發外部容器的BFC,根據BFC規範中的第4條:計算BFC的高度時,浮動元素也參與計算,那麼外部div容器就可以包裹著浮動元素,所以只要把程式碼修改如下:

  1. <divstyle="border:1px solid #000;overflow: hidden">

  2. <divstyle="width:100px;height:100px;background:#eee;float: left;"></div>

  3. </div>

就可以完成以下效果:640?wx_fmt=jpeg

3 BFC可以阻止元素被浮動元素覆蓋

先看一個例子:

  1. <divclass="aside"></div>

  2. <divclass="main"></div>

  3. div {  

  4.  width:300px;  

  5. }  

  6. .aside {  

  7.  width: 100px;  

  8.  height: 150px;  

  9.  float: left;  

  10.  background: black;  

  11. }  

  12. .main {  

  13.  height:200px;  

  14.  background-color:red;  

  15. }  

效果圖是:640?wx_fmt=jpeg之所以是這樣,是因為上文的 規則5: 每個元素的左邊,與包含的盒子的左邊相接觸,即使存在浮動也是如此;

所以要想改變效果,使其互補干擾,就得利用規則6 :BFC的區域不會與float重疊, 讓 <divclass="main"> 也能觸發BFC的性質,即:

  1. .main {

  2.  overflow:hidden;

  3.  height:200px;

  4.  background-color:red;

  5. }

通過這種方法,就能 用來實現 兩列的自適應佈局。

三 簡要介紹IFC

IFC佈局規則:

  1. 框會從包含塊的頂部開始,一個接一個地水平擺放。

  2. 擺放這些框時,它們在水平方向的 內外邊距+邊框 所佔用的空間都會被考慮; 在垂直方向上,這些框可能會以不同形式來對齊: 水平的margin、padding、border有效,垂直無效。不能指定寬高;

  3. 行框的寬度是 由包含塊和存在的浮動來決定; 行框的高度 由行高來決定

原文:https://segmentfault.com/a/1190000012993668

640?wx_fmt=png