走進BFC

在解釋 BFC 是什麼以前,須要先介紹 Box、Formatting Context的概念。css

Box: CSS佈局的基本單位

  Box 是 CSS 佈局的對象和基本單位, 直觀點來講,就是一個頁面是由不少個 Box 組成的。元素的類型和 display 屬性,決定了這個 Box 的類型。 不一樣類型的 Box, 會參與不一樣的 Formatting Context(一個決定如何渲染文檔的容器),所以Box內的元素會以不一樣的方式渲染。讓咱們看看有哪些盒子:html

  • block-level box:display 屬性爲 block, list-item, table 的元素,會生成 block-level box。而且參與 block fomatting context;
  • inline-level box:display 屬性爲 inline, inline-block, inline-table 的元素,會生成 inline-level box。而且參與 inline formatting context;
  • run-in box: css3 中才有,見的很少, 這兒先不講了。

Formatting context

  Formatting context 是 W3C CSS2.1 規範中的一個概念。它是頁面中的一塊渲染區域,而且有一套渲染規則,它決定了其子元素將如何定位,以及和其餘元素的關係和相互做用。最多見的 Formatting context 有 Block fomatting context (簡稱BFC)和 Inline formatting context (簡稱IFC)。css3

  CSS2.1 中只有 BFC 和 IFC, CSS3 中還增長了 GFC 和 FFC。ide

BFC定義

BFC 定義:BFC(Block formatting context)直譯爲"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block-level box參與, 它規定了內部的Block-level Box如何佈局,而且與這個區域外部絕不相干。佈局

簡單點,說話的方式簡單點...BFC就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素。反之也如此spa

哪些屬性產生BFC

BFC佈局特性

 

驗證特性:code

特性1:BFC針對display爲block的塊級元素,因此是垂直排列的BOX。

特性2:處於同一個BFC中的元素相互影響,可能發生外邊距重疊;若是這倆個相鄰的塊不屬於同一個塊級格式化上下文,那麼它們的外邊距就不會重疊。

<div class="div1" style="width: 100px;height: 100px;background-color:blue;margin-bottom: 100px;"></div>
<div class="div2" style="width: 100px;height: 100px;background-color:red;margin-top: 50px;"></div>
<br>
<div style="overflow:hidden;">
	<div class="div1" style="width: 100px;height: 100px;background-color:blue;margin-bottom: 100px;"></div>
</div>
<div class="div2" style="width: 100px;height: 100px;background-color:red;margin-top: 50px;"></div>

 <br>前的.div1和.div2處在同一個BFC中,所以會在垂直方向發生margin重疊(水平方向永遠不會發生的)。orm

 <br>後的.div1和.div2處在倆個不一樣的BFC中,所以沒有發生margin重疊。htm

特性3:每一個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對於從左往右的格式化,不然相反)。即便存在浮動也是如此。

 1 <style>
 2         body {
 3             width: 300px;
 4             position: relative;
 5         }
 6         .aside {
 7             width: 100px;
 8             height: 150px;
 9             float: left;
10             background: #f00;
11         }
12         .main {
13             //overflow: hidden;   不是BFC時
14             height: 200px;
15             background: #00f;
16         }
17 </style>
18     </head>
19     <body>
20         <div class="aside"></div>
21         <div class="main"></div>
22     </body>

特性6:BFC的區域不會與float box重疊。

承接特性3的驗證,加上註釋部分,使.main變成BFC,立竿見影的效果以下圖:對象

以上特性均驗證了一點(特性4): BFC就是頁面上的一個隔離的獨立容器,把內部子元素包裹起來,使其不會影響到外面的元素。反之也如此。

BFC應用

一、防止margin重疊,應用特性2

處於同一個BFC中的元素相互影響,可能發生外邊距重疊;若是這倆個相鄰的塊不屬於同一個塊級格式化上下文,那麼它們的外邊距就不會重疊

二、清除浮動:應用特性四、5

三、同時,使用float/position+margin,結合BFC的特性,靈活建立多欄佈局,應用特性6

 

參考文章:

http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html

http://www.cnblogs.com/dojo-lzz/p/3999013.html

相關文章
相關標籤/搜索