一、什么是BFC?
1.BFC的概念
BFC全稱Block Formatting Context ,直譯“塊級格式化上下文”,也有譯作“塊級格式化范圍”。它是 W3C CSS 2.1 規范中的一個概念,它決定了元素如何對其內容進行定位,以及與其他元素的關系和相互作用。通俗的講,就是一個div內部,我們用float和margin布局元素。
2.BFC布局規則
- 內部的Box會在垂直方向,一個接一個地放置。
- Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊
- 每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,否則相反)。即使存在浮動也是如此。
- BFC的區域不會與float box重疊。
- BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此。
- 計算BFC的高度時,浮動元素也參與計算
二、怎么產生BFC?
- 根元素
- float屬性不為none
- position為absolute或fixed
- display為inline-block, table-cell, table-caption, flex, inline-flex
- overflow不為visible
三、BFC的作用及原理
1.自適應布局
<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, 來實現自適應兩欄布局。
當觸發main生成BFC后,這個新的BFC不會與浮動的aside重疊。因此會根據包含塊的寬度,和aside的寬度,自動變窄。效果如下:

2.清除內部浮動
<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也會參與計算。
代碼:
.par { overflow: hidden; }
效果如下:

3. 防止垂直 margin 重疊
<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重疊了。
代碼:
<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內部Box的布局,BFC會通過變窄,而不與浮動有重疊。同樣的,當BFC內部有浮動時,為了不影響外部元素的布局,BFC計算高度時會包括浮動的高度。避免margin重疊也是這樣的一個道理。
摘抄自:
http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html
參考文章:
http://www.zhangxinxu.com/wordpress/2015/02/css-deep-understand-flow-bfc-column-two-auto-layout/
http://www.w3cplus.com/css/understanding-bfc-and-margin-collapse.html
http://cssor.com/css-bfc-block-formatting-context.html
http://www.haorooms.com/post/css_BFC_bgdiv
http://caibaojian.com/bfc.html
