Skip to content

✨ 块级格式化上下文 (BFC) 👌

概念介绍

块级格式化上下文(Block Formatting Context,简称 BFC)是 CSS 中的一个重要概念,它是一块独立的渲染区域,规定了在该区域中常规流块盒的布局规则。

什么是常规流块盒?

常规流块盒是指在正常文档流中的块级元素,它们遵循以下布局特点:

  1. 水平方向:必须撑满其包含块的宽度
  2. 垂直方向:在包含块中依次从上到下摆放
  3. 外边距合并:相邻的外边距会发生合并现象
  4. 忽略浮动:自动高度和摆放位置会无视浮动元素

如何创建 BFC

触发 BFC 的条件

以下 HTML 元素会在其内部创建 BFC 区域:

触发条件说明常用程度
根元素<html>元素,覆盖整个网页默认存在
浮动元素float: left/right⭐⭐⭐
绝对定位元素position: absolute/fixed⭐⭐⭐
overflow 非 visibleoverflow: hidden/auto/scroll⭐⭐⭐⭐⭐
行内块元素display: inline-block⭐⭐
表格相关元素display: table-cell/table-caption

BFC 的特性与作用

核心原理

不同的 BFC 区域在渲染时互不干扰,创建 BFC 的元素会隔绝其内部和外部的联系,内部的渲染不会影响到外部。这种特性使得 BFC 成为解决多种 CSS 布局问题的有效方案。

BFC 的三大特性

1. 包含浮动元素(解决高度塌陷)

问题:父元素的高度无法被浮动的子元素撑开
解决:创建 BFC 的元素,其自动高度会计算浮动元素

示例代码:

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>BFC解决高度塌陷</title>
    <style>
      .container {
        background: lightblue;
        /* 以下三种方式都可以创建BFC,解决高度塌陷 */
        /* position: absolute; */
        /* float: left; */
        /* overflow: hidden; */
      }

      /* 推荐方式:clearfix伪元素清除浮动,副作用最小 */
      .clearfix::after {
        content: "";
        display: block;
        clear: both;
      }

      .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>
  </body>
</html>

效果说明:

  • 未创建 BFC 时:.container 高度为 0,无法包含浮动的 .item 元素
  • 创建 BFC 后:.container 高度会自动计算并包含所有浮动子元素

2. 阻止与浮动元素重叠(实现自适应布局)

问题:常规流元素会被浮动元素覆盖
解决:创建 BFC 的元素,其边框盒不会与浮动元素重叠

示例代码:

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>BFC阻止与浮动元素重叠</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>

效果说明:

  • 未创建 BFC 时:.container 会被浮动元素 .float 覆盖
  • 创建 BFC 后:.container 会自动避开浮动元素,形成自适应的两栏布局

3. 阻止外边距合并(margin collapse)

问题:父子元素或相邻元素的外边距会发生合并
解决:创建 BFC 的元素,不会与其子元素发生外边距合并(外边距合并只发生在同一个 BFC 中)

示例代码:

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>BFC阻止外边距合并</title>
    <style>
      .container {
        background: #008c8c;
        height: 500px;
        margin-top: 30px;
        /* 创建BFC,阻止与子元素外边距合并 */
        overflow: hidden;
      }

      .child {
        height: 100px;
        margin: 50px;
        background: red;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="child"></div>
    </div>
  </body>
</html>

效果说明:

  • 未创建 BFC 时:.childmargin-top 会与 .containermargin-top 合并
  • 创建 BFC 后:.container.child 处于不同的 BFC 中,外边距不会合并

实际应用场景

1. 清除浮动(最常用)

css
/* 方法一:overflow方式 */
.clearfix {
  overflow: hidden; /* 或 auto */
}

/* 方法二:伪元素方式(推荐) */
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}

2. 两栏自适应布局

css
.sidebar {
  float: left;
  width: 200px;
  background: #f0f0f0;
}

.main {
  overflow: hidden; /* 创建BFC,避免被侧边栏覆盖 */
  background: #fff;
}

3. 防止外边距塌陷

css
.wrapper {
  overflow: hidden; /* 创建BFC */
}

.content {
  margin-top: 20px; /* 不会与父元素外边距合并 */
}

最佳实践

选择合适的 BFC 触发方式

场景推荐方式原因
清除浮动overflow: hidden 或伪元素副作用小,兼容性好
两栏布局overflow: hidden简单有效
防止外边距合并overflow: hidden不影响定位
避免使用floatposition: absolute会影响元素正常布局

现代替代方案

随着 CSS 技术发展,某些 BFC 的应用场景已有更好的替代方案:

  • Flexbox 布局:替代浮动布局
  • Grid 布局:替代复杂的多栏布局
  • CSS Containment:更精确的渲染控制
css
/* 现代两栏布局 */
.container {
  display: flex;
}

.sidebar {
  width: 200px;
  flex-shrink: 0;
}

.main {
  flex: 1;
}