Html (+ css): обозначение предпочтительного места для разрыва строки

Скажем, у меня есть этот текст, который я хочу отобразить в ячейке таблицы 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 попробовать взломать в определенном месте и сделать это сначала, прежде чем пытаться сломать одно из пространств, не используя неразрывные пробелы? Если я используйте неразрывные пробелы, а затем делает ширину более безусловной. Я хочу, чтобы разрыв строки произошел после одного из пробелов, если алгоритм обертки строк попробовал его с запятыми и не смог получить строку.

Я попытался обернуть фрагменты текста в элементах <span>, но это, похоже, ничего не помогает.

<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>

Примечание. Похоже, что CSS3 text-wrap: avoid поведение - это то, что я хочу, но я не могу заставить его работать.

Ответ 1

Используя

span.avoidwrap { display:inline-block; }

и обертывание текста, который я хочу сохранить вместе

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

он обернет сначала в предпочтительные блоки, а затем поменьше фрагментов по мере необходимости.

Ответ 2

Там очень аккуратное RWD-решение от Dan Mall, которое я предпочитаю. Я собираюсь добавить это здесь, потому что некоторые другие вопросы, касающиеся гибких разрывов строк, помечены как дубликаты этого.
В вашем случае у вас будет:

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

И одна строка CSS в вашем медиа-запросе:

@media screen and (min-width: 768px) {
    .rwd-break { display: none; }
}

Ответ 3

Простым ответом является использование символа пробела с нулевой шириной &#8203; Он используется для создания разрывов внутри слов в определенных точках.

Существует ли полная противоположность неразрывного пространства &nbsp; (ну, на самом деле word-joiner &#8288;) (word-joiner - ширина версии неразрывного пространства)

(существуют и другие не нарушающие коды, такие как неразрывный дефис &#8209;) (здесь приведен обширный ответ на разные "варианты" NBSP)

Если вы хотите использовать только 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 без тегов комментариев:

   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 html не полностью стандартизирован, его полезно для такого использования, так как это решение не использует CSS/JS

Кроме того, если вы используете это в сочетании с любым из решений, основанных на <span>, вы получите полный контроль над алгоритмом прерывания строки

(редакционная заметка:)

Единственная проблема, с которой я мог столкнуться, - это если вы хотите динамически менять точки предпочтительного ломания. Это потребует постоянной JS-манипуляции с каждым пропорциональным размером пролета и необходимость обработки этих HTML-объектов в тексте.

Ответ 4

Ответ - нет (вы не можете изменить используемый алгоритм разрыва строки).

Но есть некоторые обходные пути (лучший из них - принятый ответ)

Вы можете приблизиться к нерасширяющемуся пространству &nbsp;, но только между словами, которые идут вместе (что у вас есть в промежутках, но не после запятой), или вы можете использовать white-space:nowrap как @Marcel, упомянутый.

Оба решения делают то же самое, и оба будут не разбивать группу слов, если она не подходит сама по себе.

Ответ 5

С вашей надписью выше используйте span { white-space:nowrap }. Это так хорошо, как вы можете ожидать действительно.

Ответ 6

Новый ответ теперь у нас есть HTML5:

HTML5 представляет тег <wbr>. (Это означает Word Break Opportunity.)

Добавление <wbr> означает, что браузер прерывается там где-нибудь еще, поэтому легко разбить слова после запятых:

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.

Ответ 7

Вы можете просто настроить параметры полей в CSS (в этом случае margin-right).

text {
    margin-right: 20%;
}

Ответ 8

Используйте <div> вместо <span> или укажите класс для SPAN и присвойте ему атрибут display: block.