# BFC

块级格式化上下文(Block formatting contexts)。它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。通俗的讲,就是一个特殊的块,内部有自己的布局方式,不受外边元素的影响。

在 BFC 中,在包含块内一个盒子一个盒子不重叠地垂直排列,两个兄弟盒子直接的垂直距离由 margin 决定。浮动也是如此(虽然有可能两个盒子的距离会因为 floats 而变小),除非该盒子再创建一个新 BFC。

# 原理

BFC 原理,渲染规则:

  • 内部的 Box 会在垂直方向一个个排列
  • 垂直方向上的距离由 margin 决定。(完整的说法是:属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠(塌陷),与方向无关。margin 水平方向不会发生重叠)
  • 每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。(这说明 BFC 中子元素不会超出他的包含块,而 position 为 absolute 的元素可以超出他的包含块边界)
  • BFC 的区域不会与 float 的元素区域重叠
  • 计算 BFC 的高度时,浮动子元素也参与计算
  • BFC 就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然

# 产生条件

以下条件会创建新的 BFC:

  • 根元素, HTML 元素本身就是 BFC
  • 浮动元素:float 属性不为 none(脱离文档流,浮动元素)
  • 绝对定位元素:position 属性为 absolute 或 fixed (绝对与固定定位)
  • 非块级盒子的块级容器:display 属性为 inline-block、table-cell、table-caption、flex、inline-flex、grid、inline-grid、flow-root(最佳,无副作用),定义成块级的非块级元素。
  • overflow 属性不为 visible(- overflow: auto/ hidden),非溢出的可见元素。

注意

是这些元素创建了块格式化上下文,它们本身不是块格式化上下文。

# 使用 BFC

# 自适应两栏布局

利用 BFC 的这一个原理就可以实现两栏布局,左边定宽,右边自适应。不会相互影响,哪怕高度不相等。BFC 的区域不会和浮动区域重叠,所以就可以把侧边栏固定宽度且左浮动,而对右侧内容触发 BFC,使得它的宽度自适应该行剩余宽度。

# 解决垂直外边距重叠问题

防止垂直 margin 合并

  • 父子元素垂直外边距重叠问题
  • 相邻元素垂直外边距重叠问题

同一个 BFC 下的垂直 margin 会发生合并。所以如果让 2 个元素不在同一个 BFC 中即可阻止垂直 margin 合并。

# 清除内部浮动

浮动造成的问题就是父元素高度坍塌,所以清除浮动需要解决的问题就是让父元素的高度恢复正常。而用 BFC 清除浮动的原理就是:计算 BFC 的高度时,浮动元素也参与计算。只要触发父元素的 BFC 即可。

  • 浮动元素造成父元素高度坍塌问题
  • 兄弟间,浮动元素与不浮动元素界限不清,重叠

# 参考资料

学习 BFC (Block Formatting Context) (opens new window)

BFC知识点详解 (opens new window)

CSS中重要的BFC (opens new window)