什么是 BFC
BFC 块格式化上下文 (Block Formatting Context)
块格式化上下文(Block Formatting Context),它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用
当涉及到可视化布局的时候,BFC 提供了一个环境,HTML 元素在这个环境中按照一定规则进行布局。
一个环境中的元素不会影响到其它环境中的布局。比如浮动元素会形成 BFC,浮动元素内部子元素的主要受该浮动元素影响,两个浮动元素之间是互不影响的。
下列方式会创建块格式化上下文:
- 根元素或包含根元素的元素
- 浮动元素(元素的 float 不是 none)
- 绝对定位元素(元素的 position 为 absolute 或 fixed)
- 行内块元素(元素的 display 为 inline-block)
- 表格单元格(元素的 display 为 table-cell,HTML 表格单元格默认为该值)
- 表格标题(元素的 display 为 table-caption,HTML 表格标题默认为该值)
- 匿名表格单元格元素(元素的 display 为 table、table-row、 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 或 strict 的元素
- 弹性元素(display 为 flex 或 inline-flex 元素的直接子元素)
- 网格元素(display 为 grid 或 inline-grid 元素的直接子元素)
- 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)
- column-span 为 all 的元素始终会创建一个新的 BFC,即使该元素没有包裹在一个多列容器中(标准变更,Chrome bug)
加粗的地方尤其常用, 可用来清除浮动带来的高度塌陷;
外边距折叠
块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并。注意浮动元素和绝对定位元素的外边距不会折叠。
可以看到, 需要满足以下条件:
- 块级元素 ( 特意写出来, 是因为要注意 inline-block 有块级元素的一部分特性, 但属于行内元素 - MDN 行内元素列表 )
- 非浮动元素
- 非绝对定位元素
- 上下外的边距 (也就是说左右是不会折叠的)
- 相邻, 也就是可以是兄弟, 也可以是父子
所以这里又有一个分类,也就是外边距折叠有两个细分:
- 兄弟折叠: 相邻兄弟元素外边距折叠
- 父子折叠: 父子外边距折叠
那怎么消除外边距折叠呢?
- 浮动
- inline-block
- 绝对定位
- 创建 BFC
这里要注意:
创建 BFC,消除的是父子折叠, 兄弟折叠可不一定, 如 overflow:hidden, display:flex 等等, 仍会与相邻兄弟发生折叠
创建 BFC 的方式有非常多种,而浮动元素、inline-block 元素、绝对定位元素, 只是其中的三种, 这三种恰好又是用于消除外边距折叠的方式, 所以, 消除外边距折叠,有创建BFC这个方法,这种方法消除的是父子折叠, 但反过来, 不能说创建了BFC一定能消除外边距折叠
,也就是说, 消除折叠的方法, 是创建BFC方法的子集