清除浮动的最佳实践
1. 概念
清除浮动: 浮动一定要封闭到一个盒子中,否则就会对页面后续元素产生影响。
当子元素浮动后,父元素如果不设置高度,就会出现高度塌陷的问题,影响后续布局。
2. 清除浮动方法 1: 使用 BFC
2.1 原理
让内部有浮动的父盒子形成 BFC,它就能关闭住内部的浮动。
此时,最好的方法就是 overflow: hidden; 属性。
2.2 示例
* {
margin: 0;
padding: 0;
}
div {
/* 清除浮动方法1:
让内部有浮动的父盒子形成 BFC,
它就能关闭住内部的浮动
此时,最好的方法就是 overflow: hidden; 属性
*/
overflow: hidden;
margin-bottom: 10px;
}
p {
width: 100px;
height: 100px;
background-color: orange;
margin-right: 10px;
float: left;
}<div>
<p></p>
<p></p>
</div>
<div>
<p></p>
<p></p>
</div>2.3 优缺点
优点:
- 代码简单
- 兼容性好
缺点:
overflow: hidden会隐藏溢出内容- 不适合所有场景
3. 清除浮动方法 2: 使用 clear 属性
3.1 原理
给后面的父盒子设置 clear: both; 属性。
clear表示清除浮动对自己的影响both表示左右浮动都清除
3.2 示例
* {
margin: 0;
padding: 0;
}
.box {
border: 2px solid red;
margin-bottom: 20px;
}
.box2 {
/* 清除左右浮动 */
clear: both;
}
p {
width: 100px;
height: 100px;
background-color: orange;
margin-right: 10px;
float: left;
}<div class="box">
<p></p>
<p></p>
</div>
<div class="box2"></div>
<div class="box">
<p></p>
<p></p>
</div>3.3 优缺点
优点:
- 简单直接
缺点:
- 不推荐使用
- 需要额外添加标签
- 不够语义化
- 影响布局灵活性
4. 清除浮动方法 3: 使用伪元素(推荐)
4.1 原理
使用 ::after 伪元素给盒子添加最后一个子元素:
- 将
::after设置content: "";属性 - 让其成为一个块级元素
display: block; - 并且给
::after设置clear: both;
强烈推荐使用,最佳实践(大厂都这么用)
4.2 示例
* {
margin: 0;
padding: 0;
}
div {
border: 2px solid red;
margin-bottom: 20px;
}
/* 添加伪元素 */
/* ::after 匹配选中的元素的最后一个子元素 */
.clearfix::after {
content: "";
clear: both;
/* 转为块级元素 */
display: block;
}
p {
width: 100px;
height: 100px;
background-color: orange;
margin-right: 10px;
float: left;
}<div class="clearfix">
<p></p>
<p></p>
</div>
<div class="clearfix">
<p></p>
<p></p>
</div>4.3 优缺点
优点:
- ✅ 推荐使用
- 不需要额外添加 HTML 标签
- 语义化好
- 可维护性强
缺点:
- 代码稍多(但可以封装成通用类)
5. 清除浮动方法 4: 隔墙法
5.1 原理
在两个父盒子之间"隔墙"额外一个携带 clear: both; 的盒子。
5.2 示例
* {
margin: 0;
padding: 0;
}
div {
border: 2px solid red;
}
p {
width: 100px;
height: 100px;
background-color: orange;
margin-right: 10px;
float: left;
}
/* 清除浮动方法4:
在两个父盒子之间 "隔墙" 额一个携带 clear: both; 的盒子
*/
.cl {
clear: both;
}
.h20 {
height: 20px;
}<div>
<p></p>
<p></p>
</div>
<!-- 在两个父盒子之间 "隔墙" 额一个携带 clear: both; 的盒子 -->
<div class="cl h20"></div>
<div>
<p></p>
<p></p>
</div>5.3 优缺点
优点:
- 简单直接
缺点:
- 不推荐
- 需要额外添加无意义的 HTML 标签
- 污染 HTML 结构
- 不够语义化
6. 清除浮动方法对比
| 方法 | 代码量 | 语义化 | 兼容性 | 推荐度 |
|---|---|---|---|---|
BFC (overflow: hidden) | 少 | 好 | 好 | ⭐⭐⭐ |
clear: both | 少 | 差 | 好 | ⭐ |
伪元素(::after) | 中 | 好 | 好 | ⭐⭐⭐⭐⭐⭐ |
| 隔墙法 | 中 | 差 | 好 | ⭐ |
7. 最佳实践
7.1 推荐的清除浮动方案
使用伪元素清除浮动(强烈推荐):
/* 通用清除浮动类 */
.clearfix::after {
content: "";
display: block;
clear: both;
}
/* 兼容 IE6、7 */
.clearfix {
*zoom: 1;
}使用方法:
<div class="container clearfix">
<div class="item" style="float: left;"></div>
<div class="item" style="float: left;"></div>
</div>7.2 完整的最佳实践代码
/* 清除浮动最佳实践 */
.clearfix::after {
content: "";
display: block;
clear: both;
height: 0;
visibility: hidden;
}
.clearfix {
/* 触发 hasLayout (IE6、7) */
*zoom: 1;
}
/* 或者使用双伪元素 */
.clearfix::before,
.clearfix::after {
content: "";
display: table;
}
.clearfix::after {
clear: both;
}
/* 触发 hasLayout (IE6、7) */
.clearfix {
*zoom: 1;
}7.3 在项目中的应用
/* 全局清除浮动类 */
.clearfix::after {
content: "";
display: block;
clear: both;
}
/* 使用示例 */
.container {
width: 1000px;
margin: 0 auto;
}
.left {
width: 700px;
float: left;
}
.right {
width: 280px;
float: right;
}<div class="container clearfix">
<div class="left">左侧内容</div>
<div class="right">右侧内容</div>
</div>8. 常见问题
Q1: 为什么需要清除浮动?
A: 因为浮动元素脱离文档流,不占据空间,会导致父元素高度塌陷,影响后续布局。
Q2: 哪种清除浮动方法最好?
A: 伪元素方法(方法3) 最好,因为:
- 不需要额外 HTML 标签
- 语义化好
- 可维护性强
- 大厂都这么用
Q3: overflow: hidden 有什么缺点?
A:
- 会隐藏溢出内容
- 不适合有下拉菜单、工具提示等需要溢出的场景
- 需要考虑是否适合当前布局
Q4: 如何选择清除浮动方法?
A:
- 优先使用伪元素方法
- 如果确定不会有溢出,可以用
overflow: hidden - 其他方法不推荐,了解即可
Q5: IE6、7 如何处理?
A: 使用 *zoom: 1; 触发 hasLayout:
.clearfix {
*zoom: 1;
}9. 总结
清除浮动关键要点:
为什么要清除浮动:
- 浮动元素脱离文档流
- 造成父元素高度塌陷
- 影响后续布局
清除浮动的四种方法:
- 方法1: BFC (
overflow: hidden) - 方法2:
clear: both(不推荐) - 方法3: 伪元素
::after(强烈推荐) - 方法4: 隔墙法 (不推荐)
- 方法1: BFC (
推荐方法:
- ✅ 使用伪元素清除浮动
- ✅ 封装成通用类
.clearfix - ✅ 注意 IE6、7 兼容性
方法对比:
- 伪元素法: 最佳实践
- BFC 法: 简单,但有局限性
- 其他方法: 不推荐
最佳实践代码:
.clearfix::after { content: ""; display: block; clear: both; }注意事项:
- 浮动要封闭到盒子中
- 否则会影响后续元素
- 选择合适的清除浮动方法
记住: 使用伪元素清除浮动是最佳实践,强烈推荐!