BFC 詳解

BFC 定義

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

一個 BFC 是網頁中某個獨立的 CSS 渲染區(qū)域。

w3c 對 BFC 定義

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

BFC 的產生

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

BFC 特性

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

解決margin 合并問題

我們可以把目標元素外層添加一個 div 元素,設置 div 的border-toppadding-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;
}

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

抑制浮動

// 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)建一個新的BFC來解決這個問題,讓其內容消除對外界浮動元素的影響。給 main 類創(chuàng)建一個BFC,使其不受浮動的影響。

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

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

包含浮動

// 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;
}

由于子元素浮動脫離了文檔流,父元素無法包含住子元素,觸發(fā)父元素的 BFC,讓父元素包含兩個子元素。

// CSS
.BFC {
  border: 3px solid red;
  width: 300px; 
  overflow:hidden;
}
.box {
  border: 3px solid blue;
  width: 100px;
  height: 100px;
  float: left;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,786評論 1 92
  • BFC定義 在解釋BFC之前,先說一下文檔流。我們常說的文檔流其實分為定位流、浮動流和普通流三種。而普通流其實就是...
    枸杞辣條閱讀 2,806評論 3 7
  • 先前在學習CSS float時,有同學提到了BFC這個詞,作為求知好問的好學生,哪里不懂查哪里,那么今天就來研究一...
    這名字真不對閱讀 6,572評論 3 19
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 963評論 0 2
  • 一、BFC是什么? 它是 Block Formatting Context (塊級格式化上下文) 的簡稱,接下來通...
    07120665a058閱讀 3,814評論 15 40