理解CSS中的BFC(塊級可視化上下文)

開篇

一些元素璧帝,如float元素睬隶,如position為absolute,inline-block,table-cell或table-caption的元素作喘,以及overflow屬性不為visible的元素泞坦,它們將會建立一個新的塊級格式化上下文。

上述定義已經(jīng)很詳細的描述了塊級格式化上下文(Block Formatting Context)是如何形成的赃梧,為了方便起見授嘀,文中均用BFC代替÷嘞眨現(xiàn)在览闰,讓我們用一種簡單的方式對其進行重新定義:
BFC也是HTML中的一個盒子(看不見而已)压鉴,只有滿足至少下列條件之一才能形成BFC:

  • float屬性不為none.

  • position屬性不為static和relative.

  • display屬性為下列之一:table-cell,table-caption,inline-block,flex,or inline-flex.

  • overflow屬性不為visible.

讓我們建立一個BFC

HTML代碼如下:

<div class="container">
  Some Content here
</div>

我們可以用CSS為container容器附加上述條件,如overflow: scroll, overflow: hidden, display: flex, float: left, or display: table.盡管這些條件都能形成一個BFC油吭,但是它們各自卻有著不一樣的表現(xiàn):

  • display: table : 在響應(yīng)式布局中會有問題

  • overflow: scroll : 可能會出現(xiàn)你不想要的滾動條

  • float: left: 使元素左浮動婉宰,并且其他元素對其環(huán)繞

  • overflow: hidden: 消除溢出部分

這么看來心包,建立BFC的最好方式莫過于overflow:hidden了:

.container {
  overflow: hidden;
}

在BFC中缨恒,塊級元素又是怎么布局的呢?

W3C規(guī)范描述如下:

In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).bfcbfc.jpg

簡單的說:上圖中所有屬于BFC的box都默認左對齊岭佳,并且它們的左邊距可以觸及到容器container的左邊珊随。最后一個box叶洞,盡管它是浮動的禀崖,但它依然遵循這個原則波附。(BFC中的浮動下面會介紹)

-那么,BFC到底有什么卵用呢封寞?

-實際上仅财,真的特別有用

1.利用BFC可以消除Margin Collapse

在正常情況下盏求,在一個容器內(nèi)的所有box將會由上至下依次垂直排列亿眠,即我們所說的一個元素占一行缕探,并切垂直相鄰的距離(即margin)是由各自的margin決定的还蹲,而不是兩個margin的疊加谜喊。

讓我們看一個例子:紅色的div包含三個綠色的p元素倦始。

HTML代碼:

<div class="container">
  <p>Sibling 1</p>
  <p>Sibling 2</p>
  <p>Sibling 3</p>
</div>

CSS代碼:

.container {
  background-color: red;
  overflow: hidden; /* creates a block formatting context */
}
 
p {
  background-color: lightgreen;
  margin: 10px 0;
}

理想情況下鞋邑,我們會認為p標簽之間的margin應(yīng)該是它們的和(20px),但實際上卻是10px.這其實是collapsing margins枚碗。

結(jié)果如下:

這似乎讓人有點困惑,BFC導(dǎo)致了margin collapse遵堵,而現(xiàn)在又要用它來解決margin cllapse.但是始終要記住一點:只有當元素在同一個BFC中時陌宿,垂直方向上的margin
才會clollpase.如果它們屬于不同的BFC波丰,則不會有margin collapse.因此我們可以再建立一個BFC去阻止margin collpase的發(fā)生。

現(xiàn)在HTML變成:

<div class="container">
  <p>Sibling 1</p>
  <p>Sibling 2</p>
  <div class="newBFC">
    <p>Sibling 3</p>
  </div>
</div>

CSS也有改變:

.container {
  background-color: red;
  overflow: hidden; /* creates a block formatting context */
}
 
p {
  margin: 10px 0;
  background-color: lightgreen;
}
 
.newBFC {
  overflow: hidden;  /* creates new block formatting context */
}

現(xiàn)在的結(jié)果為:

由于第二個p元素和第三個p元素屬于不同的BFC,因此避免了margin collapse.

2.利用BFC去容納浮動元素

我相信大家經(jīng)常會遇到一個容器里有浮動元素媚赖,但是這個容器的高度卻是0的場景,如下圖:

看下面的例子:

HTML:

<div class="container">
  <div>Sibling</div>
  <div>Sibling</div>
</div>  

CSS:

.container {
  background-color: green;
}
 
.container div {
  float: left;
  background-color: lightgreen;
  margin: 10px;
}

結(jié)果:

在上邊的情形中颖对,container是不會有高度的缤底,因為它包含了浮動元素。通常我們解決這個問題的辦法是利用一個偽元素去實現(xiàn)clear fix江解,但是現(xiàn)在我們有了更好的解決辦法徙歼,即利用BFC,因為它夠容納浮動元素的桨螺。
我們現(xiàn)在讓container形成BFC規(guī)則灭翔,結(jié)果如下:

.container {
  overflow: hidden; /* creates block formatting context */
  background-color: green;
}
 
.container div {
  float: left;
  background-color: lightgreen;
  margin: 10px;
}

結(jié)果:

3.利用BFC阻止文本換行

有時候肝箱,確切的說大多數(shù)情況(若沒有特殊設(shè)置)稀蟋,文本將會環(huán)繞浮動元素(如Figure 1),
但有時候這并不是我們期望的,我們想要的是Figure2唱矛。

往往可能大家都會選擇利用margin-left來強行讓p的容器有一個左邊距绎谦,而距離恰好為Floated div的寬度粥脚,但現(xiàn)在我們可以利用BFC更好的解決這個問題。

首先讓我們了解一下文本換行的原理吧:

在Figure1中冤留,整個p元素實際上是處于上圖中的黑色區(qū)域纤怒,p元素沒有移動是因為它在浮動元素的下方天通。但實際上p作為行塊級別的元素(相對于行內(nèi)文本)卻發(fā)生了移動,因為要給float元素'騰'位置烘豹,而隨著文本的增加,文本高度超過浮動元素的部分則不會在水平方向上收縮內(nèi)部距離携悯,因此看起來像是環(huán)繞。

如圖:

在解決這個問題之前龟劲,我們先來看一下W3C的規(guī)范在這方面的描述:

In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).

W3C為這種情況提供了一個解決方案:unless the box establishes a new block formatting context咸灿,即為p建立BFC。

結(jié)果:

注:此文為譯文
blog請戳
原文請戳

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囊榜,一起剝皮案震驚了整個濱河市亥宿,隨后出現(xiàn)的幾起案子烫扼,更是在濱河造成了極大的恐慌,老刑警劉巖悟狱,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挤渐,死亡現(xiàn)場離奇詭異双絮,居然都是意外死亡,警方通過查閱死者的電腦和手機软免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門膏萧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人认境,你說我怎么就攤上這事叉信∷蚁#” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵佳遂,是天一觀的道長丑罪。 經(jīng)常有香客問我凤壁,道長,這世上最難降的妖魔是什么煤搜? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任擦盾,我火速辦了婚禮淌哟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婶希。我一直安慰自己蓬衡,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布筒饰。 她就那樣靜靜地躺著瓷们,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碘裕。 梳的紋絲不亂的頭發(fā)上攒钳,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天不撑,我揣著相機與錄音,去河邊找鬼姆坚。 笑死实愚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的萍程。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乎赴,長吁一口氣:“原來是場噩夢啊……” “哼潮尝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羹蚣,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤顽素,失蹤者是張志新(化名)和其女友劉穎徒蟆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體全蝶,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡抑淫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砌烁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埂蕊。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓄氧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撇寞,到底是詐尸還是另有隱情堂氯,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布啤握,位于F島的核電站排抬,受9級特大地震影響授段,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侵贵,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一窍育、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧么翰,春花似錦辽旋、人聲如沸檐迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廓块,卻和暖如春契沫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拴清。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工会通, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沪停。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓牙甫,卻偏偏與公主長得像调违,于是被迫代替她去往敵國和親技肩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 13,754評論 1 92
  • 什么是BFC BFC全稱是Block Formatting Context然痊,即塊格式化上下文屉符。它是CSS2.1規(guī)范...
    clfeng閱讀 466評論 0 0
  • 先前在學習CSS float時锹引,有同學提到了BFC這個詞嫌变,作為求知好問的好學生躬它,哪里不懂查哪里,那么今天就來研究一...
    這名字真不對閱讀 6,560評論 3 19
  • 一倘待、BFC是什么组贺? 它是 Block Formatting Context (塊級格式化上下文) 的簡稱,接下來通...
    07120665a058閱讀 3,805評論 15 40
  • 在CSS奇技淫巧之負邊距的應(yīng)用里提到了某些場景下前一個塊的margin-bottom和文檔流之后的下一個塊的mar...
    小胖子嘿嘿嘿閱讀 501評論 0 3