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

深入理解CSS边距折叠(MarginCollapse)

时间:2023-03-30 17:23:11 CSS

MarginCollapse一直是前端开发必须了解的一个概念,面试中一般都会问到这个问题。所以整理一下margin叠加相关的知识点。什么是保证金叠加?保证金叠加何时发生?如何避免重叠边距?什么是MarginOverlay让我们看一下W3C对MarginOverlay的定义:在CSS中,两个或多个框(可能是也可能不是兄弟)的相邻边距可以组合形成一个边距。以这种方式合并的边距被称为折叠边距,由此产生的合并边距称为折叠边距。大致意思是:在CSS中,两个或多个正常流动的盒子(可能是父子元素,或者兄弟元素)在垂直方向上的边距会重叠,这种形成的边距称为边距堆叠。我们可以注意到定义中的几个关键词:adjacency、twoormore、verticalorientation、normalflow。相邻以相邻说明它们的位置关系,不以padding、border、clear和linebox隔开。两个或多个两个或多个框是指元素之间的交互,单个元素不会有边距重叠。垂直水平边距永远不会折叠。只有垂直边距会重叠。水平边距不重叠。普通流量(inflow)什么是普通流量?W3C只定义了流外:如果元素是浮动的、绝对定位的或者是根元素,则称为流外。如果一个元素不是流出的,则它被称为流入流。从定义我们可以知道,只要不是浮动的、绝对定位的、根元素的,就是在流中。什么时候会发生保证金叠加?边距堆叠有两种情况:一种是父子边距堆叠;另一种是兄弟边缘堆叠。W3C也有关于什么是相邻边距的定义:两个边距是相邻的,当且仅当:-都属于参与同一块格式化上下文的流入块级框-没有行框,没有间隙,没有填充和没有边界将它们分开-都属于垂直相邻的盒子边缘,即形成以下对之一:盒子的顶部边缘和它的第一个流入子的顶部边缘盒子的底部边缘和它的下一个流入的顶部边缘如果>父级具有“自动”计算的高度,则最后一个流入子级的同级底部边距及其父级的底部边距没有建立新块格式化上下文且计算的“最小高度”为零的框的顶部和底部边距",zeroor"auto"computed"height",andnoin-flowchildren从定义中,我们可以清楚地知道必须满足哪些条件才能导致margincollapse:它们都属于普通流的block-levelboxes,参与相同的块级格式化上下文没有被padding、border、clear和linebox分隔的都是垂直相邻的盒子边缘:盒子的topmargin和它的第一个normalflow子元素的topmargin盒子的bottommargin和它的下一个normal流的bottommargin流兄弟的上边距框和其父元素的下边距框child的topmargin和bottommargin,不新建块级格式上下文,min-height计算为0,height计算为0或auto,无正常流子元素Demo1.parent1{高度:20px;背景:黄色;margin-bottom:20px;}.parent2{margin:20px030px;}.parent3{height:20px;背景:绿色;margin-top:20px;}.child{背景:红色;高度:20px;边距:40px030px;

在这个demo中,.parent2和第一个.child的topmargin是叠加的,margin之间.parent1和.parent2是40px。Demo2还是用上面的代码,.parent2中的.child中的topmargin和bottommargin重叠,两者之间的margin为40px。Demo3还是上面的代码,.parent2中的最后一个.child有一个bottommargin叠加,.parent2和.parent3之间的margin是30px。演示4.demo{height:30px;background:red;}.margin-test{margin:20px030px;这个demo就是上面的第四种情况,元素本身的top和bottommargin都被折叠了,我们可以看到.container的高度是90px,这里你可以看到margin-test的顶部和底部边距被折叠了。如何避免边距重叠上面提到的边距重叠,如何避免,其实只是破坏了上面提到的四个条件中的任何一个:相邻、两个或多个、正常流向和垂直方向。W3C也这样做了总结论:浮动框和任何其他框之间的边距不会折叠(甚至在浮动框和它的流入子元素之间也不折叠)。建立新的块格式上下文的元素的边距(例如浮动和元素与“溢出”而不是“可见”)不会与它们的流入孩子一起折叠。绝对定位框的边距不会折叠(即使是它们的流入孩子)。内联块框的边距不会折叠(甚至不会与它们的流入子级)。流入块级元素的底部边距总是与其下一个流入块级兄弟的顶部边距折叠,除非该兄弟有间隙。流入的顶部边距-如果元素没有顶部边框,没有顶部填充,并且孩子没有间隙,则流块元素会折叠其第一个流入块级子元素的上边距。带有“的流入块框的底部边距“自动”的“高度”和零的“最小高度”随着最后一次流入而崩溃块级子项的底部边距,如果框没有底部填充和底部边框,并且子项的底部边距不会与具有间隙的顶部边距折叠。如果“最小高度”,则框自己的边距会折叠"属性为零,它既没有顶部或底部边框,也没有顶部或底部填充,并且它的“高度”为0或“自动”,并且它不包含行框,并且它的所有流入儿童的边缘(如果有的话)崩溃。翻译:浮动元素不会和任何元素重叠,包括它的子元素创建BFC元素不会和它的子元素、绝对定位元素等重叠任何元素之间,包括它的子元素inline-block元素和任何其他元素,包括它的子元素margin-bottomofblock-levelelementsinnormalflowforever与它相邻的下一个块级元素的margin-top被叠加,除非相邻的兄弟元素清除了该元素的margin-top正常流中的块级元素(无border-top,无padding-top)及其第一个正常流中的子元素(无clear)具有margin-top叠加正常流中的块级元素(高度为auto,min-height为0,没有border-bottom,没有padding-bottom)并且它的最后一个正常的Margin-bottom覆盖发生在流中的子元素上(没有自己的margin覆盖或清除)。如果一个元素的min-height为0,没有border,没有padding,height为0或者auto,没有子元素,那么它自己的Margins重叠