1、相关定义
1.1 Formatting context
Formatting context 是 W3C CSS2.1 规定中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block formatting context(简称 BFC)和 Inline formatting context(简称 IFC)。
css2.1 中只有 BFC 和 IFC,css3 中还增加了 GFC 和 FFC。
1.2 BFC 定义
BFC(Block formatting context)直译为“块级格式化上下文”。它是独立的渲染区域,块格式上下文是页面 CSS 视觉渲染的一部分,用于决定块盒子的布局及浮动相互影响范围的一个区域。
1.3 BFC 布局规则:
- 内部的 Box 会在垂直方向,一个接一个地放置;
- Box 垂直方向地距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠
- 每个元素的 margin box 的左边,与包含块 border box 的左边相接触(对于从左往右的格式化,否则相反)。即便存在浮动也是如此。
- BFC 的区域不会与 float box 重叠。
- BFC 就是页面的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算 BFC 的高度时,浮动元素也参与计算。
2、作用
2.1 可生成 BFC 的元素
- 根元素 html;
- 浮动元素(float 属性不为 none);
- 绝对定位元素(position 为 absolute 或 fixed);
- 行内块元素(display 为 inline-block);
- 表格元素(display 为 table-cell,table-caption)
- 弹性盒元素(display 为 flex, inline-flex);
- overflow 不为 visible;
2.2 场景一:对于两栏或三栏浮动自适应布局,包含块边接触问题。
1 | <style> |
中间自适应栏边界会延展左右浮动区域
此时需要把中间栏变成 BFC
1 | .left-center-right.float .center { |
2.3 场景二:子级元素有浮动,父级元素塌陷问题
1 | <style> |
此时需要将父级元素变成 BFC
1 | .all-children-float { |
2.3 场景三:垂直方向 margin 出现重合
1 | <style> |
Box 垂直方向的距离 margin 决定,属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠。
我们的做法是包一层标签,并转化成 BFC。
1 | .wrapper1 { overflow: hidden; } |