8.6 margin折叠的规范规则

相邻盒子之间的垂直margin间距会发生折叠(margin collapse)。主要包括两类场景:相邻父子margin折叠、相邻兄弟margin折叠。无论什么场景,水平方向的margin总是不会折叠,各方向padding总是不会折叠。


8.6.1 发生margin折叠的基本条件

下述各条件需同时成立。

条件1:两个盒子属于同一个BFC。

条件2:两个盒子相邻。

条件3:两个盒子的垂直margin相邻,包括:margin-top相邻或margin-bottom相邻。条件2是条件3的前提条件,满足条件3一定满足条件2。更多条件见后续。


8.6.2 margin折叠的具体场景

(1)相邻父子 margin-top折叠。父元素margin-top与第一个子元素margin-top相邻。

(2)相邻父子 margin-bottom折叠。父元素margin-bottom与最后一个子元素margin-bottom相邻。

(3)相邻兄弟margin折叠。上方元素margin-bottom与下方元素margin-top相邻。

(4)高度为0的元素自身margin折叠。一个盒子的实际高度等于0、且内部没有正常流定位元素,盒子自身的margin-top与margin-bottom折叠。


8.6.3 margin折叠的计算公式

(1)如果两个正值,取大值。例如A margin-top=10,B margin-top=20,则结果为20。

(2)如果两个负值,取小值。例如A margin-top=-10,B margin-top=-20,则结果为-20。

(3)如果一正一负,取和。例如A margin-top=-10,B margin-top=20,则结果为10。