8.9 margin折叠更多场景
8.9.1 父元素margin0发生折叠
相邻父子margin折叠的示例里,父子元素都设置margin-top,会发生折叠。这里将父元素div1的margin-top设置成0、或者取消设置,也发生折叠。示例代码如下。
.div2 {
margin-top: 0;
background-color: #0aaa76;
width: 250px;
}
.div2-1 {
margin-top: 30px;
background-color: #4aa6fc;
height: 30px;
margin-left: 20px;
}
8.9.2 父子margin-bottom折叠
父元素与最后一个子元素的margin-bottom相邻时,也发生折叠。示例代码如下。
.div2{
margin-bottom: 20px;
}
.div2-2{
margin-bottom: 40px;
}
8.9.3 正负margin折叠计算
两个相邻margin一正一负。div2-1与div1之间的间距只有10px(30-20)。
.div2 {
margin-top: -20px;
}
.div2-1 {
margin-top: 30px;
}
8.9.4 height0自身折叠
自身margin折叠是极特殊的场景,很少出现。一个元素的高度是0,无padding与border,自己的margin-top与margin-bottom相邻,也会折叠。
示例代码如下。如果不折叠,div2占垂直间距50px,折叠后间距是30px。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>margin折叠 | 小步教程</title>
<style>
body {
margin: 0;
}
.div1 {
border-bottom: 1px solid #666;
}
.div2 {
margin-top: 20px;
margin-bottom: 30px;
}
.div3 {
border-top: 1px solid #666;
}
</style>
</head>
<body>
<div class="div1">div1 小步教程 xiaobuteach.com</div>
<div class="div2">
</div>
<div class="div3">div3</div>
</body>
</html>
8.9.5 其它FC与margin折叠
display-inside除flow与flow-root外,值还包括table、flex、grid。它们布局结构末级元素内部自动新建BFC,“新建BFC”表示新建并使用流式布局。新建BFC的内部多个div可能发生margin折叠。
示例代码。div2、 div2-1、div2-1-1、div2-1-2,共4个元素的3处垂直margin相邻。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>小步教程</title>
<style>
.div1,.div3 {
background-color: #4aa6fc;
}
.div2 {
display: flex;
margin-top: 20px;
}
.div2-1 {
margin-top: 20px;
}
.div2-1-1{
margin-top: 10px;
margin-bottom: 20px;
}
.div2-1-2{
margin-top: 20px;
}
</style>
</head>
<body>
<div class="div1">div1</div>
<div class="div2">
<div class="div2-1">
<div class="div2-1-1">第1列</div>
<div class="div2-1-2">小步教程 xiaobuteach.com</div>
</div>
<div class="div2-2">第2列</div>
</div>
<div class="div3">div3</div>
</body>
</html>
FC与margin折叠示意图
(1)根元素html新建1个BFC,flex元素(也称flex容器)div2新建1个FFC,div2-1与div2-2这2个flex子元素的内部又分别新建1个BFC,共4个FC、3个BFC。
(2)flex元素与flex子元素属于display: flex结构的对应元素,flex元素与它的子元素之间不会折叠,flex子元素与它的子元素不会折叠。所以,div2、div2-1、div2-1-1三者之间的两处相邻不会折叠。
(3)flex子元素内部的多个元素可能折叠。BFC-2内部的div2-1-1、div2-1-2发生折叠。