
浮动图片会从围绕它的文本中占用水平空间。 在固定宽度布局中,您可以检查留给文本的空间是否足以创建一个看起来不错的列,并且可以确信其他人也会看到相同的内容。
但是,在流式布局中,您没有这样的保证。 如果用户在较小的设备上查看您的网站,留给文本的水平空间可能只能容纳每行一两个词。 这样窄的文本列不仅看起来难看;它也很脆弱。 包含长词的句子将在长词向下移动到浮动图片下方时发生断裂,并在句子中间留下空白的空隙。
难以捉摸的最小段落宽度
为了解决段落过窄的问题,我们需要一种方法来实现最小段落宽度。 如果浮动图片留下的空间低于此宽度,则整个段落会向下移动到图片下方。

直观地,以下 CSS 似乎符合要求
p {
min-width: 10em;
/* For demonstration */
border: 1px solid red;
}
但是,这没有效果。 图片浮动在段落上方,因此不会减少段落的“官方”宽度。 同时,段落内的文本忠实地避开浮动图片,因此问题仍然存在。
针对已知图片宽度的媒体查询解决方案

如果您的图片(或其他浮动内容)共享一个固定且预定义的宽度,那么您可以使用 CSS3 媒体查询在屏幕尺寸过窄无法同时容纳图片和文本列的情况下禁用浮动。
当然,此解决方案仅适用于支持 CSS 媒体查询的浏览器。 对于其他浏览器,该解决方案将降级为原始问题。
@media screen and (max-width: 400px) {
img {
float: none;
}
}
使用伪元素的通用情况解决方案
当浮动元素具有任意宽度时,媒体查询解决方案不起作用,而且也不够优雅。

一个更好的解决方案是为每个段落添加一个具有所需最小段落宽度的不可见的 CSS 伪元素。 如果没有足够的空间容纳此伪元素,那么它将被推到图片下方,并将段落也带到下方。
此解决方案得到了大多数浏览器的支持。 在较旧的浏览器上,该解决方案会优雅地降级为原始问题。
p:before {
content: "";
width: 10em;
display: block;
overflow: hidden;
/* For Demonstration */
border: 1px solid green;
}
伪元素的绿色 border
仅用于演示目的。 该解决方案不需要它,您应该在代码中将其删除。 然后,伪元素将不会占用任何垂直空间。
演示和下载
关于作者
Gustav Andersson 是 The Modern Nomad 的作者,该网站探索了游牧生活方式,它让人们可以随时随地在任何地方生活和工作。 他是一个热爱探戈、斗牛、语法和燃烧人,他希望激发您去考虑没有地址的生活。
您也可以对段落使用 overflow: hidden 和最小宽度,以建立一个新的块级格式化上下文,这应该可以使其按照您的预期进行。
删除最小宽度以查看为什么这有效(它迫使段落不落到浮动内容的后面)。 我喜欢块级格式化上下文,而且它们的这种特性确实被低估了。
但这不会正确地包裹。
如果您写入更多文本,使段落比浮动图片更高,它不会从图片下方开始流动;它只会以恒定宽度的垂直列继续下去。
关于伪元素的有趣解决方案。
我以前使用过 float:none,但没有想到另一个。 下次我会试试。
好主意!
我在手机上,所以无法测试,但我认为相邻选择器可能在这里有用:“img + p:before”。
很好的建议,我很快就会尝试。
不错的技巧。 值得尝试
不错,很巧妙。
如果您将 img 标签放在段落之前或之后,这非常有效。 如果你将图片放在段落中间,那么段落将无法保持其最小宽度。
这仅适用于我们将图片浮动到右侧的情况。 左浮动怎么办? 我们是否还需要将伪元素浮动到右侧,或者使用绝对定位将伪元素移动到右侧? 我认为媒体查询仍然是最好的解决方案,我们可以从图片中获取 algnment 类,然后禁用浮动,或者只是通过媒体查询创建伪元素。
您好,
常见的电子邮件客户端是否支持此 CSS 技巧? 这是否可以成为避免使用表格的一种方法?
很棒的提示。 我相信我会经常使用它。
您也可以为图片设置最大宽度…… 例如 P 的 50%。
您刚刚给了我一个很棒的技巧,我相信我会使用它。
这在我的 FF 11.0 中无法正常工作,没有 P 标签上的顶部边框(border-top:1px solid transparent)——它会恢复到原始问题。
它在 IE8 中按照描述的方式工作,我没有机会测试其他浏览器。
很棒的帖子!我个人现在几乎所有东西都使用 min-width,哈哈。RWD 无处不在!
我们真正需要的是用连字符断行。不知道什么时候 web 浏览器才能发展到那种程度。
一个非常有用的解决方法!感谢您的见解,我相信这将非常有用。
不错的帖子 - 感谢分享 :)