BFC 及其應用

這是我參與更文挑戰的第 10 天,活動詳情查看:更文挑戰css

塊格式化上下文(Block Formatting Context,BFC) 是 Web 頁面的可視化 CSS 渲染的一部分。它是佈局過程當中生成塊級盒子的區域,也是浮動元素與其餘元素的交互限定區域。html

BFC 特性

  • BFC 在 Web 頁面上是一個獨立的容器,容器內外的元素互不影響
  • 和標準文檔流同樣,BFC 內的兩個相鄰塊級元素垂直方向的邊距會發生重疊
  • BFC 不會與浮動元素的盒子重疊
  • BFC 在計算高度時會把浮動元素計算進去

觸發 BFC

只要元素知足下面任一條件便可觸發 BFC 特性(詳細):markdown

  • 根元素(<html>
  • 浮動元素(元素的 float 不是 none)
  • 絕對定位元素(元素的 position 爲 absolute 或 fixed)
  • display 爲 inline-block、table-cells、flex、grid...
  • overflow 值不爲 visible 的塊元素(hidden、auto、scroll)
  • ...

BFC 應用

清除浮動

當父元素沒有設置高度,且子元素爲浮動元素的狀況下,父元素會發生高度坍塌,上下邊界重合,即浮動元素沒法撐開父元素。ide

<div class="parent">
  <div class="child"></div>
</div>
複製代碼

給子元素設置浮動:oop

.child {
  float: left;
}
複製代碼

高度塌陷

能夠看到,子元素浮動後,父元素失去了高度。佈局

爲了解決浮動元素形成的父元素高度塌陷問題,能夠將父元素設置成一個 BFC 來清除浮動,將父元素總體設置爲 BFC 環境post

.parent {
  overflow: auto;
}
複製代碼

高度塌陷

查看效果flex

元素浮動後發生重疊

<div class="box1"></div>
<div class="box2"></div>
複製代碼

給第一個盒子 box1 設置浮動:ui

.box1 {
  float: left;
}
複製代碼

元素重疊

能夠看到,因爲 box1 發生浮動,box2 未發生浮動,而浮動元素因爲脫離文檔流,第一個盒子堆疊在第二個盒子上。spa

爲了讓兩個元素不重疊,咱們把右邊的盒子設置成 BFC:

.box2 {  
  overflow: hidden;
}
複製代碼

元素重疊

查看效果

外邊距重疊

在標準文檔流中,毗鄰的兩個或多個塊級元素之間垂直方向的 margin 會合併成一個 margin,會取兩個元素 margin 最大的那一個,這就是外邊距重疊。

有三種狀況會造成外邊距重疊(Margin collapsing):

  • 同一層相鄰元素之間

  • 沒有內容將父元素和後代元素分開

  • 空的塊級元素

而建立了塊級格式化上下文(BFC)的元素,不會和它的子元素髮生 margin 重疊。

咱們能夠使用例如 overflow:hidden 來產生一個 BFC 環境來解決該問題。

<div></div>
<div></div>
複製代碼

給兩個 <div> 元素設置外邊距:

div {
  margin: 50px;
}
複製代碼

外邊距重疊

能夠看到,第一個元素的下邊距和第二個元素的上邊距發生了重疊。

解決邊距重疊的問題,能夠將其放在不一樣的 BFC 容器中。

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

<div class="container">
  <div></div>
</div>
複製代碼

外邊距重疊

由於 BFC 是一個獨立的容器,容器內外互不影響。

查看效果

相關文章
相關標籤/搜索