Skip to content

BFC

全称 Block Formatting Context,简称 BFC 它是一块独立的渲染区域,它规定了在该区域中,【常规流块盒】的布局

常规流特点

  • 常规流块盒在水平方向上,必须撑满包含块
  • 常规流块盒在包含块的垂直方向上依次摆放
  • 常规流块盒若外边距无缝相邻,则进行外边距合并
  • 常规流块盒的自动高度和摆放位置,无视浮动元素

开启 BFC 的方式

BFC 渲染区域: 这个区域由某个 HTML 元素创建,以下元素会在其内部创建 BFC 区域:

  • 根元素
  • 浮动和绝对定位元素
  • overflow 不等于 visible 的块盒

不同的 BFC 区域,它们进行渲染时互不干扰 创建 BFC 的元素,隔绝了它内部和外部的联系,内部的渲染不会影响到外部 浏览器渲染 BFC 区域的时候都是独立渲染的。

BFC 元素的特点

  • 创建 BFC 的元素,它的自动高度需要计算浮动元素 不会再受浮动影响产生高度塌陷

  • 创建 BFC 的元素,它的边框盒不会与浮动元素重叠 本身是 BFC 的元素遇到浮动的元素不会再无视,而会排列其后面

  • 创建 BFC 的元素,不会和它的子元素进行外边距合并 内外边距问题不会再出现,本质原因是因为所处于的 BFC 的区域不同。

示例

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>

    <style>
      .container {
        background: lightblue;
        /* position: absolute; */
        /* float: left; */
        /* 副作用最小的方式 */
        /* overflow: hidden; */
      }

      .clearfix {
        overflow: hidden;
      }

      .item {
        float: left;
        width: 200px;
        height: 200px;
        margin: 20px;
        background: red;
      }
    </style>
  </head>
  <body>
    <div class="container clearfix">
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
      <div class="item"></div>
    </div>
  </body>
</html>
html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      .float {
        width: 200px;
        height: 200px;
        margin: 20px;
        background: red;
        float: left;
      }

      .container {
        height: 500px;
        background: #008c8c;
        /* bfc */
        overflow: hidden; //注意,此处没有设置固定的宽度高度
      }
    </style>
  </head>
  <body>
    <div class="float"></div>
    <div class="container"></div>
  </body>
</html>
html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      .container {
        background: #008c8c;
        height: 500px;
        margin-top: 30px;
        overflow: hidden;
      }
      .child {
        height: 100px;
        margin: 50px;
        background: red;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="child"></div>
    </div>
  </body>
</html>
html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <style>
      .container {
        float: left;
        background: #008c8c;
        position: relative;
      }

      .item {
        /* float: left; */
        position: absolute;
        left: 0;
        top: 0;
        margin: 20px;
        width: 200px;
        height: 200px;
        background: red;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="item"></div>
    </div>
  </body>
</html>

MIT License