块格式化上下文BFC

593 阅读2分钟

1. 什么是BFC

MDN上的概念:

块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

  • 对象:块级元素
  • 本质:是一个区域

2 如何创建BFC

便与记忆的一种强行解释:创建一个独立的块级区域。
MDN上列举的方法:

  • 根元素(<html>)
  • 浮动元素(元素的 float不是 none
  • 绝对定位元素(元素的 position为 absolute 或 fixed
  • 行内块元素(元素的displayinline-block
  • 表格单元格(元素的 display为 table-cell,HTML表格单元格默认为该值)
  • 表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)
  • 匿名表格单元格元素(元素的 display为 table、table-row、 table-row-grouptable-header-grouptable-footer-group(分别是HTML table、row、tbody、thead、tfoot的默认属性)或 inline-table
  • overflow 值不为 visible 的块元素
  • display 值为 flow-root 的元素
  • contain 值为 layoutcontentpaint 的元素
  • 弹性元素(display为 flex 或 inline-flex元素的直接子元素)
  • 网格元素(display为 grid 或 inline-grid 元素的直接子元素)
  • 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1
  • column-span 为 all 的元素始终会创建一个新的BFC,即使该元素没有包裹在一个多列容器中。

3 BFC应用

3.1 float布局导致父元素塌陷

范例:

<!DOCTYPE html>

<head>
  <style>
    .father {
      background-color: rgb(224, 206, 247);
      border: 5px solid rebeccapurple;
      width: 100px;
    }

    .child {
      border: 1px solid black;
      height: 80px;
      width: 200px;
      float: left;
    }
  </style>
</head>

<body>
  <div class="father">
    <div>普通子元素</div>
    <div class="child">浮动子元素</div>
  </div>
</body>

当子元素中使用了float后,子元素脱离文档流,父元素会无视该元素。因此会出现塌陷情况,将父元素变成BFC可解决该问题。 常用方法:

  1. after清除浮动
.father:after {
  display: block;
  content: '';
  clear: both;
}

缺点:添加额外元素
2. 将父元素转化为BFC

  • overflow: hidden缺点:有副作用。
  • display: flow-root缺点:有兼容性问题。

参考文档

developer.mozilla.org/zh-CN/docs/…