html(+css):表示换行符的首选位置

html(+css):表示换行符的首选位置,html,css,word-wrap,Html,Css,Word Wrap,假设我想在HTML表格单元格中显示以下文本: Honey Nut Cheerios, Wheat Chex, Grape-Nuts, Rice Krispies, Some random cereal with a very long name, Honey Bunches of Oats, Wheaties, Special K, Froot Loops, Apple Jacks 我希望行优先在一个逗号后断开 有没有一种方法可以告诉HTML渲染器尝试在某个指定位置中断,并且在尝试在其中一个空

假设我想在HTML表格单元格中显示以下文本:

Honey Nut Cheerios, Wheat Chex, Grape-Nuts, Rice Krispies, Some random cereal with a very long name, Honey Bunches of Oats, Wheaties, Special K, Froot Loops, Apple Jacks
我希望行优先在一个逗号后断开

有没有一种方法可以告诉HTML渲染器尝试在某个指定位置中断,并且在尝试在其中一个空格后中断之前先中断,而不使用非中断空格?如果我使用非打断空格,那么它会无条件地使宽度变大。我希望换行算法在其中一个空格之后发生换行,前提是换行算法先尝试使用逗号,但无法使换行匹配

我尝试将文本片段包装到元素中,但似乎没有任何帮助

<html>
  <head>
      <style type="text/css">
        div.box { width: 180px; }
        table, table td { 
          border: 1px solid; 
          border-collapse: collapse; 
        }
      </style>
  </head>
  <body>
    <div class="box">
      <table>
      <tr>
          <td>lorem ipsum</td>
          <td>lorem ipsum</td>
          <td>lorem ipsum</td>
      </tr>
      <tr>
          <td>lorem ipsum</td>
          <td>
            <span>Honey Nut Cheerios,</span>
            <span>Wheat Chex,</span>
            <span>Grape-Nuts,</span>
            <span>Rice Krispies,</span>
            <span>Some random cereal with a very long name,</span>
            <span>Honey Bunches of Oats,</span>
            <span>Wheaties,</span>
            <span>Special K,</span>
            <span>Froot Loops,</span>
            <span>Apple Jacks</span>
          </td>
          <td>lorem ipsum</td>
      </tr>
      </table>
    </div>
  </body>
</html>

注意:该行为似乎是我想要的,但我似乎无法使其正常工作。

使用而不是,或为SPAN指定一个类,并为其指定display:block属性。

使用SPAN{white space:nowrap}进行上面的标记。这真的和你想象的一样好。

答案是不,你不能改变使用的换行算法

但是有一些解决办法,最好的是

你可以使用不间断的空格,但只能在单词之间使用,这些单词在跨距中是连在一起的,但不能在逗号之后,或者你可以使用空白:nowrap,正如@Marcel提到的那样


这两种解决方案的作用是相同的,如果一组单词本身不适合,它们都不会打断它。

有一个HTML元素用于此™: .

我建议你用这个。它可能不起作用,但这是你在不经历困难的情况下所能做的最好的事情。

使用

span.avoidwrap { display:inline-block; }
并将我想要保存在一起的文本包装起来

<span class="avoidwrap"> Text </span>

它将首先包装在首选块中,然后根据需要包装在更小的片段中。

新答案现在我们有了HTML5:

HTML5引入了标签。它代表着破口大骂的机会

添加一个字符会告诉浏览器在其他任何地方之前先在那里断开,因此很容易在逗号后使单词断开:

Honey Nut Cheerios,<wbr> Wheat Chex,<wbr> Grape-Nuts,<wbr> Rice Krispies,<wbr> Some random cereal with a very long name,<wbr> Honey Bunches of Oats,<wbr> Wheaties,<wbr> Special K,<wbr> Froot Loops,<wbr> Apple Jacks

除了IE之外,我的所有主要浏览器都支持它。

我更喜欢一个非常简洁的RWD解决方案。我将把它添加到这里,因为关于响应换行符的一些其他问题被标记为这个问题的副本。 在你的情况下,你会:

<span>Honey Nut Cheerios, <br class="rwd-break">Wheat Chex, etc.</span>

一个简单的答案是使用零宽度空格字符&8203;它用于在特定点的单词内部创建分隔符

与不间断空格正好相反的词,实际上是joiner&8288;word joiner是零宽度版本的不间断空格

还有其他非中断代码,如非中断连字符&8209

如果您想要一个仅HTML无CSS/JS的解决方案,您可以使用零宽度空间和非中断空间的组合,但是这将非常混乱,编写一个人类可读的版本需要一点努力

ctrl+c,ctrl+v有帮助

例如:

   Honey&nbsp;Nut&nbsp;Cheerios,<!---->&#8203;<!--
-->Wheat&nbsp;Chex,<!---->&#8203;<!--
-->Grape&#8209;Nuts,<!---->&#8203;<!--
-->Rice&nbsp;Krispies,<!---->&#8203;<!--
-->Some&nbsp;random&nbsp;cereal&nbsp;with&nbsp;a&nbsp;very&nbsp;long&nbsp;name,<!---->&#8203;<!--
-->Honey&nbsp;Bunches&nbsp;of&nbsp;Oats,<!---->&#8203;<!--
-->Wheaties,<!---->&#8203;<!--
-->Special&nbsp;K,<!---->&#8203;<!--
-->Froot&nbsp;Loops,<!---->&#8203;<!--
-->Apple&nbsp;Jacks
然而,由于电子邮件html呈现不是完全标准化的,因此这种使用很好,因为此解决方案不使用CSS/JS

此外,如果您将其与任何基于的解决方案结合使用,您将完全控制断线算法

编辑注:


我能看到的唯一问题是,你是否想动态地更改首选破损点。这将需要对每个跨度按比例大小进行恒定的JS操作,并且必须处理文本中的HTML实体。

在这种情况下,您只需调整CSS页边距中的页边距设置即可

text {
    margin-right: 20%;
}

您应该使用Unicode实现的目的是提供最佳结果:

方法结果 wbr>蜂蜜坚果Cheerios、小麦Chex、葡萄和8209;坚果,脆米饼,一些名字很长的随机谷物,蜂蜜燕麦,小麦,特殊K,弗罗特圈,苹果杰克 U+200B零宽度空间蜂蜜坚果Cheerios,&8203;小麦干酪&x200b;葡萄&8209;螺母&x200b;米脆饼&x200b;一些名字很长的随机谷物,&x200b;蜂蜜燕麦串&x200b;小麦,&x200b;特殊K&x200b;弗罗特环&x200b;苹果千斤顶 U+00A0号和8209号;打破蜂蜜坚果Cheerios,小麦Chex,葡萄&8209;坚果,脆米饼,一些名字很长的随机谷物,蜂蜜燕麦,小麦,特殊K,弗罗特圈,苹果杰克
可以在跨距内使用非打断空格,但我不想使用非打断空格。我很想使用“不想在这里打破,但我会在我必须的情况下打破”的空格,但据我所知,这些空格是存在的。@Jason。。我感觉到你。。但这是不可能的。。添加了一个answer.drat,这就是计算机科学家编写渲染算法时没有排版师输入的情况。你应该接受@EggertJóhannesson的答案,因为它提供了一个很好的解决方法!谢谢,但这不起作用,因为它基本上会将跨度元素中的空间转换为,并防止空间断裂。我只是想劝阻你

渲染器不能在我的一个项目之间打断,但如果必须这样做,我希望它这样做。@Jason S:我在答案中添加了其他选项。与空格有什么不同?据我所知,选择要么是给定角色允许中断,要么不允许中断。所以“-”和“-”以及&8203;而且&害羞;都允许换行符分别在换行符上打印连字符、空格、nothing、nothing和连字符,但不允许。@Jason S:添加了示例用法。我刚刚尝试过,似乎换行符的优先级并不高于空格。优先权是我需要的。如果不同角色或元素的中断行为为是或否,则我的问题没有解决方案。如果存在相对的换行优先级,那么我可能有一个解决方案。argh.:-这太糟糕了,这意味着我要么不得不忍受它,要么我需要试着自己检测长线,试图击败断线算法。我编辑你的答案是为了提供一个到解决方法的链接,因为我几乎没有继续阅读,因为你的第一行的措辞方式。@arootbeer:我支持你的编辑,但加比又把它恢复了过来。加比:为什么?你想误导用户吗?@DanDascalescu,是否应该将所有答案更改为指向同一页面中已接受的答案?我的答案有1票赞成,48票赞成。我非常肯定,被接受的人是受到关注的人,这是正确的。除此之外,我坚持认为没有办法改变OP请求检查时使用的中断算法。我的解决方案使用您自己的逻辑来反对您。将其与任何跨度解决方案相结合,就可以完全控制换行算法-1:用于在很长的单词上标记换行点,它不能解决首选行的问题breaks@user3075942直接引用:“wbr元素代表一个换行机会。”这正是OP所要求的。不要根据你在维基上读到的内容来贬低别人。是的,机会。但浏览器已经有机会在空格处突破。问题是如何告诉浏览器在哪个空间最好断开…答案是使用。不,这不是答案。它不会增加使用特定预先存在的断点可能性的可能性;它只增加了一个新的断点可能性,而这个断点可能性并不存在。一行有两个可能性是没有任何用处的-1.你为什么在提出建议之前不进行测试?它不起作用。还有另一个目的。更不用说这个答案与很久以前存在的答案是重复的。WBR没有其他用途。只是设立了一个休息的机会;它不会“告诉浏览器在其他任何地方之前先在那里断开”。在空格之前使用,它通常是无用的,因为空格通常是换行的机会。这在任何浏览器中都不起作用。答案是错误的:没有将换行优先于普通空格。因此,在这个例子中,换行是正常的。为了澄清,这里的意思是表示一个你可以打破的地方,否则这个位置会被认为是在一个单词中。它说,把这两个角色之间的位置当作有空格一样对待,而不是在这里打断。如果已经有了空间,就没有意义了。太棒了!只需另外注意一点:内联块的开始和结束处的空格将被忽略,因此要按空格分隔块中的文本,需要将其放置在内联块之间。例如,如果跨距的样式设置为内联块,那么Helloworld将是Helloworld,Helloworld将是普通Helloworld。更具语义,在浏览器中保留控件,这通常是一件好事。在这种情况下,它可以在重要的时候打破。非常有效-在重要的时候,就像不打破一样。示例:Perikles um 500-429 v.Chr。@Lodewijk:不表示打断线的首选位置,但表示可能的位置。请注意,此技术也适用于嵌套的s,因此,您实际上可以指定首选断点的层次结构。什么是span HACK?其他答案利用了span标记。我还想指出,虽然此解决方案似乎不是最简单的,但它是最可靠的,因为这些实体不会也不应该经常在浏览器之间更改语义表示,电子邮件解析器,或任何其他HTML解析器。如果您正在破坏的文本被复制并以某种方式解析,您可能会遇到问题,那么额外的数字可能会妨碍您。如果您试图在@处破坏电子邮件,复制和粘贴将失败,用户不知道原因。如果您希望数据由爬虫读取或复制粘贴,我不会建议这种解决方案。
   Honey&nbsp;Nut&nbsp;Cheerios,&#8203;Wheat&nbsp;Chex,&#8203;Grape&#8209;Nuts,&#8203;Rice&nbsp;Krispies,&#8203;Some&nbsp;random&nbsp;cereal&nbsp;with&nbsp;a&nbsp;very&nbsp;long&nbsp;name,&#8203;Honey&nbsp;Bunches&nbsp;of&nbsp;Oats,&#8203;Wheaties,&#8203;Special&nbsp;K,&#8203;Froot&nbsp;Loops,&#8203;Apple&nbsp;Jacks
text {
    margin-right: 20%;
}