在理解BFC是什么之前,需要了解Box、Formatting Context的概念
Box是CSS布局的對象和基本單位,直觀點來說,就是一個頁面是由很多個Box組成的。元素的類型和display屬性,決定了這個Box的類型。不同類型的Box,會參與不同的Formatting Context(一個決定如何渲染文檔的容器),因此Box內的元素會以不同的方式渲染。盒子分類:
block-level box:display屬性為block, list-item, table的元素,會生成block-level box。并且參與block formatting context;
inline-level box:display屬性為inline, inline-block, inline-table的元素,會生成inline-level box。并且參與inline formatting context;
run-in box:display屬性為run-in的元素,根據上下文決定對象是內聯對象還是塊級對象。CSS3屬性!
Formatting Context是W3C CSS2.1規范中的一個概念。它是頁面中的一塊渲染區域,并且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。最常見的Formatting Context有Block Formatting Context(BFC)和Inline Formatting Context(IFC)。
BFC(Block Formatting Context)塊級格式化上下文,它是一個的渲染區域,只有Block-level box參與,它規定了內部的Block-level Box如何布局,并且與這個區域外部毫不相干。
內部的Box會在垂直方向,一個接一個地放置
Box垂直方向的距離由margin決定,屬于同一個BFC的兩個相鄰Box的margin會發生重疊
每個元素的margin box的左邊,與包含塊border box的左邊相接觸(對于從左往右的格式化,否則相反)
BFC的區域不會與float box重疊
BFC就是頁面上的一個隔離的容器,容器里面的子元素不會影響到外面的元素。反之也如此
計算BFC的高度時,浮動元素也參與計算
根元素
float屬性不為none
position為absolute或fixed
display為inline-block, table-cell, table-caption, flex, inline-flex
overflow不為visible
每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對于從左往右的格式化,否則相反)。即使存在浮動也是如此。
因此,雖然存在浮動的元素aside,但main的左邊依然會與包含塊的左邊相接觸
BFC的區域不會與float box重疊
我們可以通過通過觸發main生成BFC, 來實現自適應兩欄布局:
.main { height: 200px; background-color: #fcc; overflow: hidden; }
當觸發main生成BFC后,這個新的BFC不會與浮動的aside重疊。因此會根據包含塊的寬度,和aside的寬度,自動變窄。效果如下:
計算BFC的高度時,浮動元素也參與計算
為達到清除內部浮動,我們可以觸發par生成BFC,那么par在計算高度時,par內部的浮動元素child也會參與計算
.par { border: 5px solid #fcc; width: 300px; overflow: hidden; }
heihei
gagaga
兩個p之間的距離為100px,發生了margin重疊
Box垂直方向的距離由margin決定。屬于同一個BFC的兩個相鄰Box的margin會發生重疊margin重疊規則:* 兩個相鄰的外邊距都是正數時,折疊結果是它們兩者之間較大的值* 兩個相鄰的外邊距都是負數時,折疊結果是兩者絕對值的較大值* 兩個外邊距一正一負時,折疊結果是兩者的相加的和
我們可以在p外面包裹一層容器,并觸發該容器生成一個BFC。那么兩個P便不屬于同一個BFC,就不會發生margin重疊了
heihei
gagaga
BFC就是頁面上的一個隔離的容器,容器里面的子元素不會影響到外面的元素。反之也如此!
因為BFC內部的元素和外部的元素絕對不會互相影響,因此, 當BFC外部存在浮動時,它不應該影響BFC內部Box的布局,BFC會通過變窄,而不與浮動有重疊。同樣的,當BFC內部有浮動時,為了不影響外部元素的布局,BFC計算高度時會包括浮動的高度。避免margin重疊也是這樣的一個道理。
前端精選文摘:BFC 神奇背后的原理
我對BFC的理解
談外margin collapsing(外邊距疊加)
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com