css布局的各種FC簡單介紹:BFC,IFC,GFC,FFC
什麽是FC?
Formatting Context
,格式化上下文,指頁面中一個渲染區域,擁有一套渲染規則,它決定了其子元素如何定位,以及與其他元素的相互關系和作用。
BFC
什麽是BFC
Block Formatting Context
,塊級格式化上下文,一個獨立的塊級渲染區域,該區域擁有一套渲染規則來約束塊級盒子的布局,且與區域外部無關。
BFC的約束規則
- 內部的
BOX
會在垂直方向上一個接一個的放置; - 垂直方向上的距離由
margin
決定。(完整的說法是:屬於同一個BFC
的倆個相鄰的BOX
的margin
會發生重疊,與方向無關。) - 每個元素的左外邊距與包含塊的左邊界相接觸(從左到右),即使浮動元素也是如此。(這說明BFC中的子元素不會超出它的包含塊,而
position
absolute
的元素可以超出它的包含塊邊界); -
BFC
的區域不會與float
的元素區域重疊; - 計算
BFC
的高度時,浮動子元素也參與計算; -
BFC
就是頁面上的一個隔離的獨立容器,容器裏面的子元素不會影響到外面的元素,反之亦然;
BFC的應用
- 防止
margin
發生重疊 - 防止發生因浮動導致的高度塌陷
怎麽生成 BFC
-
float
的值不為none
; -
overflow
的值不為visible
; -
display
的值為inline-block
table-cell
table-caption
; -
position
的值為absolute
或fixed
;
display:table
也認為可以生成BFC
?其實是在於Table
會默認生成一個匿名的table-cell
,正是這個匿名的table-cell
生成了BFC
。
IFC
什麽是IFC
IFC(Inline Formatting Contexts)
直譯為"行內格式化上下文",IFC
的line box
(線框)高度由其包含行內元素中最高的實際高度計算而來(不受到豎直方向的 padding/margin
影響)
IFC有的特性
-
IFC
中的line box
一般左右都貼緊整個IFC
,但是會因為float
元素而擾亂。float
元素會位於IFC
與與line box
之間,使得line box
寬度縮短。 -
IFC
中時不可能有塊級元素的,當插入塊級元素時(如p
div
)會產生兩個匿名塊與div
分隔開,即產生兩個IFC
,每個IFC
對外表現為塊級元素,與div
垂直排列。
IFC的應用
- 水平居中:當一個塊要在環境中水平居中時,設置其為
inline-block
則會在外層產生IFC
,通過text-align
則可以使其水平居中。 - 垂直居中:創建一個
IFC
,用其中一個元素撐開父元素的高度,然後設置其vertical-align:middle
,其他行內元素則可以在此父元素下垂直居中。
GFC
GFC(GridLayout Formatting Contexts)
直譯為"網格布局格式化上下文",當為一個元素設置display
值為grid
的時候,此元素將會獲得一個獨立的渲染區域,我們可以通過在網格容器(grid container)
上定義網格定義行(grid definition rows)
和網格定義列(grid definition columns)
屬性各在網格項目(grid item)
上定義網格行(grid row)
和網格列(grid columns)
為每一個網格項目(grid item)
定義位置和空間。
GFC
將改變傳統的布局模式,他將讓布局從一維布局變成了二維布局。簡單的說,有了GFC
之後,布局不再局限於單個維度了。這個時候你要實現類似九宮格,拼圖之類的布局效果顯得格外的容易。
FFC
FFC(Flex Formatting Contexts)
直譯為"自適應格式化上下文",display
值為flex
或者inline-flex
的元素將會生成自適應容器(flex container)
。
Flex Box
由伸縮容器和伸縮項目組成。通過設置元素的 display
屬性為 flex
或 inline-flex
可以得到一個伸縮容器。設置為 flex
的容器被渲染為一個塊級元素,而設置為 inline-flex
的容器則渲染為一個行內元素。
伸縮容器中的每一個子元素都是一個伸縮項目。伸縮項目可以是任意數量的。伸縮容器外和伸縮項目內的一切元素都不受影響。簡單地說,Flexbox
定義了伸縮容器內伸縮項目該如何布局。
FFC與BFC的區別
FFC
與BFC
有點兒類似,但仍有以下幾點區別:
- Flexbox 不支持
::first-line
和::first-letter
這兩種偽元素 -
vertical-align
對Flexbox
中的子元素 是沒有效果的 -
float
和clear
屬性對Flexbox
中的子元素是沒有效果的,也不會使子元素脫離文檔流(但是對Flexbox
是有效果的!) - 多欄布局(
column-*
) 在Flexbox
中也是失效的,就是說我們不能使用多欄布局在Flexbox
排列其下的子元素 -
Flexbox
下的子元素不會繼承父級容器的寬
原文地址:https://segmentfault.com/a/1190000014886753
css布局的各種FC簡單介紹:BFC,IFC,GFC,FFC