請描述BFC、及其如何工作

1.背景介紹

BFC全稱是Block Formatting Context,是CSS2.1規范定義的,關于CSS渲染定位的一個概念。它的定位體系屬于常規文檔流。BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block-level box參與,它規定了內部的Block-level Box如何布局,并且與這個區域外部毫不相干。要理解BFC,先了解視覺格式化模型。

視覺格式化模型(visual formatting model),是CSS中的一個概念,用來處理文檔并將它顯示在視覺媒體上的機制。 我們常說的盒模型只是CSS視覺格式化的一部分。Box 是 CSS 布局的對象和基本單位,一個頁面可以想象成由很多個 Box 組成的。元素的類型和 display 屬性,決定了這個 Box 的類型。 不同類型的 Box, 會參與不同的 Formatting Context(格式化上下文),? ?因此Box內的元素會以不同的方式渲染。BFC是頁面中的一塊渲染區域,并且有一套渲染規則,? 它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。

最常見的 Formatting context 有 Block fomatting context (簡稱BFC)和 Inline formatting context (簡稱IFC)。

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;

2.知識剖析

BFC( Block formatting contexts)的布局規則

1. 在BFC中的盒子是block-level box,其排列方式是從包含塊頂部開始,垂直向下排列。

2.相鄰兩個盒子之間的垂直間距由margin決定,在一個BFC內部的兩個block-level box之間的垂直margin是折疊的。

3. BFC的區域不會與float box重疊。內部元素不受外部元素影響

4.計算BFC的高度時,考慮BFC所包含的所有元素,連浮動元素也參與計算。

5.浮動的BOX區域不會疊加到BFC上。

6.參與BFC的布局的只有普通文檔流normal flow中的塊級盒,而float、position值不為relative\static的元素不參與BFC的布局。

BFC的范圍

MDN 對BFC范圍的描述是:

A block formatting context contains everything inside of the element

creating it that is not also inside a descendant element that creates a new block formatting

context.

意思一個BFC包含創建該上下文元素的所有子元素,但不包括創建了新BFC的子元素的內部元素。就是說一個BFC中,如果一個子元素觸發了BFC 那么這個子元素內部的元素不受外部BFC的影響。這就是BFC的一個重要屬性,讓處于BFC內部的元素與外部的元素相互隔離,使內外元素的定位不會相互影響。BFC的這個特性通常用于清除浮動元素的影響

3.常見問題

3.1 如何觸發BFC?

3.2 BFC的作用

4 解決方案

4.1創建BFC

BFC的創建方法

1.根元素;

2.浮動 (元素的float不為none);

3.絕對定位元素 (元素的position為absolute或fixed);

4.行內塊inline-blocks(元素的 display: inline-block);

5.表格單元格(元素的display: table-cell,HTML表格單元格默認屬性);

6. overflow的值不為visible的元素;

7.彈性盒 flex boxes (元素的display: flex或inline-flex);

其中,最常見的就是overflow:hidden; float:left/right; position:absolute。也就是說,當這些屬性出現的時候,表示該元素創建了一個BFC。

4.2 BFC的作用

1、消除浮動元素對非非浮動元素的影響

2、清除內部浮動

3、防止垂直 margin 重疊。

相鄰塊盒子的垂直外邊距折疊只有他們是在同一BFC時才會發生。如果他們屬于不同的BFC,他們之間的外邊距將不會折疊

5.編碼實戰

1、消除浮動元素對非非浮動元素的影響,看下面的例子,沒有創建BFC的情況

main{

/*position:absolute;*/

/*display: inline-block;*/

/*display: table;*/

/*display: flex;*/

/*overflow: hidden;*/

width:1000px;

margin:0auto;

background-color:gainsboro;

border:solid1px;

}

.left{

float:left;

/*margin: 50px 0;*/

width:200px;

height:200px;

background-color:rgba(86,251,166,.5);

}

.right{

/*overflow: hidden;*/

/*float: left;*/

/*margin: 50px 0;*/

width:500px;

background-color:#fff965;

}

.collapse{

/*overflow: hidden;*/

}

我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字

我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字


我們看到浮動盒子覆蓋在非浮動盒子上,父元素高度塌陷(沒有包圍浮動元素)。如果給父元素一個overflow:hidden(創建BFC),看看什么情況

main{

/*position:absolute;*/

/*display: inline-block;*/

/*display: table;*/

/*display: flex;*/

overflow:hidden;

width:1000px;

margin:0auto;

background-color:gainsboro;

border:solid1px;

}


父元素將浮動元素包裹起來了,恢復了高度。

2、我們再給右邊盒子創建BFC ,看看是什么情況

.right{

overflow:hidden;

/*float: left;*/

/*margin: 50px 0;*/

width:500px;

background-color:#fff965;

}


出現的效果是浮動元素不再覆蓋非浮動元素。這就是BFC的一個重要特性,處于BFC內部的元素與外部的元素相互隔離,使內外元素的定位不會相互影響。我們可以用這個特性來消除浮動元素的字圍效果。

3、BFC防止垂直 margin 重疊的作用。

沒有BFC的情況下兩個元素的上下外邊距是折疊的,值取最大的一個??聪旅胬樱?/p>


.left{

/*float: left;*/

margin:50px0;

width:200px;

height:100px;

background-color:rgba(86,251,166,.5);

}

.right{

overflow:hidden;

/*float: left;*/

margin:50px0;

width:500px;

background-color:yellow;

}

我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字

我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字

我們看到類為right的元素也觸發了BFC(overflow:hidden;)但是沒有消除兩個元素的外邊距折疊。我們在回顧一下BFC的特性:處于BFC內部的元素與外部的元素相互隔離,使內外元素的定位不會相互影響。也就是BFC用于消除內部元素與外部元素的相互影響。處于同級的BFC就沒有這個特性。如果在類為right元素外部包裹一個BFC元素,給類為collapse? 的盒子一個overflow:hidden(創建BFC),看看什么情況

我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字

我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字我是測試文字

.collapse{

overflow:hidden;

}


現在另個盒子外邊距分離了。

總結一下

元素創建BFC后有如下的效果

1、消除浮動元素對非非浮動元素的影響

2、清除內部浮動

3、防止垂直 margin 重疊。

6.擴展思考

不同條件觸發BFC產生的效果是否一樣?

display:flex,屬性創建的BFC會讓內部子元素也繼承BFC,其他條件是一樣的效果。

7.參考文獻

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

參考2:http://web.jobbole.com/84808

參考3:http://www.cnblogs.com/elcarim5efil/p/4745796.html

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,776評論 1 92
  • 先前在學習CSS float時,有同學提到了BFC這個詞,作為求知好問的好學生,哪里不懂查哪里,那么今天就來研究一...
    這名字真不對閱讀 6,569評論 3 19
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 954評論 0 2
  • 大家好,我是IT修真院鄭州分院,一枚正直、純潔、善良的web程序員。 今天給大家分享一下,修真院官網 CSS任務中...
    初晨曬暖心閱讀 412評論 0 0
  • 大家好 每日午豹來啦 聽說留給創業者的顏色不多了,于是出現了…… 聽說你受夠了照騙的苦,于是出現了…… 1.聯合國...
    玫瑰鉆石婚戀閱讀 236評論 0 0