首先我们得知道外间距的重叠,是在块级元素中出现的。父元素的第一个子块级元素的上边,与最后一个子块级元素的下边,与父元素的上边和下边是重叠的。重叠导致了第一个子元素margin-top会移动父级元素的上边距离。最后一个子元素的margin-bottom会移动父元素的下边距离。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body{background-color: gray;}
.d1{
width: 200px;
height: 400px;
background-color: pink;
}
.d2{
width: 150px;
height: 100px;
background-color: yellowgreen;
/* 只给第一个子元素设置了上外间距50px */
margin-top: 50px;
}
.d3{
width: 150px;
height: 100px;
background-color: orange;
}
.d4{
width: 150px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div class="d1">
<div class="d2"></div>
<div class="d3"></div>
<div class="d4"></div>
</div>
<script></script>
</body>
</html>
可以看到我们只是给第一个子元素设置了上外间距 结果导致父级跟着一起往下移动了
之所以会出现这种状态是因为重叠了 导致浏览器认为是同一条边线,所以就会这样了
解决方法(5种):
1.因为上边和第一个子元素上边重叠,既然外间距导致错误,用父元素的上内间距完成分开效果
2.父元素如果依靠触发BFC性能,就可以不受子元素的(重叠)影响
父元素设置overflow(scroll、hidden、auto)
3.父元素的第一个子元素前增加一个空<table>标签,依靠table的特点让边不重叠(不推荐,影响布局效果)
4.在父元素的标签前部分模拟一个table出来。
父元素::before {
content: "";
display: table;
}
5.如果父元素有边框的阻隔,那么它和子元素的边就不会发生重叠