前几天工作中出现了一个有趣的话题:既然我们有了 CSS Grid 和 Flexbox,我们现在是否应该使用 CSS 的 float
属性?
简短回答
不!好吧,大部分情况下是这样。我今天只会将它用于文本环绕图像的情况,并且我会完全避免将 float
用于布局。
更长、更烦人的回答
在 flexbox 和 grid 出现之前,我们必须使用 CSS 的 float
属性来创建网格和布局。事实上,这是我学习网页设计的第一件事。在一个炎热的夏日下午,我打开了一本 Jeffrey Zeldman 编写的《使用 Web 标准进行设计》的书籍,然后用 float: right
移动了一个小小的红色 div。这真是太神奇了。float
蕴藏着巨大的力量。
在屏幕上移动某个东西是如此简单,以至于我现在想知道有多少设计师仅仅因为使用它移动东西如此简单而爱上了 Web。
但是使用 float
构建复杂的布局一直是 一种变通方法:它最初的设计只是为了让文本环绕图像。
img {
width: 150px;
float: left;
}
当我们尝试构建大型布局和杂志风格的网格时,float
的问题就开始了。但那正是我们当时不得不做的事情,因为当时没有像今天这样的替代方案。
float
属性的一个问题是,您必须用一个称为 clearfix 的东西来包装浮动元素,它看起来像这样
<div class="clearfix">
<div class="float-left">Column</div>
<div class="float-left">Column</div>
<div class="float-left">Column</div>
</div>
clearfix:after {
content: "";
display: table;
clear: both;
}
Jay Hoffman 之前描述过 clearfix 变通方法
clearfix 对于那些不知道的人来说,是一种 CSS 变通方法,用于解决两个浮动元素并排堆叠时出现的持续性错误。当元素以这种方式对齐时,父容器的高度最终会变为 0,并且很容易对布局造成破坏。您可能只是想将侧边栏定位在主要内容块的左侧,但结果是两个元素会重叠并互相折叠。更复杂的是,这个错误在不同浏览器中的表现不一致。clearfix 就是为了解决所有这些问题而发明的。
此后,情况开始慢慢发生变化。早在 2017 年,Rachel Andrew 就解释了 浏览器如何在没有任何变通方法的情况下处理 clearfix 问题。我们只需要以下 CSS 就可以进行相同的修复
.container {
display: flow-root;
}
奇怪的是,在打字之前大约三分钟,我才知道 flow-root
值的存在。但我想这在某种程度上证明了我即将提出的论点:**有了 CSS Grid 和 Flexbox,我们实际上根本不需要 float
。**该属性最初的设计是为了做一件事:让文本环绕图像。但是现在,有了 grid 和 flexbox,我们拥有了可以完成所有繁重布局工作的强大功能。
回到我在工作中提出的论点。有些人说我们应该回到代码库中删除所有 float
的实例,因为它是很旧的代码,我们可以很容易地用 flexbox 或 grid 替换它。但在这里我想说,“等等!”我认为在代码库的几个地方使用 float
属性并没有造成太大的伤害——这不是会造成问题的 放射性代码。
那么,除了让文本环绕文本之外,我们是否应该将 CSS float
用于任何其他用途?不。但是,我们是否应该立即清除 Web 上的所有 CSS float 声明,因为它不纯粹且不是“正确”的做法?同样也不应该。
Web 的妙处在于,旧代码不应该破坏任何东西。问问 Chris 就知道了。一个没有使用最花哨的 CSS 属性或最酷技巧的网站并不是无用或糟糕的。我们只是用更好的替代方案替换了 float
。我认为这是一个很好的教训,这些 CSS 属性可能会永远存在,因为 它们在现代 Web 设计中仍然有适用的用例。
这没什么问题。
这是一个在 Stack Overflow 上非常常见的问题,这表明人们对使用 float 的期望在多大程度上受到布局变通方法的影响。
CSS 排除将进一步大幅缩小 float 的用例。一旦排除功能广泛可用,float 是否仍将保留其利基市场还有待观察。
你说得对。文本环绕图像(极其罕见的情况);仅此而已。
必须说——我从来不喜欢旧的
float
。我不喜欢
flow-root
这个名字。使用以block-
开头的名称会更合适。flow-root
似乎不合逻辑,因为它似乎适用于内部元素,而设计师想要设置容器元素的样式。“root” 这个词也令人困惑;它似乎指的是网页/文档的根元素。
顺便说一句,在写评论时使用的预览功能存在问题。我无法查看评论的完整预览;它被裁剪在评论文本框/文本区域的高度内,我无法滚动。(使用 Firefox for Android 版本 85.1.3)
完全同意你的观点 :)
简短的回答足以让我标记这篇文章以便阅读,因为这 99.9% 是我使用它的场景。
我对此的第一反应是查看 Can I Use 以查看 Flexbox 和 Grid 的当前可用性状态。看起来 Flexbox 在大约 98% 的浏览器中可用,Grid 在 95% 中可用(或多或少)。从表面上看,这意味着大约每 50 个用户中就有 1 个用户在使用基于 Flexbox 的网站时会遇到问题,而每 20 个用户中就有 1 个用户无法按照您的意愿看到基于 Grid 的网站。后一个数字显然过高:如果 5% 的用户无法使用您的网站,那么肯定出了问题。
但随后我意识到问题不在于有多少用户无法使用 Grid,而在于哪些用户无法使用 Grid。不出所料,事实证明主要是使用较旧、较小设备的移动用户。而这些用户可能需要的不是复杂的基于 float 的布局,而是一些更简单的布局。换句话说,也许简单 HTML/CSS 支持的基本布局样式不仅足够,而且实际上适合这些用户。
会有一些例外情况。如果您没有 Flexbox,那么没有明显的方法可以将列表转换为水平项目行,除非使用 float 或(令人不寒而栗)表格。不过,总的来说,看起来我们确实已经达到了 Flexbox 和 Grid 的临界点,并且确实可以允许布局中的 float 消失。
我反复遇到使用 flex 显示内容进行打印时的问题——页面断开将文本行切断或内容完全在页面断开处被截断——而 float 通常是解决此问题的最简单方法。
自适应布局上的摘录是 float 的另一个用例,因为 flexbox 和 grid 都会使布局非常难以管理。这是 float 作为最初设计用途的真正体现,其他布局是通过利用 clear 和 float 之间的关系创建的。
我认为 clear 是真正的失败者,因为它比 float 的用例少得多。
图像不是您可能希望文本环绕的唯一事物。还有很多其他东西。
其他人提到了摘录,这是另一个很好的例子。
您可能希望使用一个小视频,类似于图像,也许用作 gif 的替代品,并带有环绕文本。
首字母下沉是 float 的另一个相当常见的用途。
我们不要忘记,float 是第一个流体设计元素,它仍然是为长文本块添加趣味的最佳方法之一。
许多印刷杂志版面元素都可以用 float 最轻松地再现。在摘录用例下,应包括各种页面增强功能:提示、信息块、迷你链接菜单、相关内容、作者信息等。
哦,shape-outside 也需要 float。
对我来说,使用浮动而不是网格更像是用3D而不是2D思考,使用浮动,我可以更容易地以更语义的方式重叠元素,使用z-index以真实的方式控制哪个元素更靠近屏幕
有时,当您无法控制组件中元素的顺序时,浮动可能会派上用场。
否则使用Flex!
浮动非常适合将图像分配到文章流的右侧或左侧。为此目的使用flex或grid将是一种变通方法。