CSS中的BFC

一何鸡、BFC是什么?

它是 Block Formatting Context (塊級格式化上下文) 的簡稱牛欢,接下來通過對其中幾個名詞的解釋進一步了解 BFC 定義音比。

  1. Box : CSS布局的基本單位
      Box 是 CSS 布局的對象和基本單位, 直觀點來說氢惋,就是一個頁面是由很多個 Box 組成的。元素的類型和 display 屬性稽犁,決定了這個 Box 的類型焰望。不同類型的 Box, 會參與不同的 Formatting Context(一個決定如何渲染文檔的容器)已亥,因此Box內的元素會以不同的方式渲染熊赖。
  • 幾個常見的盒子:
    block-level boxdisplay 屬性為 block,list-item, table 的元素,會生成 block-level box虑椎。并且參與 block fomatting context震鹉;
    inline-level boxdisplay 屬性為 inline, inline-block, inline-table 的元素,會生成 inline-level box捆姜。并且參與 inline formatting context传趾;
  1. Formatting context
      Formatting context 是指頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則泥技,它決定了其子元素將如何定位浆兰,以及和其他元素的關系和相互作用。最常見的 Formatting context 有 Block fomatting context (簡稱 BFC )和 Inline formatting context (簡稱 IFC )珊豹。

  2. **BFC **:塊級格式化上下文
      BFC 是指一個獨立的塊級渲染區(qū)域簸呈,只有Block-level Box參與,該區(qū)域擁有一套渲染規(guī)則來約束塊級盒子的布局店茶,且與區(qū)域外部無關蜕便。

    • BFC就是一種布局方式,可以理解為一個作用范圍贩幻,即在一個BFC里的布局與其之外的布局不相關或者說不相互影響轿腺。
  • 舉一個形象的例子:
    可以把一個頁面想象成大的集裝箱,這個集裝箱里裝的貨物就是 html元素丛楚。在現實生活中為了避免不同人的貨物相互混淆吃溅,都是把貨物打好包裝再裝入集裝箱,這樣的話無論你包裝里面的貨物怎么擺放鸯檬,都不會影響到其他人的貨物决侈。那么這個包裝就可以被想象成 Block Formatting Context。

4. 為什么要用BFC?

  • 使用一定的CSS聲明可以生成BFC赖歌,瀏覽器對生成的BFC有一系列的渲染規(guī)則枉圃,利用這些渲染規(guī)則我們可以達到一定的布局效果,為了達到特定的布局效果我們讓元素生成BFC庐冯。

二孽亲、哪些元素會生成BFC?

  • 當一個HTML元素滿足下面條件的任何一點,都可以產生 Block Formatting Context

  • 根元素

  • float的值不為none展父;

  • overflow的值不為visible(可以為hidden,scroll,auto)返劲;

  • display的值為inline-block,table-cell,table-caption,flex,inline-flex中的任何一個;

  • position的值為absolute,fixed(不為static,relative中的任何一個)栖茉;

  • displaytable也認為可以生成BFC篮绿,其實這里的主要原因在于table會默認生成一個匿名的table-cell,正是這個匿名的table-cell生成了BFC吕漂。

  • 常用的用來觸發(fā)BFC的CSS樣式:
    overflow: scroll,overflow: hidden,display: flex, float: left,display: table

  • 其中可能產生的一些問題

  • display:table —— 可能會產生一些問題

  • overflow:scroll —— 可能會顯示不必要的滾動條

  • overflow:hidden —— 將會剪切掉溢出的元素

  • float:left —— 將會把元素置于容器的左邊亲配,其他元素環(huán)繞著它

三、BFC的布局規(guī)則

  1. 內部的Box會在垂直方向上一個接一個的放置惶凝;
  2. 垂直方向上的距離有margin決定吼虎。(完整的說法是:屬于同一個BFC的兩個相鄰的Box的margin會發(fā)生重疊,與方向無關)
  3. 每個盒子的左外邊框緊挨著包含塊的左邊框(從右到左的格式苍鲜,則為緊挨右邊框)思灰,即使浮動元素也是如此。(這說明BFC中的子元素不會超出它的包含塊)
  4. BFC的區(qū)域不會與float的元素區(qū)域重疊
  5. 計算BFC的高度時混滔,浮動子元素也參與計算官辈;
  6. BFC就是頁面上的一個隔離的獨立容器绕德,容器里面的子元素不會影響到外面的元素颅夺,反之亦然;

四调榄、BFC的作用及原理

  • 自適應兩欄布局
 body { width: 300px; } 
.aside { width: 100px; height: 150px; float: left; background: #f66; } 
.main { height: 200px; background: #fcc; }
<body> 
     <div class="aside"></div> 
     <div class="main"></div>
</body>
  • 效果圖如下:


  • 分析:

根據BFC布局規(guī)則 第3條:
* 每個元素的margin box的左邊愿伴, 與包含塊border box的左邊相接觸(對于從左往右的格式化肺魁,否則相反),即使存在浮動也是如此隔节。

現象:雖然存在浮動的元素 aside鹅经,但 main 的左邊依然會與包含塊的左邊相接觸。

  • 修改:
根據BFC布局規(guī)則第四條:
* BFC的區(qū)域不會與float box重疊怎诫。

改變方法:我們可以通過觸發(fā) main 生成BFC瘾晃, 來實現自適應兩欄布局,當觸發(fā)main 生成BFC后幻妓,這個新的BFC不會與浮動的 aside 重疊蹦误,main 會根據包含塊的寬度,和 aside 的寬度,自動變窄强胰。(一個盒子的邊框會由于浮動而收縮舱沧,盒子本身將會變得更窄)

.main { overflow: hidden;}  //或者利用上述其他方式為它生成 BFC
  • 新的效果圖如下:


  • 清除內部浮動
.par { border: 5px solid #fcc; width: 300px; }
.child { border: 5px solid #f66; width: 100px; height: 100px; float: left;}
<body> 
    <div class="par"> 
      <div class="child"></div> 
      <div class="child"></div>
    </div>
</body>
  • 效果圖如下:


  • 修改:

根據BFC布局規(guī)則第五條:
* 計算BFC的高度時,浮動元素也參與計算
**改變方法:**為達到清除內部浮動偶洋,我們可以觸發(fā) par 生成BFC熟吏,那么 par 在計算高度時,par 內部的浮動元素 child 也會參與計算玄窝。
.par { overflow: hidden;} //或者利用上述其他方式為它生成 BFC
  • 新的效果圖如下:


  • 防止垂直 margin 重疊
<style> 
  p { color: #f55;
       background: #fcc; 
       width: 200px;
       line-height: 100px;
       text-align: center; 
       margin: 100px;
     }
</style>
<body> 
    <p>Haha</p> 
    <p>Hehe</p>
</body>
  • 效果圖如下:


  • 分析:

根據BFC布局規(guī)則第二條:

Box垂直方向的距離由margin決定牵寺。屬于同一個BFC的兩個相鄰Box的margin會發(fā)生重疊
現象:兩個p之間的距離為100px,發(fā)送了margin重疊恩脂。

  • 修改:

我們可以在p外面包裹一層容器帽氓,并觸發(fā)該容器生成一個BFC。那么兩個P便不屬于同一個BFC东亦,就不會發(fā)生margin重疊了。

<style>
     .wrap { overflow: hidden; }
     p { 
          color: #f55; 
          background: #fcc;
          width: 200px; 
          line-height: 100px;
          text-align: center;
          margin: 100px; 
        }
</style>
<body>
     <p>Haha</p> 
     <div class="wrap">
       <p>Hehe</p>
     </div>
</body>
  • 新的效果圖如下:


其實以上的幾個例子都體現了BFC布局規(guī)則第六條:
  • BFC就是頁面上的一個隔離的獨立容器唬渗,容器里面的子元素不會影響到外面的元素典阵。反之也如此。
    解釋:
    因為BFC內部的元素和外部的元素絕對不會互相影響镊逝;
    因此壮啊,** 當BFC外部存在浮動時,它不應該影響B(tài)FC內部Box的布局撑蒜,BFC會通過變窄歹啼,而不與浮動有重疊;
    同樣的座菠,
    當BFC內部有浮動時**狸眼,為了不影響外部元素的布局,BFC計算高度時會包括浮動的高度浴滴;避免margin重疊也是這樣的一個道理拓萌。

五、詳細分析 margin 折疊

  • 1升略、產生的原因

  • 這些margin都處于普通流中微王,并在同一個BFC中

  • 這些margin沒有被非空內容、padding品嚣、borderclear 分隔開

  • 這些margin在垂直方向上是毗鄰的

  • 2炕倘、包含的情況:

    • 一個box的 margin-top 與第一個子box的 margin-top
    • 一個box的 margin-bottom 與最后一個子box的 margin-bottom ,但須在該box的height:auto 的情況下
    • 一個box的 margin-bottom 與緊接著的下一個box的margin-top
    • 一個box的margin-top與其自身的margin-bottom翰撑,但須滿足沒創(chuàng)建BFC
      :另一篇CSS盒子對這些情況有圖解
  • 3罩旋、折疊邊距的計算

  • 當兩個margin都是正值的時候,取兩者的最大值;

  • 當 margin 都是負值的時候瘸恼,取的是其中絕對值較大的劣挫,然后,從 0 位置东帅,負向位移压固;

  • 當有正有負的時候,先取出負 margin 中絕對值中最大的靠闭,然后帐我,和正 margin 值中最大的 margin 相加。
    NOTE:所有毗鄰的margin要一起參與運算愧膀,不能分步進行拦键。

  • 4、舉個例子:

  • 1)用 浮動布局 顯示成兩行兩列 ——(為了解決浮動布局里的一個問題:元素浮動不換行怎么辦檩淋?)

<div id="A">
  <div id="red" style="background: red;width: 100px;height: 100px;float: left;">
  </div>
  <div id="orange" style="background: orange;width: 100px;height: 100px;float: left;">
  </div>
</div>
<div id="B">
  <div id="yellow" style="background: yellow;width: 100px;height: 100px;float: left;">
  </div>
  <div id="green" style="background: green;width: 100px;height: 100px;float: left;">
  </div>
</div>
效果圖
效果圖
我們可以看到四個盒子最終都處在一列里面芬为,為了達到我們的目的,可以**在其中一個外層盒子建立一個BFC**
<div id="A" style="display:inline-block;">
...
</div>
<div id="B">
...
</div>
新的效果圖
新的效果圖
    1. 實現多欄布局的一種方式
根據BFC布局規(guī)則第四條:
* BFC的區(qū)域不會與float box重疊蟀悦。(與浮動元素相鄰的已生成BFC的元素不能與浮動元素互相覆蓋)

利用該特性可以作為多欄布局的一種實現方式媚朦。

```

<div class="container">
<div class="column">column 1</div>
<div class="column">column 2</div>
<div class="column">column 3</div>
</div>

.column {
width: 31.33%;
background-color: green;
float: left;
margin: 0 1%;
}
.column:last-child
{
float: none;
overflow: hidden;
}


    ![多列布局.png](http://upload-images.jianshu.io/upload_images/3087126-a263255605a63fa0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

###六、關于BFC的總結
* BFC的幾個用途 (但是也有其他方法可以達到這種效果)
 * 1日戈、BFC可以阻止垂直邊距疊加問題
 * 2询张、BFC可以包含內部元素的浮動
 * 3、BFC可以阻止元素被浮動覆蓋
 * 4浙炼、BFC可以決定清除浮動的范圍

>參考文章:
[BFC(塊級格式化上下文)](http://www.reibang.com/p/66632298e355)
[我對BFC的理解](http://www.reibang.com/p/76484dff1cb5)

>其他文章推薦:
[理解CSS中的BFC](http://www.w3cplus.com/css/understanding-block-formatting-contexts-in-css.html)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末份氧,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子弯屈,更是在濱河造成了極大的恐慌蜗帜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件资厉,死亡現場離奇詭異钮糖,居然都是意外死亡,警方通過查閱死者的電腦和手機酌住,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門店归,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酪我,你說我怎么就攤上這事消痛。” “怎么了都哭?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵秩伞,是天一觀的道長逞带。 經常有香客問我,道長纱新,這世上最難降的妖魔是什么展氓? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脸爱,結果婚禮上遇汞,老公的妹妹穿的比我還像新娘。我一直安慰自己簿废,他們只是感情好空入,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著族檬,像睡著了一般歪赢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上单料,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天埋凯,我揣著相機與錄音,去河邊找鬼扫尖。 笑死白对,一個胖子當著我的面吹牛,可吹牛的內容都是我干的藏斩。 我是一名探鬼主播躏结,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼却盘,長吁一口氣:“原來是場噩夢啊……” “哼狰域!你這毒婦竟也來了?” 一聲冷哼從身側響起黄橘,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤兆览,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后塞关,有當地人在樹林里發(fā)現了一具尸體抬探,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年帆赢,在試婚紗的時候發(fā)現自己被綠了小压。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡椰于,死狀恐怖怠益,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瘾婿,我是刑警寧澤蜻牢,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布烤咧,位于F島的核電站,受9級特大地震影響抢呆,放射性物質發(fā)生泄漏煮嫌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一抱虐、第九天 我趴在偏房一處隱蔽的房頂上張望昌阿。 院中可真熱鬧,春花似錦梯码、人聲如沸宝泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儿奶。三九已至,卻和暖如春鳄抒,著一層夾襖步出監(jiān)牢的瞬間闯捎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工许溅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓤鼻,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓贤重,卻偏偏與公主長得像茬祷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子并蝗,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案祭犯? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,728評論 1 92
  • BFC是什么键畴? BFC(Block Formatting Context)直譯為“塊級格式化范圍 ”最盅。 是 W3C...
    若邪Y閱讀 1,804評論 0 2
  • 開篇 一些元素,如float元素起惕,如position為absolute,inline-block,table-ce...
    Pursue閱讀 11,665評論 13 56
  • 一涡贱、什么是BFC Formatting context 是 W3C CSS2.1 規(guī)范中的一個概念。它是頁面中的一...
    浪里行舟閱讀 653評論 0 3
  • 先前在學習CSS float時惹想,有同學提到了BFC這個詞问词,作為求知好問的好學生,哪里不懂查哪里勺馆,那么今天就來研究一...
    這名字真不對閱讀 6,545評論 3 19