塊級格式化上下文(BFC)


一、什么是BFC

具有BFC屬性的元素也屬於普通流定位方式,與普通容器沒有什么區別,但是在功能上,具有BFC的元素可以看做是隔離了的獨立容器,容器里面的元素不會在布局上影響到外面的元素,並且具有普通容器沒有的一些特性,比如包含浮動元素,以防止出現高度塌陷問題。

總之,BFC就是一種屬性,這種屬性會影響着元素的定位及與其兄弟元素之間的相互作用。

二、BFC的用途

從整體上看,BFC是隔離了的容器:

1、BFC會阻止外邊距折疊

折疊:兩個相鄰的盒子(可能是兄弟關系也可能是祖先關系)的垂直外邊距可以合並成一個單獨的垂直外邊距。這種合並外邊距的方式被稱為折疊。

在同一個BFC中,兩個相鄰的塊級元素在垂直方向上的外邊距會發生疊加,具體的疊加規則如下:

  • 當兩個塊級元素的外邊距都為正數時,取較大者
  • 當兩個塊級元素的外邊距都為負數時,取較大者
  • 當一正一負時,為兩者的和

    根據上面的定義可知,發生折疊的條件是:兩個塊級元素位於同一個BFC中,因而要阻止外邊距折疊只需要產生新的BFC。

    創建了BFC的元素,不和它的子元素發生外邊距折疊。 因而如果同一級中的塊級元素發生折疊情況(兄弟關系),不能在元素本身上產生BFC屬性,而應該給任意一個元素新建一個BFC容器(新增父級元素並設置為新的BFC,例如設置overflow:hidden;)。如果是祖先關系,則只需要觸發父級BFC。

A、兄弟關系外邊距折疊

<!--兄弟關系折疊-->
<head>
  <style>
    div:nth-child(1){
      margin:20px;
    }
    div:nth-child(2){
      margin:40px;
    }
    div:nth-child(3){
      margin:20px;
    }
  </style>
</head>
<body>
  <div style="width:100px;height:100px;background:#123;"></div>
    
  <div style="width:100px;height:100px;background:#496;"></div>

  <div style="width:100px;height:100px;background:#789;"></div>
</body>

圖片描述

/*兄弟關系阻止折疊方法*/
<head>
  <style>
    .newBFC{
      margin:40px;
      overflow: hidden;
    }
  </style>
</head>
<body>
  <div style="width:100px;height:100px;background:#123;margin:20px;"></div>
  <!-- newBFC類表示的仍然和上下兩個div在同一個BFC容器中,因而仍舊會發生外邊距折疊。不過其子元素已經位於另外一個BFC容器中,其與父元素的邊距不會折疊 -->
  <div class="newBFC">
    <div style="width:100px;height:100px;background:#496;margin:20px;"></div>
  </div>
  <div style="width:100px;height:100px;background:#789;margin:20px;"></div>
</body>

圖片描述

B、祖先關系折疊

<!--外層div與內層div的垂直外邊距margin合並了-->
<div style="margin:30px">
  <div style="width:100px;height:100px;background:red;margin:30px"></div>
</div>

圖片描述

<!--將觸發父級BFC屬性,就不會合並垂直外邊距了-->
<div style="margin:30px;overflow:hidden;">
  <div style="width:100px;height:100px;background:red;margin:30px"></div>
</div>

圖片描述

2、BFC可以包含浮動元素

<div style="border:2px solid red;">
  <div class="child" style="width:100px;height:100px;background:#565;"></div>
</div>

未給child加float屬性前:
圖片描述

給child加float屬性后:

圖片描述

從上面兩個對比圖可以發現,加了float屬性后,包含child類的div脫離普通/標准文檔流,外層div高度塌陷。

觸發BFC

<div style="border:2px solid red;overflow: hidden;">
    <div style="width:100px;height:100px;background:#565;float: right;"></div>
</div>

圖片描述

使用overflow: hidden;觸發BFC屬性,就可以承載具有float屬性的元素了。

3、BFC可以阻止元素被浮動元素覆蓋

浮動元素的塊級兄弟元素會無視浮動元素的位置,盡量占滿一整行,這樣就會被浮動元素覆蓋,為該兄弟元素觸發BFC后可以阻止這種情況的發生。經常在布局中使用。

<div style="width:100px;height:300px;background-color: #860;float: left;"></div>
<div style="width:400px;background-color: #395;">
  <p>222</p><p>222</p><p>222</p><p>222</p><p>222</p><p>222</p>
  <p>222</p><p>222</p><p>222</p><p>222</p><p>222</p><p>222</p>
  <p>222</p><p>222</p><p>222</p><p>222</p><p>222</p><p>222</p>
</div>

圖片描述

觸發BFC

<div style="width:100px;height:300px;background-color: #860;float: left;"></div>
<div style="width:400px;background-color: #395;overflow: hidden;">
  <p>222</p><p>222</p><p>222</p><p>222</p><p>222</p><p>222</p>
  <p>222</p><p>222</p><p>222</p><p>222</p><p>222</p><p>222</p>
  <p>222</p><p>222</p><p>222</p><p>222</p><p>222</p><p>222</p>
</div>

圖片描述

三、如何觸發BFC

  • 浮動元素:float除none以外的值
  • 絕對定位元素:position(absolute、fixed)
  • display為以下其中之一的值inline-block、flex、inline-flex、table-cell、table-caption
  • overflow除了visible以外的值(hidden、auto、scroll)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM