BFC 詳解

BFC 定義

BFC 全稱 Block Formatting Context,塊級(jí)格式化上下文。

一個(gè) BFC 是網(wǎng)頁中某個(gè)獨(dú)立的 CSS 渲染區(qū)域。

w3c 對(duì) BFC 定義

浮動(dòng)元素和絕對(duì)定位元素,非塊級(jí)盒子的塊級(jí)容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不為“visiable”的塊級(jí)盒子,都會(huì)為他們的內(nèi)容創(chuàng)建新的塊級(jí)格式化上下文。
在一個(gè)塊級(jí)格式化上下文里,盒子從包含塊的頂端開始垂直地一個(gè)接一個(gè)地排列,兩個(gè)盒子之間的垂直的間隙是由他們的 margin 值所決定的。兩個(gè)相鄰的塊級(jí)盒子的垂直外邊距會(huì)發(fā)生疊加。
在塊級(jí)格式化上下文中,每一個(gè)盒子的左外邊緣(margin-left)會(huì)觸碰到容器的左邊緣(border-left)(對(duì)于從右到左的格式來說,則觸碰到右邊緣),即使存在浮動(dòng)也是如此,除非這個(gè)盒子創(chuàng)建一個(gè)新的塊級(jí)格式化上下文。

BFC 的產(chǎn)生

  • 根元素或包含它的其他元素
  • 浮動(dòng)元素
  • position: absoluteposition: fixed 的元素
  • display: inline-block 的元素
  • overflow 被設(shè)置成 visible 外的值的塊狀元素
  • <td>display: table-cell 的元素
  • <caption>display: table-caption 的元素
  • display: flow-root 的元素
  • column-span: all 的元素

BFC 特性

1.內(nèi)部的Box會(huì)在垂直方向,從頂部開始一個(gè)接一個(gè)地放置。
2.Box垂直方向的距離由margin決定。屬于同一個(gè)BFC的兩個(gè)相鄰Box的margin會(huì)發(fā)生疊加。
3.每個(gè)元素的margin box的左邊, 與包含塊border box的左邊相接觸(對(duì)于從左往右的格式化,否則相反)。即使存在浮動(dòng)也是如此。
4.BFC的區(qū)域不會(huì)與float box疊加。
5.BFC就是頁面上的一個(gè)隔離的獨(dú)立容器,容器里面的子元素不會(huì)影響到外面的元素,反之亦然。
6.計(jì)算BFC的高度時(shí),浮動(dòng)元素也參與計(jì)算。

解決margin 合并問題

我們可以把目標(biāo)元素外層添加一個(gè) div 元素,設(shè)置 div 的border-top、padding-top、overflow:hidden、display:inline-blockdisplay:flex。

// HTML
<p>hello world</p>
<p>hello world</p>
// CSS
p {
  color:black;
  background: #FF0000;
  width: 200px;
  line-height: 100px;
  text-align:center;
  margin: 30px;
}

兩個(gè)p元素每個(gè)p之間的距離為30px,發(fā)生了外邊距合并。 要解決這個(gè)合并問題即讓每個(gè)P之間是60px,我們可以新建一個(gè)BFC,怎么建呢?可以給p元素添加一個(gè)父元素,讓它觸發(fā)BFC。

// HTML
<p>hello world</p>
<div>
  <p>hello world</p>
</div>
// CSS
p {
  color:black;
  background: #FF0000;
  width: 200px;
  line-height: 100px;
  text-align:center;
  margin: 30px;
}
div{
  overflow:hidden;
}

抑制浮動(dòng)

// HTML
<div class="aside"></div>
<div class="main"></div>
// CSS
body {
  width: 300px;
  position: relative;
}
.aside {
  width: 100px;
  height: 150px;
  float: left;
  background: blue;
}
.main {
  height: 200px;
  background: #f00;
}

創(chuàng)建一個(gè)新的BFC來解決這個(gè)問題,讓其內(nèi)容消除對(duì)外界浮動(dòng)元素的影響。給 main 類創(chuàng)建一個(gè)BFC,使其不受浮動(dòng)的影響。

// CSS
body {
  width: 300px;
  position: relative;
}
.aside {
  width: 100px;
  height: 150px;
  float: left;
  background: blue;
}
.main {
  height: 200px;
  background: #f00;
  overflow:hidden;
}

使用 BFC 實(shí)現(xiàn)了我們想要的兩欄布局

包含浮動(dòng)

// HTML
<div class="BFC">
    <div class="box"></div>
    <div class="box"></div>
</div>
// CSS
.BFC {
  border: 3px solid red;
  width: 300px; 
}
.box {
  border: 3px solid blue;
  width: 100px;
  height: 100px;
  float: left;
}

由于子元素浮動(dòng)脫離了文檔流,父元素?zé)o法包含住子元素,觸發(fā)父元素的 BFC,讓父元素包含兩個(gè)子元素。

// CSS
.BFC {
  border: 3px solid red;
  width: 300px; 
  overflow:hidden;
}
.box {
  border: 3px solid blue;
  width: 100px;
  height: 100px;
  float: left;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,114評(píng)論 1 92
  • BFC定義 在解釋BFC之前,先說一下文檔流。我們常說的文檔流其實(shí)分為定位流、浮動(dòng)流和普通流三種。而普通流其實(shí)就是...
    枸杞辣條閱讀 2,932評(píng)論 3 7
  • 先前在學(xué)習(xí)CSS float時(shí),有同學(xué)提到了BFC這個(gè)詞,作為求知好問的好學(xué)生,哪里不懂查哪里,那么今天就來研究一...
    這名字真不對(duì)閱讀 6,684評(píng)論 3 19
  • relative:生成相對(duì)定位的元素,通過top,bottom,left,right的位置相對(duì)于其正常位置進(jìn)行定位...
    zx9426閱讀 1,071評(píng)論 0 2
  • 一、BFC是什么? 它是 Block Formatting Context (塊級(jí)格式化上下文) 的簡(jiǎn)稱,接下來通...
    07120665a058閱讀 3,917評(píng)論 15 40

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