clear:both可以清除浮动的原理(给子元素设置clear:both相当于给它自动设置了1个mrgin-top外边距从而可以撑开父盒子高度)
父盒子没有设置高度,里面的子盒子box1由于浮动导致脱离父盒子从而无法再撑开父盒子的高度,父盒子高度因此塌陷,最终导致父盒子上下边框贴在一起。
<style>
.fabox {
border: 10px solid red;
margin-top: 20px;
}
.sonbox1 {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.sonbox2 {
background-color: green;
}
</style>
<div class="fabox">
<div class="sonbox1"></div>
<div class="sonbox2"></div>
</div>
效果图如下:

此时如果在父盒子内部再加上一个盒子box2,只要给这个box2盒子clear:both属性,父盒子会被撑开,撑开原理可以理解为因为box2给了clear:both属性后相当于自动加了一个box2到父盒子的外边距(黄色箭头所示)
<style>
.fabox {
border: 10px solid red;
margin-top: 20px;
}
.sonbox1 {
width: 200px;
height: 200px;
background-color: pink;
float: left;
}
.sonbox2 {
clear: both;
background-color: green;
}
</style>
<div class="fabox">
<div class="sonbox1"></div>
<div class="sonbox2">Aaaaaa</div>
</div>
这个时候的
.sonbox2 {
clear: both;
background-color: green;
}
实际上和
.sonbox2 {
margin-top: 200px;
background-color: green;
}
效果差不多,只不过margin-top需要给固定高度不利于内容显示,而clear:both是自动给高度。

注意上面为了演示所以给box2加上了内容Aaaa,实际运行去掉内容,页面就不会显示box2了。
但此时的box2实际上作用仅仅只是为了清除父盒子的浮动影响,副作用就是多出1个div结构,不利于后期维护,此时我们可以采用伪元素里实现这个目标,在css里添加如下代码:
.fabox::after {
content: '';
display: block;
/* 加上clear: both后相当于给这个div加了1个可自适应高度的margin-top外边距 */
clear: both;
}
效果图:

可以看到在父盒子后面添加伪元素后,父盒子高度已经被撑开了。
在父盒子后面添加伪元素后实际相当于在父盒子里新增了1个类似box2的盒子,所以效果和在box2设置vlear:both一样,但用伪元素不会在页面显示新增的元素。
我们给这个伪元素添加内容就能对比出效果了
.fabox::after {
content: '我是父盒子元素后面新增的伪元素,背景颜色绿色,效果和box2一样';
display: block;
clear: both;
background-color: green;
}


浙公网安备 33010602011771号