Skip to main content

CSS中margin边界叠加问题及解决方案

边界叠加简介

边界叠加是一个相当简单的概念。但是,在实践中对网页进行布局时,它会造成许多混淆。 简单地说,当两个垂直边界相遇时,它们将形成一个边界。 这个边界的高度等于两个发生叠加的边界的高度中的较大者。

元素的顶边界与前面元素的底边界发生叠加 示例一

也就是说当一个元素出现在另一个元素上面时,第一个元素的底边界与第二个元素的顶边界发生叠加。


子元素的顶边界与父元素的顶边界发生叠加 示例二

当一个元素包含在另一个元素中时(假设没有填充或边框将边界分隔开),它们的顶和/或底边界也发生叠加, 如果给父元素设置边框border或padding,此叠加不会发生。


元素的顶边界与底边界发生叠加 示例三

尽管初看上去有点儿奇怪,但是边界甚至可以与本身发生叠加。假设有一个空元素,它有边界,但是没有边框或高度及内间距。 在这种情况下,顶边界与底边界就碰到了一起,它们会发生叠加,如果这个边界碰到另一个元素的边界,它还会发生叠加


解决方法

边界叠加的大多数问题可以通过添加透明边框或1px的补白来修复。其它补充解决方案:

1.外层 padding

2.透明边框 border:1px solid transparent;

3.绝对定位 postion:absolute;

4.外层DIV overflow:hidden;

5.内层DIV 加 float:left; display:inline;

举个栗子

<!doctype html>
<html lang="zh-CN">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>CSS中margin边界叠加问题及解决方案</title>
<style>
body {
padding: 20px;
background: url(./grid.png);
}
div {
opacity: 0.6;
}
h1 {
opacity: 0.7;
background: #666;
}
.box11 {
height: 100px;
background: royalblue;
margin: 20px 0;
}
.box22 {
height: 100px;
background: rosybrown;
margin: 30px 0;
}
.box33 {
background: greenyellow;
margin: 30px 0;
}
.box44 {
height: 100px;
width: 50%;
background: darkred;
margin: 40px auto;
}
.box55 {
margin: 30px 0;
}
</style>
</head>
<body>
<h1>示例一:元素的顶边界与前面元素的底边界发生叠加</h1>
<div class="box11"></div>
<div class="box22"></div>

<h1>示例二:元素的顶边界与父元素的顶边界发生叠加</h1>
<div class="box11"></div>
<div class="box33">
<div class="box44"></div>
</div>

<h1>示例三:元素的顶边界与底边界发生叠加</h1>
<div class="box11"></div>
<div class="box55"></div>
<div class="box11"></div>

</body>

</html>