什么是“浮动”?
浮动是一个 CSS 定位属性。 为了理解其目的和起源,我们可以参考印刷设计。 在印刷版式中,图像可以设置到页面中,以便文本根据需要环绕它们。 这通常被称为“文字环绕”。 这是一个示例。

在页面布局程序中,包含文本的框可以被告知遵循文字环绕,或者忽略它。 忽略文字环绕将允许文字直接流过图像,就像它不存在一样。 这就是该图像成为页面流的一部分(或不是)的区别。 网页设计非常相似。

在网页设计中,应用了 CSSfloat属性的页面元素就像印刷版式中文字环绕的图像一样。 浮动元素仍然是网页流的一部分。 这与使用绝对定位的页面元素截然不同。 绝对定位的页面元素被移除出网页流,就像印刷版式中的文本框被告知忽略页面环绕一样。 绝对定位的页面元素不会影响其他元素的位置,其他元素也不会影响它们,无论它们是否彼此接触。
使用 CSS 设置元素的浮动如下所示
#sidebar {
float: right;
}
float 属性有四个有效值。 left 和 right 分别将元素浮动到这些方向。 none(默认值)确保元素不会浮动,而 inherit 将采用该元素父元素的浮动值。
浮动用于什么?
除了围绕图像环绕文本的简单示例之外,浮动还可以用于创建整个网页布局。

虽然浮动仍然可以用于布局,但如今我们拥有更强大的工具来创建网页布局。 即,Flexbox 和 Grid。 浮动仍然值得了解,因为它们具有一些完全独特的特性,本文将对此进行全面介绍。
浮动在较小的实例中也很有用。 以网页的这个小区域为例。 如果我们对小头像图像使用浮动,当该图像大小发生变化时,框中的文本将重新流动以适应

同样的布局也可以使用容器的相对定位和头像的绝对定位来完成。 通过这种方式,文本将不受头像的影响,并且无法在大小更改时重新流动。

清除浮动
浮动的姊妹属性是clear。 设置了 clear 属性的元素不会像浮动期望的那样向上移动到浮动旁边,而是会将自身向下移动到浮动下方。 同样,插图可能比文字更有帮助。

在上面的示例中,侧边栏浮动到右侧,并且比主要内容区域短。 然后,页脚需要跳到该可用空间中,这是浮动所要求的。 为了解决此问题,可以清除页脚以确保它始终位于两个浮动列下方。
#footer {
clear: both;
}

Clear 也有四个有效值。 both 最常使用,它清除来自任一方向的浮动。 left 和 right 可分别用于仅清除一个方向的浮动。 none 是默认值,通常不需要,除非从级联中删除 clear 值。 inherit 将是第五个,但奇怪的是在 Internet Explorer 中不受支持。 虽然在实际应用中不太常见,但仅清除左侧或右侧浮动确实有其用途。

大塌陷
使用浮动时,更令人困惑的事情之一是它们如何影响包含它们的元素(它们的“父”元素)。 如果此父元素仅包含浮动元素,则其高度将完全塌陷为零。 如果父元素不包含任何视觉上可见的背景,则这一点并不总是显而易见的,但务必注意这一点。

尽管塌陷似乎违反直觉,但替代方案更糟糕。 考虑这种情况

如果顶部的块级元素要自动扩展以适应浮动元素,则段落之间文本流中将出现不自然的间距中断,并且无法通过任何实用方法修复。 如果出现这种情况,我们设计师对这种行为的抱怨将比对塌陷的抱怨多得多。
塌陷几乎总是需要处理,以防止出现奇怪的布局和跨浏览器问题。 我们通过在容器中浮动元素之后但在容器关闭之前清除浮动来修复它。
清除浮动的方法
如果您处于始终知道后续元素是什么的情况,则可以将clear: both;值应用于该元素并继续您的业务。 这是理想的,因为它不需要任何花哨的黑客和任何额外的元素,使其完美地语义化。 当然,事情通常不会按这种方式进行,我们需要在我们的工具箱中拥有更多清除浮动的工具。
- 空 div 方法实际上是一个空 div。
<div style="clear: both;"></div>
有时您会看到使用<br>
元素或其他一些随机元素,但 div 最常见,因为它没有浏览器默认样式,没有任何特殊功能,并且不太可能使用 CSS 进行通用样式化。 此方法受到语义纯粹主义者的蔑视,因为它的存在对页面没有任何上下文意义,并且完全是为了演示而存在的。 当然,从最严格的意义上讲,他们是正确的,但它可以正确地完成工作并且不会伤害任何人。 - 溢出方法依赖于在父元素上设置 overflow CSS 属性。 如果此属性在父元素上设置为 auto 或 hidden,则父元素将扩展以包含浮动,从而有效地为后续元素清除它。 此方法可以非常语义化,因为它可能不需要额外的元素。 但是,如果您发现自己只是为了应用它而添加了一个新的 div,那么它与空 div 方法一样不语义化,并且适应性较差。 还要记住,overflow 属性并非专门用于清除浮动。 注意不要隐藏内容或触发不需要的滚动条。
- 轻松清除方法使用巧妙的 CSS 伪选择器(
:after
)来清除浮动。 您不是在父元素上设置 overflow,而是向其应用一个额外的类,例如“clearfix”。 然后应用此 CSS
.clearfix:after {
content: ".";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
这将在父元素之后应用少量隐藏内容,从而清除浮动。 这不是全部内容,因为需要使用其他代码来适应旧版浏览器。
不同的场景需要不同的浮动清除方法。 例如,一个由不同类型块组成的网格。

为了更好地视觉上连接相似的块,我们希望根据需要开始新的一行,在本例中是颜色发生变化时。 如果每个颜色组都有一个父元素,我们可以使用溢出或轻松清除方法。 或者,我们在每个组之间使用空 div 方法。 三个之前不存在的包装 div 或三个之前不存在的 after div。 我让你来决定哪个更好。

浮动的问题
浮动经常因其脆弱性而受到抨击。 这种脆弱性的大部分原因来自 IE 6 及其大量与浮动相关的错误。 随着越来越多的设计师放弃对 IE 6 的支持,您可能并不在乎,但对于那些在乎的人来说,这里有一个快速概述。
- 浮动元素下移 是一个症状,表现为浮动元素内部的一个元素比浮动元素本身更宽(通常是图片)。大多数浏览器会将图片渲染在浮动元素外部,但突出部分不会影响其他布局。IE 会扩展浮动元素以包含图片,这通常会极大地影响布局。一个常见的例子是,图片突出到主要内容之外,导致侧边栏向下移动。

overflow: hidden
来裁剪多余部分。- 双边距错误 – 在处理 IE 6 时,另一件需要记住的事情是,如果在与浮动方向相同的方向上应用边距,它会使边距加倍。快速修复:将浮动元素的
display
设置为inline
,不用担心,它仍然会保持块级元素。 - 3像素偏移 是指紧挨着浮动元素的文本被神秘地推开了3像素,就像浮动元素周围存在一个奇怪的力场一样。快速修复:为受影响的文本设置宽度或高度。
- 在 IE 7 中,底部边距错误 是指,如果一个浮动父元素内部包含浮动子元素,则父元素会忽略这些子元素的底部边距。快速修复:改为在父元素上使用底部内边距。
替代方案
如果您需要文本环绕图片,实际上并没有浮动的替代方案。说到这里,请查看这个相当巧妙的技术,用于环绕不规则形状的文本。但对于页面布局,确实有其他选择。Eric Sol 在 A List Apart 上有一篇关于伪绝对定位的文章,这是一种非常有趣的方法,在很多方面结合了浮动的灵活性与绝对定位的优势。CSS3 有模板布局模块,当被广泛采用后,将成为首选的页面布局技术。
视频
我之前做过一个屏幕录制,解释了其中许多浮动概念。
http://www.quirksmode.org/css/clearing.html
这就是我用来清除浮动的方法。太棒了。
引用自您上面链接的网站
“# 一些浏览器也需要容器div的宽度或高度。”
当内容是动态的时候你怎么办?太糟糕了。这行不通……
这篇文章写得很好!你应该经常用这种风格来解释事情,它真的很清新易懂! :)
同意。你用这篇文章真的给我留下了深刻的印象,Chris。你所举的例子简单易懂,而且看起来很漂亮。
你应该继续写这样的文章,Chris!非常感谢!
嗨,Chris,关于你所说的
我一直通过也使父元素浮动来解决这个问题,这是一种不好的做法吗,即使它达到了相同的效果?此外,这样做不会添加非语义标记。
只是想知道你的想法是什么?
使父div浮动是处理折叠最简单、最干净的方法。一个具有指定宽度的浮动div将垂直扩展以包含其子元素。
如果所有子元素都是浮动的,则将父元素的overflow设置为auto,然后查看效果。它适用于大多数现代浏览器。
@Epic Alex:但如果你不希望父元素浮动呢?这可能会导致它自身布局问题。如果使用clearfix方法或overflow: auto;方法,您还可以清除浮动,从而修复父元素大小,而无需添加额外的标记。
这是我的“啊哈!”时刻……哈哈。
哇,这太棒了。我认为你呈现信息的方式很棒,绝对想看到更多像这样安排的文章。读起来很不错。
Chris,
我在过去几天里发现了一个与clearfix非常相关的链接。我建议你查看一下,甚至可以将它的建议应用到这篇文章中
http://perishablepress.com/press/2008/02/05/lessons-learned-concerning-the-clearfix-css-hack/
Brent
我认为这是我见过的关于浮动最全面的解释,非常棒
现在,这才是真正值得我称之为优秀文章的东西,它甚至解释了细枝末节。
继续努力。
我无法相信这么多年来我对“clear”的工作原理有完全不同的理解,而且我一直无法弄清楚为什么它有时有效而有时无效。现在一切都非常清楚了(糟糕的双关语)。非常感谢这篇文章。
不幸的是,几年前我通过艰难的方式学习了这一点!好文章,谢谢!
不错的总结,Chris!
希望将来能看到更多这样的文章。
这实际上是规范中规定的正确行为,因此这不是浏览器出错的问题。这是一篇文章,说明了为什么这有道理。
我没有在标记中添加更多的div,我只是在我的父div中使用<br />,然后在我的css中使用
使父div清除并扩展到内部浮动的高度。它具有相同的效果,但标记更少,div的混乱也更少。
好文章。浮动很棒,但有时也会让人恼火。
您提到的关于伪绝对定位的文章,正如您所说,很有趣。我试着使用了它,并且真的很喜欢它。至少在我读到这篇反对伪绝对定位的文章之前。
太棒了,太棒了,太棒的文章了。我认为如果有一件事我使用得最多,那就是“float”。我实际上并不知道这些错误中的一些。谢谢!
一篇很棒的文章,真的。我很享受阅读它。
来自比利时的问候!
感谢你的提醒,Chris——我更新了我的Clearfix文章,以反映您文章中提出的Firefox 3修复。现在我要去更新无数不同的样式表了!
顺便说一句,我相当确定Firefox的“官方”缩写是“Fx”,而不是“FF”,无论它值不值得。
就在我以为自己对浮动了解很多的时候……谢谢,Chris!
一些无关的话题
基本上我认为“float”属性不太适合用作布局属性,
但也许可以作为排版属性——它来自IMG标签的“align”属性。
在css2.1中还没有专门用于布局的属性,你说“position”?好吧,position的控制力太差了。
CSS2.1 基本上仍然是一种文档装饰语言,与 CSS1 一样,复杂的布局远超出其范围。我们现在用于布局的每种 CSS 技术,都算是一种 hack,包括浮动和定位。表格布局呢?是的,它显然也是一种 hack。
所以,我们在这里都在使用 hack。
overflow: hidden; 的作用与 overflow: auto; 完全相同;它清除浮动,并且如果指定宽度,它会确保父元素隐藏超出原始宽度的任何内容。通过指定宽度,您可以修复几个 IE6/7 的 bug,其中最后一个元素的底部边距不起作用。
一般来说,我想这里每个人都知道这一点。为元素指定宽度可以解决大约 70% 的 IE 渲染 bug。
@Jeff Starr 他们在 Fx 的网站上使用了一段时间,不过我现在在那里找不到它了。
这是 Fx 对 CSS 支持新增内容的链接 http://tinyurl.com/yuxlbs
保存这篇文章很有用,也学到了一些不错的技巧!
我不想显得粗鲁,但你的文章对我来说有点令人困惑,我不得不说不够“清晰”:)
这里有一篇我之前读过的文章,它以更简单、更完整的方式解释了相同的要点。
http://kilianvalkhof.com/2008/css-xhtml/understanding-css-positioning-part-1/
http://kilianvalkhof.com/2008/css-xhtml/understanding-css-positioning-part-2/
@Fouad Masoud
http://www.mozilla.com/en-US/firefox/releases/1.5.html#FAQ
查看 #8..
我认为这是一篇关于浮动用法的非常详细的概述!我相信你永远不会有足够的包装器来确保你的浮动元素不会出现任何意外。
感谢你写了一篇好的文章。它确实帮助我理清了关于浮动的一些困惑。
谢谢老兄 - 非常有帮助。你的网站看起来也很棒!
我想不出有什么比浮动更让我头疼的了。当它们工作时,它们确实工作,但达到这一点的过程充满了各种各样的技巧。这是一个很棒的指南,我一定会将其收藏起来,以便下次需要解决浮动问题时使用。
这是一篇**非常棒**的文章。实际上,自从我学会如何使用Favlets以及接触到
http://browsershots.org/以来,这是我遇到的最好的信息。如果你还不知道这些现象,可以去了解一下=)。。
它们几乎和你这个页面一样棒.. ^^
感谢你发布这篇文章……你帮助我停止了抓狂!!
这真的很有用!我还看了视频:P
很棒的文章,浏览器之间所有的小差异都令人惊叹。我花了大量时间修复一些小的 CSS 问题!
很棒的帖子,几乎概括了所有内容! :)
好文章,但我仍然更喜欢不惜一切代价避免浮动。 我的博客 是使用内联块构建的,并且不使用浮动。它不是一个完美的替代方案,但我随时都更喜欢它而不是浮动。
查看<a href="我的 webdev 部分,了解如何使用内联块。
你的空 div 方法应该稍微整理一下;
首先,它应该写成
然后是 CSS;
.clear { width: 0; height: 0; overflow: hidden; clear: both; }
这去掉了内联样式,也去掉了空 div(空格需要保留在里面)。
每读 5 篇文章,我的 CSS 思维就会重塑一次。我愿意付出任何代价,只希望能和你共处半个小时。在一些好的比利时啤酒的陪伴下,一起解决 CSS 问题。
确实,一篇不错的文章。我也收藏了它。
很棒的文章。我总是喜欢人们花时间真正解释某件事为什么以及如何工作。
如果我首先了解某件事是如何以及为什么工作的,我更有可能正确地使用它,并更快地编写出更好的 CSS,减少 bug 和 hack。
更多像这样的教程会很棒 - 例如对表格的解释 - 它们的所有部分(thead、summary、tbody 等)以及行为。
哥们,那是一篇非常棒的文章!简洁完整。
很棒的文章,有很多很好的示例。我把它加到我的 delicious 里了,谢谢!
喜欢这个标题,无论是否有意,我都笑了哈哈
我的意思是“副标题”,“什么是浮动?”
一如既往的好文章。:D
顺便说一句,Chris。我认为你需要重新添加那些社交书签按钮。(我收藏了这个 >>> http://digg.com/d1w748)
这就是我正在寻找的……浮动让我头疼,但现在我知道该怎么做了……谢谢 Chris
这就是我每天都来这个网站的原因,也是我因为这样的文章而成为一名更优秀的设计师的原因。对于初学者设计师来说,这是一篇很棒的帖子,感谢你在这个网站上付出的所有努力。
似曾相识?
无论如何,这仍然是一篇很棒的帖子 > 已收藏并收藏。
优秀!这就是我想要的。非常感谢!
谢谢,谢谢,谢谢……这是一篇*非常有帮助*的文章。
谢谢 Chris,一篇关于某个可能在某些时候给每个人带来问题的主题的优秀文章。
非常感谢你发布这篇文章。你在这里涵盖了几个小方面,虽然我之前知道,但可能没有像我应该的那样理解。
你的解释很清楚,帮助我理解了。
干杯。
一如既往的棒,Chris,而且我真的很喜欢这些插图。干得好!:D
这是一篇必备文章。我希望我能在玩了几个小时 Firebug 后,眼睛开始转圈时,还能想起它。
干得好!
比视频教程好!
Chris,关于浮动属性的精彩概述。在使用 WordPress 或我最新的布局时,我通常会尝试使用它们。概念很简单,它可以节省你一些工作,而不是一直定位东西。
空 div 方法是我首选的方式,但有时……只是有时它无法通过 w3 验证器。
哇.. 非常棒的信息来源,非常详细,并且不仅对浮动新手有启发,对于像我这样的专家来说,再次了解基础知识仍然很重要。太棒了
教程做得很好。虽然我大部分内容都知道,但我确实学习了一种新技巧,即 `overflow: auto` 或 `hidden`。我通常使用空 div 或 `clearfix:after` 方法。
感谢您抽出时间以这种方式撰写文章。其清晰度使其脱颖而出。
本文已分享到 favSHARE.net。
无论如何,每当我使用一个“空”清除 div 时,我都会在开始和结束 div 标签之间添加一个注释(例如 ``)。我忘记了具体细节,但完全空的 div 会导致 IE 的某个版本出现问题。
所有这些都有一个非常简单的解决方案。对父 DIV 使用“`display:table`”,然后对所有子 DIV 使用“`display:table-cell`”,不幸的是,只有 Firefox、Safari 和 IE8 支持此功能。一旦它对所有浏览器可用,浮动将不再用于格式化站点区域。浮动最适合内联元素
史诗级!一如既往。
太棒了……几年前我需要知道这些东西的时候你在哪里? :)
即使我使用 CSS 已经很多年了,你的博文总是能带来新的启发,并揭示一些我以前不知道的东西。
令人印象深刻的解释!
感谢 Chris!
您是否遇到过链接在浮动 div 容器内跳动的問題?
精彩的帖子!我读过几篇文章和书籍,声称要“解释”浮动及其用途,但这篇文章完全胜过它们。
我也非常喜欢干净、易于理解的图片。它们确实有助于真正了解浮动在上下文中的工作方式。
感谢这篇非常有用的帖子!
谢谢,在您的示例中包含图像非常有帮助,可以清楚地了解预期发生的情况。
伙计,你是最棒的!致敬并感谢!
做得好。
我是一个网页设计新手。我们在 CSS 代码中遇到了很多关于浮动属性的问题。当我们给任何容器添加边距时,IE 会为此容器创建双倍边距。所以为了解决这个问题,我仅对 IE 使用 `_margin`。现在我们的头痛消失了。你的例子既简单又易懂。
不错………………..
很棒的文章,Chris。我只希望在我刚开始的时候就有这篇文章!继续努力。
优秀的文章,我也在大多数情况下使用浮动来定位 div,因为它比使用定位更有帮助。
太棒了,谢谢 Chris
谢谢!这帮我解决了 IE6 中的一个问题!耶!你是我的英雄!
非常感谢hhhhhhhhhh
极好的技巧………..
:)
优秀的文章。我在使用 `float:` 时遇到了一些问题,但在阅读了这篇文章后,所有问题都消失了。
很棒的文章,我在我的博客上发布了它的链接,我一直在处理折叠问题
迄今为止我见过的最好的浮动覆盖。
很棒的文章。浮动一直是我网站设计中最令人沮丧的部分之一。感谢您澄清了这一点。
喜欢这篇文章的风格和图表。请对更多文章使用此格式。
嗨,Chris,
感谢这篇文章,我经常向你寻求 CSS 问题的答案。
问题:你提到“浮动元素仍然是网页流的一部分”。但它们不是从文档流中移除了吗?这就是为什么我们必须对父容器应用 `clearfix` 以防止它们折叠的原因吗?
折叠是一个问题,但浮动元素在技术上并没有从流中移除。想象一下,如果一个浮动元素宽 100px,文本围绕它流动,然后它变为 200px 宽,文本会移动并围绕它流动。仍然会影响其他元素 == 仍然在流中。
**“浮动元素仍然是网页流的一部分。”
**
这个信息是真的吗?
你好,Chris,
如果 div 没有高度和宽度,并且内部有浮动子元素,并且希望父 div 占据子元素的高度。该怎么处理?我知道我们可以对父元素使用 `float left` 或对父元素使用 `overflow hidden`。
还有一个问题,Chris,
我还读到浮动元素从 html 流中移除。
“想象一下,如果一个浮动元素宽 100px,文本围绕它流动,然后它变为 200px 宽,文本会移动并围绕它流动。仍然会影响其他元素 == 仍然在流中。”
这是什么意思?
如果在主内容中放置一个宽大的表格,我们会遇到问题:表格会超出 div 的宽度。有人知道如何解决这个问题吗?使用宽大的表格,不使用 div 的溢出?
阅读完之后,我觉得我必须说谢谢!优秀的文章。
只有一群工程白痴才会从网页设计中移除居中元素。只有愚蠢的工程师才会让每个人的生活如此艰难。