有时,非常长的文本字符串可能会超出布局容器的范围。
例如

这是一个包含所有相关 CSS 属性的大片段代码
.dont-break-out {
/* These are technically the same, but use both */
overflow-wrap: break-word;
word-wrap: break-word;
-ms-word-break: break-all;
/* This is the dangerous one in WebKit, as it breaks things wherever */
word-break: break-all;
/* Instead use this non-standard one: */
word-break: break-word;
/* Adds a hyphen where the word breaks, if supported (No Blink) */
-ms-hyphens: auto;
-moz-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
这将为我们解决问题

以下是要点
overflow-wrap: break-word;
确保长字符串会换行,而不是超出容器。您也可以使用word-wrap
,因为规范中说明,它们实际上只是彼此的替代名称。一些浏览器支持其中一个,而不支持另一个。Firefox(测试版本 v43)仅支持word-wrap
。Blink(测试版 Chrome v45)可以接受这两个名称。- 仅使用
overflow-wrap
时,单词会在需要换行的地方换行。如果存在“可接受的换行符”(例如文字短划线),则会在该处换行,否则它会根据需要进行换行。 - 您也可以使用
hyphens
,因为它会在浏览器支持的情况下尝试在换行处巧妙地添加连字符(在撰写本文时,Blink 不支持,Firefox 支持)。 word-break: break-all;
用于告诉浏览器可以在任何需要的地方换行。尽管它无论如何都会这样做,所以我不知道在哪些情况下它 100% 必要。
如果您想更手动地使用连字符,可以在标记中建议它们。查看MDN 页面上的更多信息。
浏览器支持
word-break
对于 这些浏览器支持数据来自Caniuse,其中包含更多详细信息。数字表示浏览器在该版本及更高版本中支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
44 | 15 | 5.5 | 12 | 9 |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 127 | 9.0-9.2 |
hypens
对于 这些浏览器支持数据来自Caniuse,其中包含更多详细信息。数字表示浏览器在该版本及更高版本中支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
88 | 6* | 10* | 12* | 5.1* |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 127 | 4.2-4.3* |
overflow-wrap
对于 这些浏览器支持数据来自Caniuse,其中包含更多详细信息。数字表示浏览器在该版本及更高版本中支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
23 | 49 | 11 | 18 | 6.1 |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 4.4 | 7.0-7.1 |
text-overflow
对于 这些浏览器支持数据来自Caniuse,其中包含更多详细信息。数字表示浏览器在该版本及更高版本中支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
4 | 7 | 6 | 12 | 3.1 |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 2.1 | 3.2 |
使用省略号防止溢出
另一种需要考虑的方法是完全截断文本,并在文本字符串到达容器时添加省略号
.ellipses {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
使用 text-overflow
的好处在于它得到普遍支持。
示例
查看 CSS-Tricks 的 CodePen 上的笔 Hyphenate Long Words(@css-tricks)。
查看 CSS-Tricks 的 CodePen 上的笔 Ellipses(@css-tricks)。
查看 Chris Coyier 的 CodePen 上的笔 Figuring Out Line Wrapping(@chriscoyier)。
更多资源
- Michael Scharnagl:在 CSS 中处理长单词
- Kenneth Auchenberg:使用 CSS 进行单词换行/连字符化
- MDN:word-wrap、word-break、hyphens
- 规范:CSS 文本级别 3
对于 SCSS 爱好者
这些通常是您根据需要散布到代码中的内容,因此它们可以作为不错的 @mixins
@mixin word-wrap() {
overflow-wrap: break-word;
word-wrap: break-word;
-ms-word-break: break-all;
word-break: break-all;
word-break: break-word;
-ms-hyphens: auto;
-moz-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
@mixin ellipsis() {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
显然,
overflow-wrap
是新的word-wrap
,因为它已从 CSS3 规范中删除。我几天前才阅读到这一点,以及其他一些有趣的提议排版属性http://www.impressivewebs.com/new-css3-text-wrap/
值得注意的是:尽管 word-wrap 已从规范中删除,但目前没有浏览器支持替换属性!
但在您急于更改刚刚添加的所有 word-wrap 好处之前 - 来自规范:“出于遗留原因,UA 也可以接受‘word-wrap’作为‘overflow-wrap’属性的替代名称。”
周围的元素必须具有指定的宽度,否则您的长 URL 仍会超出框。
您解决了我的一个问题。太棒了!
感谢 agentsuperdave,这个技巧非常有用。对于表格,这意味着您应该使用“table-layout: fixed”并为您的 td 指定宽度。
Quentin,我爱你,伙计,你救了我!;)
顺便说一句。我没有声明宽度,只是“table {table-layout: fixed; width: 100%}”和“table a {word-wrap: break-word}”。
我没有声明“td”的宽度,只是…
是的,它也起作用。在我的例子中,我需要为每一列设置不同的宽度。
非常感谢,我找了大约一个小时的FF中的断字解决方案。干杯
您的稳健解决方案解决了我的问题,我的 URL 在设置为响应式的表格(display:block)中不想换行。干杯!
修复示例来自
到
如果这些选项没有给你足够的控制权,请参阅 SO 上的这个问题,尤其是我的两个答案(;-),http://stackoverflow.com/a/6298738/736006 和 http://stackoverflow.com/a/6508168/736006。
谢谢!
我尝试使用这个
// 在顶部帖子中给出
-ms-word-break: break-all;
word-break: break-all;
-webkit-hyphens: auto;
-moz-hyphens: auto;
hyphens: auto;
但不起作用。
直到我添加
float:left 和宽度。
现在它运行得非常好。
这在所有浏览器中都运行良好。
我尝试了所有这些解决方案,它在 Safari、Firefox 和 IE 中完美运行,但在最新的 Chrome 中不起作用。
我现在最终使用的解决方案来自这篇文章
文章说它应该在 Chrome 中工作。有谁知道问题可能是什么吗?
如果您使用 Compass,则可以使用包含所有这些代码的 mixin
感谢 @Damon 的提示。遗憾的是,我没有使用 Compass,并且在我的工作公司没有使用它的选项。
但是 mixin 中的代码是否包含适用于 Chrome 的代码?
谢谢,这真的很有用,帮助我修复了 Drupal 站点预页脚区域中链接不换行的问题。您可能对在此处查看第三个预页脚区域的结果感兴趣:http://www.mtusesthis.com/
这会换行每个单词,所以即使我在一行末尾有“teams”,并且它不太合适,“s”也会被推到下一行。我只希望换行比我的 div 宽度更长的单词。我在这里做错什么了吗?还有什么我可以做到的吗?谢谢。
我认为您应该考虑包含一个 js 库来获得这样的改进 - 例如:https://code.google.com/p/hyphenator/
它有一个设置可以获得这种行为:minwordlength : 10
太棒了!它就像一个魅力^.^,谢谢你的提示!
还有太长的电子邮件地址?
确实,为了获得更多控制,请查看上面我提到的 Stack Overflow 帖子。如果 js 是一个选项,它非常有效。
Dave 是对的,实际上,js *应该*是一个选项,因为我们谈论的是——本质上——美学
谢谢 Chris!我一直在为此而苦恼!
在我的 FF、Chrome 和 Safari 中运行良好,没有检查 IE
我正在使用 DocBook,它输出到 PDF。我的表格单元格的内容没有换行,单词很长并且没有空格。我相信我们的 css 是 docbook_custom.xsl 我在哪里设置这些换行和断字语句?
确实很有用。谢谢。
break-all
在奇怪的地方断字对我来说是不可取的,所以我删除了它,而是添加了word-wrap: break-word
。我的 mixin 现在看起来像这样
它似乎在 Chrome、Safari、Firefox、IE9-10 中运行良好,除非我遗漏了什么。
您的解决方案似乎比文章中的解决方案更好。我遇到的问题是超长单词按预期换行,但可以放在下一行的较小单词也会被换行,而不是简单地“推”到下一行。
查看“错误的”一个(Chris 的解决方案),注意“d”被切断了:http://imgur.com/avo2kxS,i0aqqwX#1
查看好的一个(Sugarenia 的解决方案):http://imgur.com/avo2kxS,i0aqqwX
谢谢!一直在寻找它。
太棒了!在遇到由于长单词/字符串/文本导致的布局问题时,指引我走向正确的方向。谢谢。
PHP 和 HTML5 来救援
$url = str_replace(‘/’,’/<WBR>’,htmlentities($url))
当然,不要对 HREF 中的 url 执行此操作,只需对显示的 url 执行此操作。
非常感谢你的提示。在 %width 表格中使用长单词时有效
非常感谢。我有一个跨越 100% 屏幕宽度的表格,前两列包含时间戳和昵称(后者宽度可变),第三列包含文本,并且应该填充可用空间。但是,长 URL 持续添加水平滚动条,因为它们将表格扩展到超过 100% 的屏幕宽度。您的 CSS 使文本列在应该换行时精确换行,不多不少(在任意两个字符之间换行)或更少(使用水平滚动)。谢谢。
如果所有这些建议都失败了,请确保您的长文本不受 { white-space: nowrap } 的影响(捂脸)
省略号用于单行截断。但是,还没有很好的方法来截断多行元素。例如,假设您的文本跨越 3(或更多)行,但您希望在显示省略号之前允许最多 2 行文本。没有好的方法可以做到这一点。
这里有很多方法:https://css-tricks.org.cn/line-clampin/
可以尝试这个 JavaScript 解决方案
它会裁剪到设定的行数,添加省略号,并且具有响应性。它还可以通过点击扩展副本,但此功能可以编辑掉。
我们在乐购食品爱情故事中成功使用了它
https://www.tesco.com/food-love-stories/
我之前已经看到过那个了,但正如你在那篇文章中写道的那样:“有几种方法可以实现,没有一种特别出色。”我本来打算看看 Clamp.js 的方法,但你文章中的示例似乎不起作用,这让我打消了进一步调查的念头。我只是希望有一种标准的方法来做这件事。
值得注意的是,Chrome 在使用表格内联元素时,其行为与 IE 11 和 Edge 不同。
Chrome 的效果符合预期,但 IE 11 和 Edge 则需要将混合类应用于“td”本身
连字符分割是一个不错的技巧。而省略号则存在跨浏览器问题。
我总是大约 90% 的时间都会访问这个网站寻找有效的 CSS 答案。其他网站提供建议但解决方案不起作用,这让我非常恼火。StackOverflow 是罪魁祸首。关于换行长文本的内容非常好。我们将在我们的网站上使用它。
@Dave Murray:确实如此 :D
不错的 Mixin,太棒了!
唯一在所有浏览器中都对我有用的方法是
word-break: break-word;
哎呀,抱歉,打错了。应该是
word-break: break-all;
使用 flex 时,有时不起作用。
您需要使用
在块上,除了
break-word
规则之外。根据此 CodePen
http://codepen.io/anon/pen/YWZWJV
我无法让 URL 仅在 IE 中的表格单元格中换行。如这里所述
IE 期望 CSS 应用于 td 和/或表格,它包装其中的所有文本,而不仅仅是 URL。有人知道解决方法吗?
完美的解决方案。break-word 与 break-all 让我很头疼,在一个动态大小的 div 中,使用 display:table-cell;
效果非常好。就像这样在一个新的网站上使用了一个很长的电子邮件地址。
太棒了!感谢你的工作,Chris!
Chris,感谢你的提示!在撰写本文时,Chrome 仍然不支持连字符,因此换行/断字解决方案仍然必要。Firefox 很乐意在 / 字符处换行长 URL,只需使用连字符即可。
非常感谢!非常有帮助,我甚至还留下了评论 ;-)
早上好,同志们。我可能错过了,但有没有办法设置它,使其仅在屏幕达到特定尺寸时才生效?例如,标题或标题在桌面和平板电脑上显示正常,但在智能手机上向右超出屏幕?发生这种情况时,最好有一些东西可以减小相关元素的字号。
正是我需要的!非常感谢!
今天刚遇到这个问题:IE11 和 Edge 中存在一个问题 - 如果包含长 URL/单词的文本的容器具有
display: flex
,则它不会换行。此笔记录显示了一个简化的演示:https://codepen.io/jdsteinbach/pen/JBZrLR?editors=1100嘿,Chris!根据《芝加哥格式手册》,“为了避免混淆,包含连字符的地址绝不应在连字符处断开;也不应添加连字符以断开电子邮件地址或 URL。”
如果遵循此建议,则
hyphen: auto
仅应应用于长单词,因为它会添加连字符以强制换行。但是,即使您停止使用hyphen: auto
针对 URL,如果它们包含连字符,它们也可能会断开。这仍然会导致混淆,因为不清楚连字符是 URL 的一部分还是为了分隔段落而添加的。根据最新版本的文本模块级别 3,可以使用
hyphen
属性的“none”值来实现这一点,该值定义为表示,“即使单词内部的字符明确定义了连字符机会,也不会对单词进行连字符分割”CSS 文本级别 3 未定义连字符分割的确切规则或连字符分割机会是什么,但 Unicode.org 却定义了,“空格和连字符用于确定断字” 不幸的是,即使规范说不应该,
hyphen: none
仍然会在连字符(明确定义的连字符机会)处断字。我正在尝试将长文件名与以下内容一起使用
overflow: hidden;
text-overflow: ellipsis;
width: 70%;
如果文件名由字母、空格或“_”组成,它可以正常工作,但如果存在“ - ”,则会在多行中断字,并且不会实现省略号。
有没有办法克服这个问题?
提前感谢 :)
在 Internet Explorer 11 和 Microsoft Edge 42.17134.1.0 中,我需要在 div 标签中显示文本 9999\XY5514Z。由于提到的文本中存在反斜杠“\”,文本被拆分为 9999 和 XY5514Z。相同的代码在 chrome 和 Firefox 中按预期工作。我的 CSS 中有 word-break: normal;,并且我希望将完整的“9999\XY5514Z”换行,而不是在单词渲染的行中没有足够空间时换行所有“\”之后的文本。在 Internet Explorer 11 和 Microsoft Edge 42.17134.1.0 中,结果显示为 9999,然后下一行显示剩余文本 \XY5514Z。在 Chrome 和 Firefox 中,文本按原样显示 9999\XY5514Z,这是正确的。我不希望单词在 IE 和 Edge 中的反斜杠“\”处断开。
非常长的电子邮件地址怎么办,例如:[email protected]?
谢谢!你帮了我很大的忙
另请参阅:
<wbr>
标签。MDN 对“word-break: break-word;” 嗤之以鼻,但这解决了我的问题,这里没有其他建议能帮我解决,直到我在我的段落样式中添加了它。
谢谢,这很有帮助。我很难让 URL 保留在我的 HTML 电子邮件框架内。我添加了这个 CSS,它像魅力一样工作。非常感谢!
非常感谢 :),我搜索了几个小时才找到如何解决这个问题!在带有英文链接的 Wordpress rtl 中,页面宽度被破坏了,主题开发人员似乎只添加了“word-wrap: break-word;”,它在 Firefox 中工作正常,但在 Chrome 中却不行,因此在添加 overflow-wrap: break-word; 之后,它现在看起来正常了。
哇!非常感谢!!这解决了我的 URL 溢出问题!