什么是BFC(Block Formatting Context) ?其如何工作?

BFC 已經(jīng)是一個耳聽熟聞的詞語了,網(wǎng)上有許多關(guān)于 BFC 的文章,介紹了如何觸發(fā) BFC 以及 BFC 的一些用處(如清浮動,防止 margin 重疊等),那么今天就來詳細(xì)學(xué)習(xí)下什么是BFC以及他的應(yīng)用。

1.BFC是什么

在解釋什么是BFC之前,需要先介紹BOX、Formatting Context的概念

BOX:CSS布局的基本單位

Box 是 CSS 布局的對象和基本單位, 直觀點來說,就是一個頁面是由很多個 Box 組成的。元素的類型和 display 屬性,決定了這個 Box 的類型。 不同類型的 Box, 會參與不同的

Formatting Context(一個決定如何渲染文檔的容器),因此Box內(nèi)的元素會以不同的方式渲染。

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: run-in框的行為如下:

如果run-in框包含一個塊框,那么run-in框變?yōu)閴K框。

如果run-in框的后繼兄弟元素為塊框(非浮動,非絕對定位),那么run-in框變?yōu)樵搲K框的第一個行內(nèi)框。run-in不能插入本身為run-in的塊中,也不能插入塊中已有run-in的塊中。

否則,run-in框變?yōu)閴K框。

Formatting context

Formatting context 是 W3C CSS2.1 規(guī)范中的一個概念。它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。最常見的 Formatting context 有 Block fomatting context (簡稱BFC)和 Inline formatting context (簡稱IFC)。? ? ? ? CSS2.1 中只有 BFC 和 IFC, CSS3 中還增加了 GFC 和 FFC。

IFC

IFC(Inline Formatting Contexts)直譯為"內(nèi)聯(lián)格式化上下文",IFC的line box(線框)高度由其包含行內(nèi)元素中最高的實際高度計算而來(不受到豎直方向的padding/margin影響)? ? ? ? IFC中的line box一般左右都貼緊整個IFC,但是會因為float元素而擾亂。float元素會位于IFC與與line box之間,使得line box寬度縮短。 同個ifc下的多個line box高度會不同。 IFC中時不可能有塊級元素的,當(dāng)插入塊級元素時(如p中插入div)會產(chǎn)生兩個匿名塊與div分隔開,即產(chǎn)生兩個IFC,每個IFC對外表現(xiàn)為塊級元素,與div垂直排列。? ? ? ? 那么IFC一般有什么用呢?? ? ? ? 水平居中:當(dāng)一個塊要在環(huán)境中水平居中時,設(shè)置其為inline-block則會在外層產(chǎn)生IFC,通過text-align則可以使其水平居中。? ? ? ? 垂直居中:創(chuàng)建一個IFC,用其中一個元素?fù)伍_父元素的高度,然后設(shè)置其vertical-align:middle,其他行內(nèi)元素則可以在此父元素下垂直居中。

GFC

GFC(GridLayout Formatting Contexts)直譯為"網(wǎng)格布局格式化上下文",當(dāng)為一個元素設(shè)置display值為grid的時候,此元素將會獲得一個獨立的渲染區(qū)域,我們可以通過在網(wǎng)格容器(grid container)上定義網(wǎng)格定義行(grid definition rows)和網(wǎng)格定義列(grid definition columns)屬性各在網(wǎng)格項目(grid item)上定義網(wǎng)格行(grid row)和網(wǎng)格列(grid columns)為每一個網(wǎng)格項目(grid item)定義位置和空間。? ? ? ? 那么GFC有什么用呢,和table又有什么區(qū)別呢?首先同樣是一個二維的表格,但GridLayout會有更加豐富的屬性來控制行列,控制對齊以及更為精細(xì)的渲染語義和控制。

FFC

FFC(Flex Formatting Contexts)直譯為"自適應(yīng)格式化上下文",display值為flex或者inline-flex的元素將會生成自適應(yīng)容器(flex container),可惜這個牛逼的屬性只有谷歌和火狐支持,不過在移動端也足夠了,至少safari和chrome還是OK的,畢竟這倆在移動端才是王道。? ? ? ? Flex Box 由伸縮容器和伸縮項目組成。通過設(shè)置元素的 display 屬性為 flex 或 inline-flex 可以得到一個伸縮容器。設(shè)置為 flex 的容器被渲染為一個塊級元素,而設(shè)置為 inline-flex 的容器則渲染為一個行內(nèi)元素。? ? ? ? 伸縮容器中的每一個子元素都是一個伸縮項目。伸縮項目可以是任意數(shù)量的。伸縮容器外和伸縮項目內(nèi)的一切元素都不受影響。簡單地說,F(xiàn)lexbox 定義了伸縮容器內(nèi)伸縮項目該如何布局。

BFC定義

BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區(qū)域,只有Block-level box參與, 它規(guī)定了內(nèi)部的Block-level

Box如何布局,并且與這個區(qū)域外部毫不相干。

2.BFC布局規(guī)則:

內(nèi)部的Box會在垂直方向,一個接一個地放置。

Box垂直方向的距離由margin決定。屬于同一個BFC的兩個相鄰Box的margin會發(fā)生重疊

每個元素的margin box的左邊, 與包含塊border box的左邊相接觸(對于從左往右的格式化,否則相反)。即使存在浮動也是如此。

BFC的區(qū)域不會與float box重疊。

BFC就是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。反之也如此。

計算BFC的高度時,浮動元素也參與計算

3.哪些元素會生成BFC

根元素

float屬性不為none

position為absolute或fixed

display為inline-blcok、table-cell、table-caption

overflow不為visible

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 14,189評論 1 92
  • 先前在學(xué)習(xí)CSS float時,有同學(xué)提到了BFC這個詞,作為求知好問的好學(xué)生,哪里不懂查哪里,那么今天就來研究一...
    這名字真不對閱讀 6,704評論 3 19
  • 大家好,我是IT修真院鄭州分院,一枚正直、純潔、善良的web程序員。 今天給大家分享一下,修真院官網(wǎng) CSS任務(wù)中...
    初晨曬暖心閱讀 469評論 0 0
  • H5移動端知識點總結(jié) 閱讀目錄 移動開發(fā)基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,834評論 0 26
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進(jìn)行定位...
    zx9426閱讀 1,081評論 0 2

友情鏈接更多精彩內(nèi)容