在使用css的float属性实现多列布局或者元素横向排列时,浮动元素会脱离标准文档流,导致父容器无法感知到浮动子元素的高度,进而出现父容器高度为0的塌陷问题,影响后续元素的布局位置。下面介绍几种常用的清除浮动避免父容器塌陷的方法。

额外标签清除浮动法
这种方法是在所有浮动子元素的最后面添加一个额外的块级标签,给这个标签设置clear:both属性,让该标签不被浮动元素影响,从而撑开父容器。
<style>
.parent {
border: 1px solid #333;
}
.child {
float: left;
width: 100px;
height: 100px;
background: #f00;
margin-right: 10px;
}
.clear-fix {
clear: both;
}
</style>
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="clear-fix"></div>
</div>
这种方法的优点是简单易理解,兼容性好,缺点是需要额外添加无意义的标签,不符合语义化要求,在复杂项目中会增加冗余代码。
overflow属性清除浮动法
给父容器设置overflow属性,值为hidden、auto或者scroll,可以触发父容器的BFC(块级格式化上下文),BFC区域内部的浮动元素会被计算高度,从而避免父容器塌陷。
.parent {
border: 1px solid #333;
/* 触发BFC,清除内部浮动 */
overflow: hidden;
}
.child {
float: left;
width: 100px;
height: 100px;
background: #f00;
margin-right: 10px;
}
这种方法的优点是不需要额外添加标签,代码简洁,但是overflow属性可能会导致超出父容器的内容被隐藏或者出现滚动条,需要根据实际场景选择使用。
伪元素清除浮动法
这是目前最推荐使用的清除浮动方法,通过给父容器添加伪元素::after,在伪元素上设置清除浮动属性,不需要额外添加标签,也不会影响内容显示。
/* 通用清除浮动类,可以给任意需要清除浮动的父容器添加 */
.clearfix::after {
content: "";
display: block;
clear: both;
/* 兼容IE6、IE7 */
visibility: hidden;
height: 0;
}
/* 兼容IE6、IE7 */
.clearfix {
*zoom: 1;
}
.parent {
border: 1px solid #333;
}
.child {
float: left;
width: 100px;
height: 100px;
background: #f00;
margin-right: 10px;
}
<div class="parent clearfix">
<div class="child"></div>
<div class="child"></div>
</div>
这种方法既符合语义化要求,又不会有副作用,兼容性好,是实际项目中最常用的清除浮动方案。
双伪元素清除浮动法
这种方法通过给父容器同时设置::before和::after伪元素,::after用于清除浮动,::before用于触发hasLayout兼容IE低版本浏览器。
.clearfix::before,
.clearfix::after {
content: "";
display: table;
}
.clearfix::after {
clear: both;
}
/* 兼容IE6、IE7 */
.clearfix {
*zoom: 1;
}
这种方法是伪元素清除浮动法的优化版本,处理了一些边缘场景的兼容问题,同样是非常实用的清除浮动方案。
方法对比
下面是几种清除浮动方法的特点对比:
| 方法名称 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 额外标签法 | 简单易懂,兼容性好 | 增加无意义标签,不符合语义化 | 简单临时布局,不考虑语义化 |
| overflow属性法 | 无额外标签,代码简洁 | 可能隐藏超出内容或产生滚动条 | 父容器内容不会超出边界的场景 |
| 伪元素法 | 无额外标签,无副作用,兼容性好 | 代码相对长一点 | 绝大多数项目场景 |
| 双伪元素法 | 兼容edge场景,更稳定 | 代码稍复杂 | 需要兼容低版本IE的项目 |
在实际开发中,推荐优先使用伪元素清除浮动法或者双伪元素清除浮动法,这两种方法能够很好地解决父容器塌陷问题,同时不会对页面布局产生额外的副作用。