博客 / 詳情

返回

通過例子講解BFC

BFC的基本概念

塊格式化上下文(Block Formatting Context,BFC) 是Web頁面的可視化CSS渲染的一部分,是塊盒子的佈局過程發生的區域,也是浮動元素與其他元素交互的區域。 ——來自MDN

如何創建BFC

下列方式會創建塊格式化上下文
  • 根元素(<html>)
  • 浮動元素(元素的 float 不是 none
  • 絕對定位元素(元素的 positionabsolutefixed
  • 行內塊元素(元素的 displayinline-block
  • 表格單元格(元素的 displaytable-cell,HTML表格單元格默認為該值)
  • 表格標題(元素的 displaytable-caption,HTML表格標題默認為該值)
  • 匿名錶格單元格元素(元素的 displaytable、`table-rowtable-row-group、table-header-group、table-footer-group(分別是HTML table、row、tbody、thead、tfoot的默認屬性)或 inline-table`)
  • overflow 值不為 visible 的塊元素
  • display 值為 flow-root 的元素 , 可以創建無副作用的BFC(火狐53+,chrome58+,opera45+支持)
  • contain 值為 layoutcontent或 paint 的元素
  • 彈性元素(displayflexinline-flex元素的直接子元素)
  • 網格元素(displaygridinline-grid 元素的直接子元素)
  • 多列容器(元素的 column-countcolumn-width 不為 auto,包括 `column-count1`)
  • column-spanall 的元素始終會創建一個新的BFC,即使該元素沒有包裹在一個多列容器中(標準變更,Chrome bug)。

BFC的使用場景(通過例子講解)

  • 清除浮動

    css

    .box {
        border: 1px solid #f00;
        // 觸發BFC, 以下任意一種
        overflow: hidden;
        /* overflow: auto; */
        /* position: absolute; */
        /* position: fixed; */
        /* display: table; */
        /* display: flex; */
    }
    
    .fl {
        float: left;
        width: 50px;
        height: 50px;
        background: #0f0;
        margin: 5px;
    }

    html

    <div class="box">
        <div class="fl"></div>
        <div class="fl"></div>
        <div class="fl"></div>
    </div>
    效果展示

    BFC清除浮動

  • 解決外邊距塌陷

    創建新的BFC避免兩個相鄰 <div> 之間的 外邊距合併 問題

    下面代碼:

    三個p標籤,距離上方15px, 下方20px
    p {
      margin: 15px auto 20px;
      background: #f00;
    }

    html

    <div class="bfc-container">
      <p>1</p>
      <p>2</p>
      <p>3</p>
    </div>
    效果展示

    邊距重疊)

    兩個p標籤之間的高度為20px, 並不是 20+15 = 45 px, 這就是邊距重疊,選擇最大的一個邊距,及20px

    解決方法就是給p標籤一個父元素,並創建BFC

    css

    p {
        margin: 15px auto 20px;
        background: #f00;
    }

    html

    <p>1</p>
    <div style="overflow: hidden;">
        <p>2</p>
    </div>
    <p>3</p>

    給中間的p標籤的父級元素添加BFC

    這時候,中間的元素邊距不會發生重疊,此時的間距就是 45px

    大家可以去嘗試一下

參考文檔:

  • MDN
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.