之前一直聽到有人提到 CSS裡的BFC,正巧在 IFE的練習裡遇到了外邊距摺疊的問題,所以正好弄清楚BFC的機制。 (參考來源 見文末的 Reference)
本文主要和大家介紹CSS裡的BFC和IFC的用法的相關資料,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能協助到大家。
一 什麼是 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會摺疊
<head>.p { width:200px; height:50px; margin:50px 0; background-color:red; } </head><body> <p class="p"></p> <p class="p"></p> </body>
是:
根據BFC規則的第3條:
盒子垂直方向的距離由margin決定,
屬於 同一個BFC的 + 兩個相鄰Box的 + 上下margin 會發生重疊。
上文的例子 之所以發生外邊距摺疊,是因為他們 同屬於 body這個根項目, 所以我們需要讓 它們 不屬於同一個BFC,就能避免外邊距摺疊:
<p class="p"></p> <p class="wrap"> <p class="p"></p> </p>
.wrap { overflow:hidden; .p { width:200px; height:50px; margin:50px 0; background-color:red;
是:
2 BFC可以包含浮動的元素(清除浮動)
正常情況下,浮動的元素會脫離普通文檔流,所以下面的代碼裡:
<p style="border: 1px solid #000;"> <p style="width: 50px; height: 50px; background: #eee; float: left;"> </p></p>
外層的p會無法包含 內部浮動的p,效果見:
但如果我們 觸發外部容器的BFC,根據BFC規範中的第4條:計算BFC的高度時,浮動元素也參與計算,那麼外部p容器就可以包裹著浮動元素,所以只要把代碼修改如下:
<p style="border: 1px solid #000;overflow: hidden"> <p style="width: 100px;height: 100px;background: #eee;float: left;"></p></p>
就可以完成以下效果:
3 BFC可以阻止元素被浮動元素覆蓋
先看一個例子:
<p class="aside"></p> <p class="main"></p> p { width:300px; } .aside { width: 100px; height: 150px; float: left; background: black; } .main { height:200px; background-color:red; }
是:
之所以是這樣,是因為上文的 規則5: 每個元素的左邊,與包含的盒子的左邊相接觸,即使存在浮動也是如此;
所以要想改變效果,使其互補幹擾,就得利用規則6 :BFC的地區不會與float重疊,讓 <p class="main"> 也能觸發BFC的性質,即:
.main { overflow:hidden; height:200px; background-color:red; }
通過這種方法,就能 用來實現 兩列的調適型配置。
三 簡要介紹IFC
IFC布局規則:
1 框會從包含塊的頂部開始,一個接一個地水平擺放。
2 擺放這些框時,它們在水平方向的 內外邊距+邊框 所佔用的空間都會被考慮;在垂直方向上,這些框可能會以不同形式來對齊:水平的margin、padding、border有效,垂直無效。不能指定寬高;
3 行框的寬度是 由包含塊和存在的浮動來決定;行框的高度 由行高來決定。