当前位置: 首页 > Web前端 > CSS

深入CSSmargincollapse(边距折叠)详解

时间:2023-03-31 01:56:16 CSS

什么是margincollapse准确的说,margincollapse应该叫verticalmargincollapse,因为它只发生在垂直方向,而不会发生在水平方向。下面简单的html代码和css代码,topblock和bottomblock之间的垂直间距是多少px?

.block{width:100px;高度:100px;background-color:lightgray;}.top{margin-bottom:20px;}.bottom{margin-top:30px;}如果不理解margincollapsing,那么你会想:spacing=margin-bottomoftopblock+margin-topofbottomblock  =20px+30px=50px但实际情况是:这是(垂直)边距折叠。折叠外边距的定义:块的顶部和底部边距有时会合并(折叠)成单个边距,其大小是单个边距中最大的(或者只是其中一个,如果它们相等),这种行为称为边距崩溃。请注意,浮动元素和绝对定位元素的边距永远不会折叠。翻译过来就是:块级元素的上边距和下边距在某些情况下会合并(折叠),合并后的尺寸会是一个更大的边距。请注意,浮动元素和绝对定位元素的边距永远不会折叠。发生margincollapse的条件是什么1.(垂直方向)两个相邻的元素这种情况很好理解,就是上面例子给出的情况。这里要注意一点,所谓相邻是指渲染后元素相邻的位置,而不是相邻的dom结构,也就是说如果代码:
改为
虽然加了一层div包裹,但外边距还是会塌陷。2.考虑父元素和第一个/最后一个子元素之间的以下代码:.parent{margin-top:30px;}.child{margin-top:20px;宽度:50px;高度:50px;background-color:lightgray;}父块有margin-top:30px;子块有margin-top:20px;那么从第一个子元素到顶部的距离是50px吗?不是,由于margincollapse的存在,collapse之后的距离是30px。折叠后外边距的大小1、两个大小相同的正数:取某一个外边距的值。即30px和30px折叠,折叠后的值为30px。2、两个大小不同的正数:取外边距中较大的那个值。即折叠30px和20px,折叠后的值为30px。3、一正一负:取正数和负数之和。即30px和-20px折叠,折叠后的值为10px。4.Negativenumbersofsamesize:与正数大小相同。-30px折叠为-30px,折叠为-30px。5、不同大小的负数:取绝对值较大的负数。-30px折叠为-20px,折叠为-30px。想要保证金不崩塌怎么办?1.曲线救国,如果想要垂直方向两个块之间的间距为50px,可以设置上块margin-bottom:50px;而不是30px+20px;.2.根据BFC(blockformattingcontext)块级格式化上下文防止边距折叠。你可以尝试在本文给出的第一个例子中设置topblock:display:inline-block;形成一个BFC。这样就不会再发生边距崩溃。我在实验中发现,设置display:inline-block后,期望的间距是50px,但实际情况是这样的:原来是54px,那么多出来的4px是从哪里来的呢?如何处理多出来的4px?这里就不解释了,留个坑,在另一篇文章中解释《inline-block产生的看不见的空间》。至于怎么处理,只需要加上font-size:0;到容器,你会得到我们想要的50px。