FC (Formatting Context)
格式化上下文
是页面中的一块渲染区域,并且有一套渲染规则,决定了子元素如何定位,以及与其他元素的关系及相互作用。
BFC (Block Formatting Context)
块级格式化上下文
指的是一块独立的布局区域,盒子内部元素的布局与外部不会互相影响。
触发方式
- 根元素(
<html>
)。 - 浮动元素(
float
不为none
)。 - 绝对定位元素(
position
为absolute/fixed
)。 overflow
不为visible
的元素。display
为inline-block/table-cell/flex
的元素。
布局规则
- 内部的盒子会在垂直方向,一个接一个地放置。
- 盒子垂直方向的距离由
margin
决定。属于同一个BFC
的两个相邻盒子的margin
会发生重叠。 - 每个元素的左边, 与包含的盒子左边相接触,即使存在浮动也是如此。
BFC
的区域不会与float
盒子重叠。BFC
就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。- 计算
BFC
的高度时,浮动元素也参与计算。
应用场景
- 自适应两栏布局(左浮动 + 右BFC)。
- 避免
margin
重叠问题(触发新的BFC)。 - 解决父元素高度坍塌问题(父容器触发BFC)。
- 清除浮动(父容器触发BFC)。
IFC (Inline Formatting Context)
内联格式化上下文
指的是内联盒子的渲染区域,行内盒子按照水平方向排列。
触发方式
- 块级元素中仅包含内联级别元素。
布局规则
- 在一个
IFC
内,子元素是水平方向横向排列的,并且垂直方向起点为元素顶部。 - 子元素只会计算横向样式空间(
padding
、border
、margin
),垂直方向样式空间不会被计算。 - 在垂直方向上,子元素会以不同形式来对齐
vertical-align
- 能把在一行上的框都完全包含进去的一个矩形区域,被称为该行的行框(
line box
)。行框的宽度是由包含块(containing box
)和与其中的浮动来决定。 IFC
中的line box
一般左右边贴紧其包含块,但float
元素会优先排列。IFC
中的line box
高度由CSS
行高计算规则来确定,同个IFC
下的多个line box
高度可能会不同。- 当
inline boxes
的总宽度少于包含它们的line box
时,其水平渲染规则由text-align
属性值来决定。 - 当一个
inline box
超过父元素的宽度时,它会被分割成多个boxes
,这些boxes
分布在多个line box
中。如果子元素未设置强制换行的情况下,inline box
将不可被分割,将会溢出父元素。
应用场景
- 行内元素水平排列。
- 图标与文字垂直居中。
GFC (Grid Formatting Context)
网格格式化上下文
指的是通过display: gird
创建的二维布局结构,由网格容器控制子项位置。
触发方式
- 元素设置
display
值为grid
或者inline-grid
。
布局规则
- 通过在
网格容器(grid container)
上定义网格定义行(grid-template-rows)
和网格定义列(grid-template columns)
属性定义行和列的大小和数量。 - 使用
gap
属性何止行和列之间的间距。
应用场景
- 响应式网页骨架。
- 复杂仪表盘。
- 杂志式布局。
FFC (Flexible Formatting Context)
弹性格式化上下文
指的是通过display: flex
创建的一维弹性容器,按主轴/侧轴分配子项空间。
触发方式
- 元素设置
display
值为flex
或者inline-flex。
布局规则
- 设置为
flex
的容器被渲染为一个块级元素。 - 设置为
inline-flex
的容器被渲染为一个行内元素。 - 弹性容器中的每一个子元素都是一个弹性项目。弹性项目可以是任意数量的。弹性容器外和弹性项目内的一切元素都不受影响。简单地说,
Flexbox
定义了弹性容器内弹性项目该如何布局。
应用场景
- 卡片式布局。
- 自动撑开剩余宽度/高度布局。
相关问题
flex: 1代表什么
flex:1
是flex-grow: 1; flex-shrink:1; flex-basis: 0%;
的缩写。
- flex-grow:定义项目如何分配多余空间;默认为0(有剩余空间也不放大);为1时会占据剩余空间。
- flex-shrink:定义项目在空间不足时如何收缩;默认为1(空间不足时缩小);为0时空间不足也不缩小。
- flex-basis:定义项目的基础大小;项目占据的主轴空间。默认值为 auto,表示项目的大小由其内容决定;为0时,项目的初始化大小不考虑内容大小。