CSS: CSS 浮动与清除

浮动(float)是 CSS 早期用于实现多列布局的主要方式。虽然现在 Flexbox 和 Grid 已经取代了它的大部分功能,但理解浮动仍然很重要——你会经常在旧的代码库中遇到它。

浮动属性速查表

属性 常用值 作用
float left, right, none 元素浮动方向
clear left, right, both, none 清除浮动影响

1. float 属性

float 让元素"漂浮"在容器的一侧,其他内容会环绕它排列。

▶ 示例

HTML
<style>
.float-left {
  float: left;   /* 向左浮动 */
  width: 120px;
  background: #e3f2fd;
  border: 1px solid #90caf9;
  padding: 10px;
}
.float-right {
  float: right;  /* 向右浮动 */
  width: 120px;
  background: #fce4ec;
  border: 1px solid #f48fb1;
  padding: 10px;
}
.none {
  float: none;   /* 默认,不浮动 */
  background: #e8f5e9;
  border: 1px solid #81c784;
  padding: 10px;
}
</style>
<div class="float-left">左浮动元素</div>
<div class="float-right">右浮动元素</div>
<div class="none">不浮动(正常文档流)</div>
▶ 试一试

(1) 浮动的基本行为

▶ 示例

HTML
<div class="container">
  <img src="/assets/images/tutorials/html-example-photo.webp" alt="Sample image" style="float: left;">
  <p>文字会环绕在图片的周围...</p>
</div>
▶ 试一试

(2) 浮动的特点

  1. 元素脱离正常文档流,但不完全脱离(文字会环绕)
  2. 块级元素宽度不再默认 100%,而是由内容决定
  3. 可设置宽高(即使是行内元素,设置了 float 后也能设置宽高)
  4. 元素会并排,直到容器宽度不够才换行

2. 浮动带来的问题

浮动最经典的问题就是高度塌陷——当子元素全部浮动时,父元素会"忘记"包裹它们:

▶ 示例

HTML
<style>
.parent {
  border: 2px solid red;
  /* 没有设置高度,希望由子元素撑开 */
}
.child {
  float: left;
    /* 浮动 */
  width: 100px;
  height: 100px;
  background: #e3f2fd;
  border: 1px solid #1976d2;
}
</style>
<div class="parent">
  <div class="child">子元素1</div>
  <div class="child">子元素2</div>
</div>
▶ 试一试

结果:父元素的边框紧贴顶部,子元素溢出了——因为浮动的子元素不占据文档流空间。


3. 清除浮动的方法

(1) 1. 使用 clear 属性(传统方法)

▶ 示例

HTML
<style>
.clearfix {
  clear: both;    /* 清除两侧的浮动影响 */
  background: #f5f5f5;
  padding: 10px;
}
</style>
<div class="clearfix">清除浮动(clear: both)</div>
▶ 试一试

需要在浮动元素的后面加一个空元素:

▶ 示例

HTML
<div class="parent">
  <div class="child">子元素内容</div>
  <div class="child">子元素内容</div>
  <div style="clear: both;"></div>  <!-- 空元素 -->
</div>
▶ 试一试

(2) 2. 父元素设置 overflow

▶ 示例

HTML
<style>
.parent {
  overflow: hidden;   /* 或 overflow: auto */
}
</style>
<div class="parent">父容器元素</div>
▶ 试一试

利用 BFC(块级格式化上下文)的特性。

(3) 3. 伪元素清除浮动(推荐)

这是目前最标准、最推荐的方法:

▶ 示例

HTML
<style>
/* 定义一个 clearfix 类 */
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}

/* 或者使用 table 方式 */
.clearfix::after {
  content: "";
  display: table;
  clear: both;
}
</style>
<div class="clearfix:">Clearfix:</div>
▶ 试一试

在 HTML 中给父容器添加 clearfix 类:

▶ 示例

HTML
<div class="parent clearfix">
  <div class="child" style="float: left;">子元素内容</div>
  <div class="child" style="float: left;">子元素内容</div>
</div>
▶ 试一试

(4) 4. 父元素也设置浮动

▶ 示例

HTML
<style>
.parent {
  float: left;   /* 父元素自己也浮动,就能包裹子元素了 */
}
</style>
<div class="parent">父容器元素</div>
▶ 试一试

但这会影响到父元素的布局,不推荐。


4. 现代替代方案

在现在的项目中,大多数浮动布局的需求都可以用 Flexbox 或 Grid 替代:

▶ 示例

HTML
<style>
/* 旧式:使用浮动 */
.old-layout {
  overflow: hidden;
}
.old-layout .col {
  float: left;
    /* 浮动 */
  width: 33.33%;
}

/* 现代:使用 Flexbox */
.modern-layout {
  display: flex;
}
.modern-layout .col {
  flex: 1;
}
</style>
<div class="old-layout">传统浮动布局</div>
<div class="old-layout">传统浮动布局</div>
<div class="col">列内容</div>
<div class="modern-layout">现代 Flex 布局</div>
<div class="modern-layout">现代 Flex 布局</div>
<div class="col">列内容</div>
▶ 试一试

5. 何时还会用到 float?

  1. 文字环绕图片——这是 float 的原始设计意图,Flexbox 反而做不了
  2. 维护旧项目——很多老项目仍用浮动布局
  3. 某些特定布局——如左对齐/右对齐的图文混排

(1) 文字环绕图片

▶ 示例

HTML
<style>
.article img {
  float: left;
    /* 浮动 */
  margin-right: 15px;
  margin-bottom: 10px;
}
</style>
<div class="article">这是一段文章内容,展示了文本排列效果</div>
<img src="/assets/images/tutorials/html-example-photo.webp" alt="Sample image">
▶ 试一试
HTML
<div class="article">
  <img src="/assets/images/tutorials/html-example-photo.webp" alt="Sample image">
  <p>这段文字会环绕在图片周围...</p>
</div>

❓ 常见问题

Q 现在做布局还用 float 吗?
A 不建议。float 最初是用来做文字环绕的,不是做布局的。现在 Flexbox 和 Grid 已经完美取代了 float 布局。只有在做"图片+文字环绕"效果时,float 仍然是正确选择。
Q clearfix 是什么?
A clearfix 是清除浮动影响的经典 hack。给父容器加 ::after { content: ""; display: block; clear: both; },让父容器"包裹"住浮动的子元素。如果用 Flexbox 或 Grid 就不需要 clearfix 了。
Q float 元素的父容器高度塌陷了怎么办?
A 高度塌陷是因为浮动元素脱离了文档流,父容器感知不到它们的高度。解决方法:父容器设置 overflow: hidden、或者用 clearfix、或者干脆改用 Flexbox 布局。

📖 小节

📝 作业

  1. 创建一个图片和文字混排的页面,让图片浮动在左侧,文字环绕在图片周围。
  2. 使用 float 实现一个"三栏布局"——左栏 200px、右栏 200px、中间自适应。
  3. 演示"高度塌陷"问题,然后用至少三种方法解决(clearfix、overflow、伪元素)。
  4. 将上面的浮动三栏布局用 Flexbox 重写一遍,对比两种方式的代码差异。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏