有跨浏览器的单词换行:溢出换行解决方案吗?

6

我正在尝试实现以下效果:

enter image description here

但似乎唯一的方法是使用 word-wrap: overflow-wrap,但它并没有得到广泛支持。

所以我唯一的解决方案似乎是使用: word-break: break-all,这将产生以下结果:

enter image description here

注意:第二张图片中的表单是如何破裂的?我需要使用哪些样式来获得第一张图片的结果?

JSFiddle链接:https://jsfiddle.net/jennifergoncalves/k4yn9ucf/

1个回答

4

word-wrap文档)是overflow-wrap的旧名。 word-wrap对于IE(11)、Edge和Opera Mini是必需的。 现在,其他主要浏览器都支持overflow-wrap来源)。 此属性可以设置为:

  • normal - 仅在单词之间断开
  • break-word - 必要时可以在单词中间断开

word-break相比,只有在无法将整个单词放置在自己的行上而不溢出时,overflow-wrap才会创建一个换行。

还有另一种属性称为word-break文档),它控制如何分解单词。 接受的值:

  • normal - 默认
  • break-all - 在单词的任意两个字符之间中断
  • keep-all - 对于非CJK(中文/日语/韩语)文本与normal相同

overflow-wrap相比,word-break会在文本溢出其容器的确切位置创建一个换行(即使将整个单词放在自己的行上也会否定需要换行的必要性)。

因此,似乎有两种选项可以获得正确的换行文本:

  • overflow-wrap: break-word
  • word-break: break-all

以下是这两个选项的比较,以及不换行的示例:

p {
  background-color: #009AC7;
  color: #FFFFFF;
  font-size: 18px;
  font-family: sans-serif;
  padding: 10px;
  text-align: justify;
  width: 250px;
}

.wrap1 {
  overflow-wrap: break-word;
}

.wrap2 {
  word-break: break-all;
}
No wrapping:
<p><b>pneumonoultramicroscopicsilicovolcanoconiosis</b> refers to a lung disease contracted from the inhalation of very fine silica particles, specifically from a volcano;</p>

<code>word-wrap: normal</code> and <code>word-break: normal</code>
<p class="wrap1"><b>pneumonoultramicroscopicsilicovolcanoconiosis</b> refers to a lung disease contracted from the inhalation of very fine silica particles, specifically from a volcano;</p>

<code>word-wrap: normal</code> and <code>word-break: break-all</code>
<p class="wrap2"><b>pneumonoultramicroscopicsilicovolcanoconiosis</b> refers to a lung disease contracted from the inhalation of very fine silica particles, specifically from a volcano;</p>

你能看到问题吗?例如,如果你正在使用最新版的 Chrome 浏览器,单词断开点会被随意放置。浏览器无法理解特定语言的连字规则,因此它可以将 from 分成 f-rom 等子串。
幸运的是,有一个叫做 hyphens 的属性(文档链接),可以解决这个问题。将值设置为 auto 就可以让浏览器自动决定何时连字。

连字规则是与语言相关的。在 HTML 中,语言由 lang 属性确定,仅当该属性存在且适当的连字词典可用时,浏览器才会连字。在 XML 中,必须使用 xml:lang 属性。

注意:规定连接连字的具体规则并没有在标准中明确定义,因此不同浏览器的连字效果可能会有所不同。

现在我们来看看它的实际应用:

p {
  background-color: #009AC7;
  color: #FFFFFF;
  font-size: 18px;
  font-family: sans-serif;
  hyphens: auto;
  -ms-hyphens: auto;
  -webkit-hyphens: auto;
  padding: 10px;
  text-align: justify;
  width: 250px;
}
<code>hyphens: auto</code>
<p lang="en-US"><b>pneumonoultramicroscopicsilicovolcanoconiosis</b> refers to a lung disease contracted from the inhalation of very fine silica particles, specifically from a volcano;</p>

在最新的Chrome浏览器上,这可以产生很好的效果(尽管文本中的间隙不太美观),符合英语断字规则。不幸的是,对于此属性的支持有些不稳定。Chrome仅在Mac和Android上支持此功能。Safari、IE和Edge需要使用供应商前缀(来源)。如果这对您来说足够好,请使用hyphens。否则,考虑使用替代方案,例如JavaScript自动分音节程序,例如Hyphenator。您的最后选择是使用分音节引擎解析文本并查找所有断词点,然后结合hyphens: manual将它们作为HTML软连字符&shy;插入到文本中。

1
简而言之,答案是否定的吗? - thephpdev
@thephpdev 是的,我认为目前CSS还不能做到这一点。更不用说如果你的网站是非英语语言的话,那就几乎没有希望了。JavaScript解决方案是可定制的(你只需要找到该语言的连字规则即可)。回退方案非常优雅,人们甚至不会注意到,因为大多数网站都不进行文本对齐。 - Aurel Bílý
在我的特定用例中,我需要这个能够跨浏览器工作。我将会寻找库来实现这一点。很有趣,乍一看似乎是一个简单的事情,多年来应该已经在浏览器中完全实现了,然后你意识到语言的微妙之处禁止了这样做。虽然在我的情况下,只需强制字符串换行即可。但我需要它能在至少IE9上工作。该死,企业系统落后得太远了。 - thephpdev
@thephpdev 支持遗留系统确实很痛苦。但是,自动换行并不是非常简单的事情 - 专业排版工具(Indesign、Quark、Latex)已经发展了几十年,以达到段落美观整齐、没有连字符梯子、没有孤立行,并且同时尊重音节和不在连词之间分割等等。为什么你一定要换行呢?长字符串吗? - Aurel Bílý
这是一个系统,可以添加标准化文档模板,包括经过批准的图像库和整个文档中所有字段的验证规则。然而,我们发现有些用户在无法适应一行的空间中输入了非常长的URL和电子邮件地址。如果这些内容开始溢出其容器,从用户的角度来看,它看起来并不好。而且,由于该系统生成用于打印的PDF文件,我们不能仅将其替换为可交互式PDF的可点击链接。 - thephpdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接