Skip to content

BFC(块级格式化上下文)

参与 BFC 的元素使用 CSS 框模型概述的规则,该模型定义了元素的边距、边框和填充如何与同一 上下文中的其他块交互。

形成BFC的条件

  • 根元素 <html>

  • 使用 float 使其浮动的元素

  • 绝对定位的元素,position 值为 fixed、sticky

  • display 为以下其中之一的值

    • inline-block

    • table-*

    • display: flow-root

    • display: flow-root list-item

  • flex container 的一级子元素 flex-items;

  • overflow 除了 visible 以外的值

BFC 的 特性

  • 内部的块元素会在垂直方向上一个接一个的放置,距离由 margin 决定(导致外边距折叠)。

  • BFC 区域不会与 float 的元素区域重叠(实现两栏布局、三栏布局,解决文字环绕)。

  • 计算 BFC 的高度时,浮动元素也参与计算(解决高度塌陷)。

  • BFC 是页面上的一个独立容器,容器里面的子元素不会影响外面元素。

应用

  • 外边距重叠

    当两个 div 元素处于同一个 BFC(这里是 html 元素)下时,会发生外边距折叠,可以将 div 放在不同的 BFC 中避免外边距重叠。

    html
    <style>
      .container {
        background-color: skyblue;
        display: flow-root;
      }
      .item-1 {
        background: pink;
        margin-bottom: 100px;
      }
      .item-2 {
        background: pink;
        margin-top: 100px;
      }
    </style>
    
    <div class="container">
      <div class="item-1">Lorem ipsum dolor sit amet.</div>
    </div>
    <div class="container">
      <div class="item-2">Lorem ipsum dolor sit amet.</div>
    </div>
  • 两栏布局、三栏布局

  • 文字环绕

    html
     <style>
      .container {
        width: 500px;
        background-color: skyblue;
        /* display: flow-root; */
      }
      .item-1 {
        background: orange;
        /* 开启浮动,浮动元素覆盖了 item-2 */
        float: left;
      }
      .item-2 {
        background: pink;
        /* 开启 BFC,BFC 区域不会与 float 的元素区域重叠,解决文字环绕 */
        display: flow-root;
      }
    </style>
    <div class="container">
      <div class="item-1">Lorem ipsum dolor sit amet.</div>
      <div class="item-2">Lorem, ipsum dolor sit amet consectetur adipisicing elit. Facilis, minus.</div>
    </div>
  • 高度塌陷

    html
    <style>
      #container {
        background-color: skyblue;
    
        /* 创建一个 BFC,不会产生任何副作用。 */
        display: flow-root;
      }
    
      #bfc {
        background: orange;
        height: 50px;
    
        /* container 高度由子元素撑开,开启浮动,脱离文档流,高度塌陷。 */
        float: left;
      }
    </style>
    
    <div id="container">
      <div id="bfc">Lorem ipsum dolor sit amet.</div>
      <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Repellat, nisi.</p>
    </div>