CSS 盒模型
display
level | box | display | formatting context |
---|---|---|---|
block-level | block box | block | BFC |
list-item box | list-item | ||
table box | table | ||
flex box | flex | ||
grid box | grid | ||
inline-level | atomic inline-level box | inline-block, inline-table, inline-flex, inline-grid | BFC/IFC(透明) |
inline box | inline | IFC | |
CSS 对其归属说得比较模糊,毕竟在 CSS 诞生前 table 就存在了。可以简单理解为(特殊的)block-level | table-row-group (tbody), table-header-group (thead), table-footer-group (tfoot), table-row (tr), table-column-group (colgroup), table-column (col), table-cell (td, th),table-caption (caption) | TFC(CSS2.2), 在 CSS2.1 中是 BFC,还没有 TFC 的概念 | |
others | none, initial, inherit, unset |
https://developer.mozilla.org/zh-CN/docs/Web/Guide/HTML/HTML5/HTML5_element_list

图:CSS3 盒模型
block-level box

inline-level box
inline-level box 包括 inline
, inline-table
和 inline-block
。 inline-level
元素生成 inline-level box,inline-level box 参与 IFC。
inline box 是一种特殊的,display
值为 inline
的非替换元素会生成一个 inline box,不参与生成行内格 式化上下文的行内级盒称为原子行内级盒。
margin
margin 合并(重叠) 3 种场景:
- 相邻兄弟元素 margin 合并
- 父元素和第一个/最后一个子元素 margin 合并
- 空块级元素 margin 合并
margin 合并与 BFC
BFC 中有两条规则和 margin 合并相关:
- 产生兄弟合并:垂直方向属于同一个 BFC 里的元素 垂直方向 margin 合并。
- 解决父子合并:BFC 就是页面上的一个隔离的独立容器,里外互相不影响,产生了一种“结界”效果。
margin 合并的计算规则
- 正正取大值
- 正负值相加
- 负负最负值
父子合并
意义
在页面中任何地方嵌套或直接放入任何空白 <div>
,都不会影响原来的块状布局。 <div>
是网页布局中非常常用的一个元素,其语义是没有语义,也就是不代表任何特定类型的内容,是一个通用型的具有流体特性的容器,可以用来分组或分隔。由于其作用就是分组的,因此,从行为表现上来看,一个纯粹的 <div>
元素是不能够也不可以影响原先的布局的。现在有如下一段 HTML:
<div style="margin-top:20px;"></div>
请问: 现在要在上面这段 HTML 的外面再嵌套一层 <div>
元素,假如说现在没有父子 margin 合并,那这层新嵌套的 <div>
岂不阻断了原本的兄弟 margin 合并?很有可能间距就会变大, 妥妥地影响了原来的布局,这显然就违背了 <div>
的设计作用了。所以才有了父子 margin 合 并,外面再嵌套一层 <div>
元素就跟没嵌套一样,表现为 margin-top:20px
就好像是设置在 最外面的 <div>
元素上一样。

请看以下三种写法:
<div style={{ marginTop: '20px', backgroundColor: 'ffa39e' }}> <div style={{ backgroundColor: '#91d5ff' }}>子元素</div> </div>
<div style={{ backgroundColor: 'ffa39e' }}> <div style={{ marginTop: '20px', backgroundColor: '#91d5ff' }}>子元素</div> </div>
<div style={{ marginTop: '20px', backgroundColor: 'ffa39e' }}> <div style={{ marginTop: '20px', backgroundColor: '#91d5ff' }}>子元素</div> </div>
我们会发现,这三种写法,竟然最终的渲染效果是一样的:margin-top 最终都作用在了父元素上。