一、相邻(兄弟)盒子塌陷
1、描述
若两相邻兄弟盒子上外边距相同,给其中一个盒子设置浮动类型,另一个盒子的左外边距设置为与它的兄弟盒子宽度相同时(也可以不设置,第一个盒子的大小大于等于第二个盒子是也可以直接观察到效果),两个盒子都能够全部显示在页面内容区域,但是这两个盒子无法对齐。
例:
<style>
#d1{
width: 300px;
height: 300px;
margin-top: 10px;
background-color: dodgerblue;
float: left;
}
#d2{
width: 300px;
height: 300px;
margin-top: 10px;
background-color: darkviolet;
margin-left: 300px;
}
</style>
<body>
<div id="d1"></div>
<div id="d2"></div>
</body>
浏览器效果如下:
若不设置第二个盒子左外边距效果:
若设置第二个盒子左外边距效果:
2、解决办法
①添加一个父盒子,并设置父盒子的上边框。(此方法有背景颜色局限性)
在上述例子下进行:
<style>
.c1{
border-top: 1px solid white;
clear: both;
}
#d1{
width: 300px;
height: 300px;
margin-top: 10px;
background-color: dodgerblue;
float: left;
}
#d2{
width: 300px;
height: 300px;
margin-top: 10px;
background-color: darkviolet;
margin-left: 300px;
}
</style>
<body>
<div class="c1">
<div id="d1"></div>
<div id="d2"></div>
</div>
</body>
浏览器效果如下:
②添加一个父盒子,并且不给设置为浮动类型的盒子设置上外边距。
以上述例子进行:
<style>
.c1{
/* border-top: white solid 1px; */
/* clear: both; */
}
#d1{
width: 300px;
height: 300px;
/* margin-top: 10px; */
background-color: dodgerblue;
float: left;
}
#d2{
width: 300px;
height: 300px;
margin-top: 10px;
background-color: darkviolet;
margin-left: 300px;
}
</style>
<body>
<div class="c1">
<div id="d1"></div>
<div id="d2"></div>
</div>
</body>
浏览器效果如下:
二、父子嵌套margin塌陷
1、出现的原因:
当父元素没有设置足够大小时,而子元素设置了浮动的属性,子元素就会跳出父元素的边界(即脱离文档流),尤其是当父元素的高度为auto时,而父元素中又没有其他非浮动的可见元素时,父盒子的高度就会直接塌陷为零。
2、解决办法
①将盒子大小固定。给每个盒子设置固定的width和height,直到合适为止。
优点是简单方便,兼容性好,适合只改动少量内容不涉及盒子排布的版面;
缺点是非自适应,浏览器的窗口大小直接影响用户的体验。
②给外部的父盒子也添加浮动,让其脱离标准文本流。
优点是方便;
缺点是对页面的布局不是很友好,不易维护。
③给父盒子添加overflow属性。
overflow: auto ; (有可能出现滚动条,影响美观)
overflow: hidden ;(有可能会带来内容不可见的问题)
④在父盒子中最下方引入清除浮动快。(<br style="clear:both";>)
不推荐使用,因为引入了不必要的冗余元素。
⑤after伪类清除浮动。
外部盒子的after伪元素设置clear属性。
#parent:after{
clear: both;
content: "";
width: 0;
height: 0;
display: block;
visibility: hidden;
}
这种方法是纯CSS解决浮动造成盒子塌陷的方法,没有引入任何冗余元素。但是低版本IE不兼容。
三、边距塌陷
1、描述
流内块级元素的top与bottom外边距有时会合并(塌陷)为单个外边距(合并后最大的外边距),这样的现象称之为外边距塌陷(margin collapsing)。
2、不同情况
①两个相邻的外边距都是正数时,外边距结果是两者之间较大的值。
②两个相邻的外边距都是负数时,外边距结果是两者绝对值的较大值。
③两个相邻的外边距相同时,外边距结果是两者中任意一个。
④两个相邻的外边距一正一负时,外边距结果时两者相加的和。