我尝试在另一个div内的一个div上添加边缘值。所有工作都很好,除了顶部值,它似乎被忽略了。但是为什么呢?
我的期望是:
我得到的是:
代码:
#{外
宽度:500 px;
身高:200 px;
背景:# FFCCCC;
Margin: 50px auto 0 auto;
显示:块;
}
#{内部
背景:# FFCC33;
Margin: 50px 50px 50px 50px;
填充:10 px;
显示:块;
}
< div id = "外" >
< div id = "内部" >
你好世界!
< / div >
< / div >
W3Schools没有解释为什么margin会这样。
实际上,您可以看到#inner元素的上边缘塌陷到#outer元素的上边缘,只留下#outer边缘完好无损(尽管在图像中没有显示)。两个盒子的上边缘彼此平齐,因为它们的边距相等。
以下是来自W3C规范的相关要点:
8.3.1边际萎缩
在CSS中,两个或多个框(可能是也可能不是兄弟)的相邻边距可以组合成一个边距。以这种方式结合的保证金被称为崩溃保证金,由此产生的合并保证金被称为崩溃保证金。
相邻的垂直边缘塌陷[…]
当且仅当:
两者都属于参与同一块格式化上下文的流内块级框
没有行框,没有间隙,没有填充,没有边界将它们分开
两者都属于垂直相邻的框边,即形成以下对之一:
一个盒子的上边距和它的第一个流入子框的上边距
你可以做以下任何一件事来防止边缘崩溃:
浮动任意一个div元素
使任何一个div元素成为内联块
将#outer的overflow设置为auto(或除visible以外的任何值)
上述选项防止保证金崩溃的原因是:
浮动框和任何其他框之间的边距不会折叠(即使浮动和它的流中子框之间也不会折叠)。
建立新的块格式上下文的元素的边距(例如float和带有“overflow”而不是“visible”的元素)不会随其流内子元素一起折叠。
内联块框的页边距不会折叠(即使它们的流子框也不会折叠)。
左右边距的表现如你所料,因为:
水平边距永不塌陷。