html (+ css): позначає бажане місце для розриву рядка


109

Скажімо, у мене є цей текст, який я хочу відобразити у комірці таблиці 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>

Примітка. Схоже, поведінка CSS3text-wrap: avoid - це те, що я хочу, але, здається, я не можу змусити його працювати.


Ви можете використовувати пробіли всередині прольотів.
Габріеле Петріолі

3
Але я не хочу використовувати пробіли, що не порушуються. Я хотів би використовувати пробіли "не хочу-перервати тут, але-я-буду-коли-є", але, наскільки я знаю, вони існують.
Jason S

@Jason .. я відчуваю тебе .. але це неможливо .. додав відповідь.
Габріеле Петріолі

Драт, ось що відбувається, коли комп'ютерні вчені записують алгоритми візуалізації без введення друкарських видань.
Jason S

1
Ви повинні прийняти відповідь від @ EggertJóhannesson, оскільки це забезпечує хороший спосіб вирішення!
Габріеле Петріолі

Відповіді:


156

За допомогою

span.avoidwrap { display:inline-block; }

і загортання тексту, в якому я хочу зберігати разом

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

вона загортається спочатку в бажані блоки, а потім у більш дрібні фрагменти за потребою.


16
Чудово працює! Ще одна додаткова примітка: пробіли на початку та в кінці вбудованого блоку ігноруються, так що для розмежування тексту в блоках пробілом потрібно розмістити його між вбудованими блоками. Наприклад, якщо проміжки були стилізовані, щоб вони стали вбудованими блоками, то <span>Hello </span><span> world</span>вони будуть Helloworldі <span>Hello</span> <span>world</span>будуть нормальними Hello world.
користувач

2
<wbr> є більш семантичним і залишає контроль у браузері, що, як правило, добре. У цьому випадку це робить можливим злам, коли життєво важливий.
Lodewijk

Чудово працює - коли важливо, щоб символи, як "-", не перервались. Приклад: Perikles <span class = "Avowrap"> (гм & nbsp; 500-429 & nbsp; v.Chr.) </span>
Сара Дерева

10
@Lodewijk: <wbr>не вказується бажане місце для розриву лінії, але можливе .
Дан Даскалеску

1
Зауважте, що ця методика працює і для вкладених <span>s, тому ви можете (фактично) вказати ієрархію бажаних точок прориву .
Майкл Дік

24

Dan Mall - це дуже акуратне RWD-рішення . Я збираюся додати його сюди, тому що деякі інші запитання щодо чутливих розривів рядків позначені як копії цього.
У вашому випадку у вас є:

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

І один рядок CSS у вашому медіа-запиті:

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

7

Проста відповідь - використовувати символ простору нульової ширини. &#8203; Він використовується для створення пробілів всередині слів у певних точках .

Чи точно протилежне простору, що не порушується&nbsp; (ну, власне, словник &#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-рендерінг електронної пошти не є повністю стандартизованим, це корисно для такого виду використання, оскільки це рішення використовує не CSS / JS

Крім того, якщо ви використовуєте це в поєднанні з будь-яким із <span>базованих рішень, ви матимете повний контроль над алгоритмом розбиття рядків

(редакційна примітка :)

Єдина проблема, з якою я могла вас бачити, - це якщо ви хочете динамічно змінити точки кращої поломки. Це вимагає постійних JS-маніпуляцій із кожним із проміжків пропорційного розміру та обробляти ці HTML-елементи в тексті.


1
що таке хакі?
Jason S

Інші відповіді, використовуючи теги "span".

Хочу також зазначити, що, хоча це рішення не виглядає найпростішим, воно є найбільш надійним, оскільки ці структури не мають і не повинні часто змінювати семантичне представлення в браузерах, аналізаторах електронної пошти чи будь-якому іншому HTML-аналізаторі.

3

Відповідь - ні ( Ви не можете змінити використаний алгоритм розриву рядків ).

Але є деякі вирішення ( найкращий варіант - це прийнята відповідь )

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

Обидва рішення роблять те саме, і обидва не будуть розбивати групу слів, якщо це не вміститься самостійно.


argh :-( це смердить, це означає, що я або мушу з цим жити, або мені потрібно спробувати виявити довгі рядки самостійно, щоб спробувати перемогти алгоритм розриву рядків.
Jason S

Я відредагував вашу відповідь, щоб надати посилання на вирішення, оскільки я майже не продовжував читати через те, як формулюється ваш перший рядок.
arootbeer

@arootbeer: Я підтримую вашу редакцію, але Габі її відмінив. Габі: чому? Ви хочете ввести в оману користувачів?
Дан Даскалеску

@DanDascalescu, чи слід відповісти на всі питання ТАК, щоб вказати на прийняте на тій же сторінці? Моя відповідь має 1 ( суму ) голосів, і є прийнята відповідь з 48 голосами. Я майже впевнений, що прийнятим є той, хто привертає увагу ( і це правильно ). Крім того, я наполягаю, що немає способу змінити використаний алгоритм злому ( як вимагає ОП )
Габріеле Петріолі

1
перевірте, чи моє рішення використовує вашу власну логіку щодо вас. поєднайте це з будь-яким із проміжних рішень, тоді ви маєте повний контроль над алгоритмом розбиття

2

З надбавкою вище використання span { white-space:nowrap }. Це так добре, як можна реально очікувати.


Дякую, але це не спрацює, тому що в основному це перекладає пробіли в spanелементі &nbsp;, і не дозволяє пробілам порушуватися взагалі. Я просто хочу відмовити рендерінгу від прориву між одним із моїх предметів, але якщо це доведеться, я хочу, щоб він це зробив.
Jason S

@Jason S: До своєї відповіді я додав інші варіанти.
Марсель

як все &nbsp;<wbr>відрізняється від простору? З того, що я можу сказати, вибір чи то, що даний персонаж дозволяє перерву, чи ні. Тож "-" і "" і &#8203;і, <wbr>і &shy;все дозволяють перерву (друк дефісу, пробіл, нічого, нічого, а також дефіс лише на перерві відповідно), тоді як &nbsp;це не так.
Jason S

@Jason S: Додано приклад використання.
Марсель

Я просто спробував це, і, здається, не має пріоритету над пробілами для розриву рядків. Пріоритетним є те, що мені потрібно. Якщо поведінка зламу для іншого персонажа чи елемента є або так, або ні, тоді для моєї проблеми рішення не існує. Якщо є відносні пріоритети для розбиття рядків, я можу знайти рішення.
Jason S

1

Нова відповідь, тепер у нас є 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.


12
-1. Чому ви не тестувались перед тим, як порадитись? Це не працює. <wbr>має інше призначення. Не кажучи вже про те, що ця відповідь є дублікатом відповіді, що існувала задовго до цього.
користувач

1
WBR не має іншої мети. developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr
Lodewijk

13
<wbr>просто встановлює можливість перерви; це не говорить «браузеру перерватися туди раніше». Застосовуваний перед пробілом, він зазвичай марний, оскільки пробіли зазвичай є можливостями розриву рядків.
Jukka K. Korpela

5
Це не працює взагалі в будь-якому браузері. Відповідь неправильний: <wbr>це НЕ пріоритет розриву рядка над звичайним прогалиною. Тож обгортання просто відбувається, як звичайно, у прикладі.
Адріан

3
З метою уточнення, <wbr> призначений для сигналізації "ось місце, яке ви можете зламати", коли ця позиція в іншому випадку вважатиметься всередині слова . У ній сказано: "поводься з плямою між цими двома персонажами так, ніби там було пробіл", а не "вважай за краще тут прорватися". Якщо вже є пробіл, <wbr> не має значення.
напівколонка

-1

Ви можете просто відрегулювати параметри поля в CSS (маржина-права в цьому випадку).

text {
    margin-right: 20%;
}

-3

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


-5

Для цього ™ є HTML-елемент: (тепер стандартизований) <wbr>елемент .

Я б радив вам скористатися цим. Це може працювати не скрізь , але це найкраще, що можна зробити, не проходячи обручі.


3
-1: <wbr>призначено для позначення точок перерви дуже довгими словами, це не вирішує проблему з бажаними розривами рядків
користувач

4
@ user3075942 Пряма цитата з специфікації : " wbrЕлемент являє собою можливість розриву рядка." Це саме те , про що вимагала ОП. Перестаньте забороняти людям на основі того, що ви читаєте на вікі.
Mathias Bynens

3
Так, можливість . Але у браузерів вже є можливість перерватися на пробіли. Питання полягає в тому, як сказати браузеру, на які проміжки бажано пробиватися.
користувач

1
… І відповідь - використовувати <wbr>.
Mathias Bynens

8
Ні, це не відповідь. Це не збільшує ймовірність використання певної раніше існуючої точки перерви; це лише додає нової можливості точки перерви, де її ще не існує. Наявність двох можливостей поспіль не приносить користі. developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr
Torin Finnemann
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.