Codog

关注微信公众号:Codog代码狗

0%

如何理解BFC

MDN定义:

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

常见场景:

  • 容器内部存在float元素,导致容器高度与“实际”不符;如果下方跟着别的元素,会造成布局混乱。

image

如图,红色边框为容器,内部元素设置float导致容器塌陷。

解决方式:父容器设置overflow: hidden,创建BFC。

  • 上下元素分别设置margin,实际边距缩小,常说的margin塌陷
1
2
3
4
5
6
7
8
9
10
<style>
section{
width: 50px;
height: 50px;
background: lightblue;
margin: 50px;
}
</style>
<section></section>
<section></section>

image

解决方式:可以为元素增加一层父容器,并设置父容器overflow: hidden,创建BFC;父容器设置border、padding也可以解决此类问题。

创建BFC的方式有很多:(摘自MDN)

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

常用的就是设置overflow为auto或hidden了,影响较小。

参考内容:
https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Block_formatting_context