Чи може CSS змусити переривати рядок після кожного слова в елементі?


159

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

На жаль, власник не є комп’ютерним хлопцем, тому, якщо він побачить, foo<br />barє шанс, що-небудь змінить дані, коли він перекладає.

Чи є рішення CSS (окрім зміни ширини), яке слід застосувати до елемента, який би порушувався після кожного слова?

(Я знаю, що я можу це зробити в PHP, але мені цікаво, чи є витончений трюк, про який я не знаю в CSS, щоб виконати те саме, можливо, в особливостях CJK.)

EDIT

Я спробую скласти схему того, що відбувається:

----------------          ----------------
| Short Word   |          | Gargantuan   |
|              |          | Word         |
----------------          ----------------

Довге слово розривається автоматично, коротке - ні. Я хочу, щоб це виглядало так:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------

2
У HTML елементи розбиваються після кожного слова, коли цього вимагає ширина заданого елемента. Ви маєте на увазі під словами?
Пол Д. Уейт

@Paul - Ні, мені потрібно рішення, яке не засноване на фіксації ширини. Проблема полягає в тому, що деякі фрази довші та розриваються автоматично (як ви описуєте), а деякі фрази коротші та не ламаються, що робить непослідовну презентацію.
Бен

@Paul - Так, ви точно описуєте. Не шкодить макеті насправді, але це може виглядати краще.
Бен

Ви можете використати інтервал між словами, але це вплине на всі слова.
meo

@meo - Виглядає так, дякую за думку
Бен

Відповіді:


261

Використовуйте

.one-word-per-line {
    word-spacing: <parent-width>; 
}

.your-classname{
    width: min-intrinsic;
    width: -webkit-min-content;
    width: -moz-min-content;
    width: min-content;
    display: table-caption;
    display: -ms-grid;
    -ms-grid-columns: min-content;
}

де <parent-width>ширина батьківського елемента (або довільне високе значення, яке не вкладається в один рядок). Таким чином ви можете бути впевнені, що навіть після однієї літери є навіть перерва рядка. Працює з Chrome / FF / Opera / IE7 + (і, мабуть, навіть IE6, оскільки він також підтримує інтервал між словами).


Це, безумовно, найкраща відповідь imho
Hezad

31
@ToniMichelCaubet Відповідь насправді важко інтерпретувати, але він означає: .parent { word-spacing: 100px; }де 100pxширина батьківського елемента. Проблема полягає в тому, що це рішення не працює, якщо у вас рідний батько.
Джон Курлак

5
Просто встановіть дуже високе значення для проміжків слів, таких як, word-spacing: 100000pxі вам не доведеться турбуватися про те, що батьки є текучими з точки зору ширини. Встановлення проміжку слів у 100% мало б сенс (це було б 100% батьківської ширини), але значення, виражені у відсотках, не підтримуються для цього властивості css.
sboisse

1
Це було дуже корисно. Я використовував це у чуйній ситуації, коли на одній ширині я хочу загорнути текст у вкладках, щоб вони були однакової висоти: word-spacing: 2em; і на мобільній ширині я хочу, щоб вони були однорядними:word-spacing: unset;
Чи буде

1
Це дивно. З років у майбутнє, дякую купу :)
Лукас Медіна

124

Відповідь, надана @HursVanBloob, працює лише з батьківським контейнером фіксованої ширини, але не виходить у випадку контейнерів із шириною рідини .

Я спробував багато властивостей, але нічого не вийшло, як очікувалося. Нарешті я прийшов до висновку, що надання word-spacingдуже величезної цінності працює прекрасно.

p { word-spacing: 9999999px; }

або, для сучасних браузерів ви можете використовувати vwблок CSS (ширина візуалу у% від розміру екрана).

p { word-spacing: 100vw; }

ось що я спробую!
васкорт

Це чудове рішення!
Джо Конлін

Повністю розривається з & nbsp; хоч.
Метт Флетчер

2
Ну, це не працює для мене, що змушує ширину рідини контейнера дуже великою.
Онза

@Onza Ви можете поділитися загадковою посиланням, показуючи свою проблему?
Діпак Ядав

37

Альтернативне рішення описується в Окремому реченні до одного слова на рядок шляхом застосування display:table-caption;до елемента


Це насправді лише групи слів на основі ширини найдовшого слова.
Джеймс Саут

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

1
Це той, який прекрасно працював для мене, приємний!
Метт Флетчер

1
Це не дає жодного результату
jafarbtech

32

Спробуйте використовувати white-space: pre-line;. Він створює розрив рядків, де б не з'явився перерив рядка в коді, але ігнорує зайвий пробіл (вкладки та пробіли тощо).

Спочатку напишіть свої слова в окремі рядки у своєму коді:

<div>Short
Word</div>

Потім застосуйте стиль до елемента, що містить слова.

div { white-space: pre-line; }

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

<div>
    Short
    Word
</div>

Існує чудова стаття про фокуси CSS, що пояснює інші атрибути пробілу.


Ви повинні пояснити, як white-spaceможна відповісти на запитання. Вибачте, але я не бачу як.
jlgrall

2
Ну а стаття про CSS Tricks пояснює це повністю, тому я подумав, що посилання буде достатньо, а не намагатися відрегулювати відповідь тут.
Насс

Гаразд, ви пропонуєте поставити справжні розриви рядків у джерело та використовувати CSS white-space: pre;для відображення " " розривів рядків, як це <pre>робив би тег? " Це могло б спрацювати, і перерив рядків повинен виглядати більш природно для перекладачів, ніж <br />. Я спробую відредагувати вашу відповідь, щоб додати її :)
jlgrall

Саме так. Насправді, white-space: pre-line;напевно , було б доречніше, оскільки воно ігнорує зайвий пробіл у вашому коді. Я оновлю відповідь.
Насс

Добре, можливо, просто додайте white-space: pre;для IE 7.
jlgrall

12

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

Альтернативний метод - надати контейнеру ширину 0 і переконатися, що переповнення видно. Тоді кожне слово перепливе з нього і опиниться на своєму рядку.

div {
  width: 0;
  overflow: visible;
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

Або ви можете скористатись одним із нових запропонованих widthзначень за умови, що вони ще існують до того моменту, коли ви це прочитаєте.

div {
  width: min-intrinsic;       /* old Chrome, Safari */
  width: -webkit-min-content; /* less old Chrome, Safari */
  width: -moz-min-content;    /* current Firefox */
  width: min-content;         /* current Chrome, Safari; not IE or Edge */
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>


4

Ви не можете орієнтуватися на кожне слово в CSS. Однак, трохи jQuery ви, напевно, могли.

За допомогою jQuery ви можете обернути кожне слово в a, <span>а потім набір CSS, на display:blockякому буде розміщено його у своєму рядку.

Теоретично звичайно: P


Так, я цього боявся. Могло це зробити і в PHP, але це здається некрасивим рішенням. Я думав, що там може бути якийсь :first-childтрюк або щось таке ...
Бен

@Steve: ні, CSS-селектори в даний час дозволяють лише вибирати елементи HTML, а не текстові вузли. Я переглянув модуль CSS 3 Text , але, здається, там нічого немає, що змушує перерву після кожного слова в елементі. Рішення Марка - ваша найкраща ставка.
Пол Д. Уейт

@Paul, @Mark - Якщо хтось із вас, хлопців, захоче представника, ви можете зробити цю відповідь, і я прийму його. Я буду відзначати це як невідчутне (поки що) для meta.stackoverflow.com/questions/48013/… .
Бен

Я думаю, що Марк вже зробив це відповіддю.
Пол Д. Уейт

@Paul - Гравець команди +1 подарує хлопцеві знак чи щось таке:
Бен

2

https://jsfiddle.net/bm3Lfcod/1/

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

//the parent (example of what it may be)
div {
  display:flex;
  width: 100%;
}

//The children
a {
  display: inline-block;
}

//text wrapper
span {
  display: table-caption;
}

Спробуйте надати цьому проміжку будь-яке інше CSSмайно, яке ви можете надати. Скажіть майно, яке може спричинитиbrowser reflow
Діпак Ядав

1
поповнення браузера?
Онза

2

Я зіткнувся з тією ж проблемою, і жоден із варіантів тут мені не допоміг. Деякі поштові служби не підтримують задані стилі. Ось моя версія, яка вирішила проблему і працює скрізь, де я перевіряв:

<table>
    <tr>
        <td width="1">Gargantuan Word</td>
    </tr>
</table>

АБО за допомогою CSS:

<table>
    <tr>
        <td style="width:1px">Gargantuan Word</td>
    </tr>
</table>

2

Найкраще рішення - word-spacingвласність.

Додайте <p>в контейнер із певним розміром (приклад 300px) і після цього потрібно додати цей розмір як значення в інтервалі між словами.

HTML

<div>
 <p>Sentence Here</p>
</div>

CSS

div {
 width: 300px;
}

p {
 width: auto;
 text-align: center;
 word-spacing: 300px;
}

Таким чином, ваше речення завжди буде порушене та встановлено у стовпчик, але абзац з абзацом буде динамічним.

Ось приклад Codepen


-1

У моєму випадку

    word-break: break-all;

працював досконало, сподіваюся, що це допоможе будь-якому іншому новачку, як я.


-1 від мене, тому що це неправильна відповідь. Це перериває лінію на кожному символі, якщо потрібно.
Емобе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.