Яка різниця між "word-break: break-all" та "word-wrap: break-word" у CSS


397

Мені зараз цікаво, в чому різниця між ними. Коли я використовував обидва, вони, здається, ламають слово, якщо воно не вміщує контейнер. Але чому W3C зробив два способи це зробити?

Відповіді:


215

Специфікація W3, яка розповідає про них, начебто підказує, що word-break: break-allце вимагає певної поведінки з текстом CJK (китайською, японською та корейською мовами), тоді як word-wrap: break-wordє більш загальною поведінкою, не обізнаною з CJK.


28
Також зауважте, що word-wrap - це застаріла назва нової властивості "overflow-wrap" у специфікації. w3.org/TR/css3-text/#overflow-wrap
Squareman

12
Простіше кажучи: " word-breakзадає можливість м'якого обгортання між літерами ..." Специфікація W3C використовує текст CLK в якості прикладу , але це не єдина його призначена цільова робота. Загальноприйнято використовувати word-breakспільно з довгими рядками (наприклад, URL-адресами або рядками коду), коли ви хочете, щоб вони перервалися на ширину контейнера, особливо якщо контейнер є preелементом або коміркою таблиці, де word-wrapвластивість може працювати не так, як очікувалося .
gfullam

1
Оскільки специфіка використовує лише азіатські мови як приклад, а не як єдине цільове призначення властивості (як описано також gfullam), що, мабуть, є головним висновком цієї відповіді.
Shikkediel

3
word-wrap: break-word -> want break break ---- word break-break: break-all -> таблиці перерв
Fernando Silva

1
Зауважте, що посилання W3C, яке згадував @squareman, зараз w3.org/TR/css-text-3/#overflow-wrap-property
Чарлз Вуд,

409

word-wrap: break-word нещодавно змінено на overflow-wrap: break-word

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

word-break: break-all

  • незалежно від того, чи це безперервне слово, чи багато слів, розбиває їх на межі межі ширини. (тобто навіть у межах символів одного слова)

Отже, якщо у вас є багато діапазонів фіксованого розміру, які динамічно отримують вміст, ви можете просто скористатися word-wrap: break-word, оскільки таким чином розбиваються лише безперервні слова, а якщо це речення, що складається з багатьох слів, пробіли підлаштовуються для отримання непошкоджених слів (без перерви в слові).

І якщо це не має значення, займіться будь-яким.


28
Чому це не прийнято? Ця відповідь корисніша для більшості користувачів. Поведінка CJK стосується лише міжнародних веб-сайтів.
MarioDS

3
Коротка, але мила відповідь! Хоча ви можете змінити обгортання слів на переповнення?
Гаурав Агарвал

5
@MarioDS це стосується "дуже міжнародних веб-сайтів" або, як 20% країн світу їх називає, "веб-сайтів"
fregante

1
@GauravAgarwal: слід зазначити, що IE (навіть в останній версії) все ще покладається на застаріле ім'я. Дивіться caniuse.com/#search=overflow-wrap
Фелікс Віенберг

2
Символ "прийнята відповідь" пов'язаний лише з запитувачем, що стосується правильності відповіді, коли це було доречно для неї / його в той час, ось і все. Очікується, що користувачі не повернуться до своїх запитань через пару років і переглянуть нові відповіді. Підрахунок голосів за відповідь показує громаді "прийняту відповідь".
elpddev

98

З word-break, дуже довге слово починається з моменту, коли воно повинно починатися, і воно порушується стільки, скільки потрібно

[X] I am a text that 0123
4567890123456789012345678
90123456789 want to live 
inside this narrow paragr
aph.

Однак, з word-wrap, дуже довге слово НЕ буде починатися в той момент, який він повинен почати. він переходить до наступного рядка, а потім переривається стільки, скільки потрібно

[X] I am a text that 
012345678901234567890123
4567890123456789 want to
live inside this narrow 
paragraph.

2
Це все-таки так, якщо ви користуєтесь break-word. Я дратує, що word-breakрозбиває URL-адреси, але ні word-wrap. Обидва користувачі break-wordотримали це від css-tricks.com/snippets/css/…
Karthik T

44

word-wrapбуло перейменовано, overflow-wrapймовірно, щоб уникнути цієї плутанини.

Тепер це те, що ми маємо:

переливати-загортати

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

Можливі значення:

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

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

джерело .

слово-перерва

Слово розбиття CSS властивість використовується , щоб вказати , слід розривати рядки в межах слів.

  • нормально : Використовуйте правило розриву рядків за замовчуванням
  • break-all : переривання слів може бути вставлено між будь-якими символами для тексту, що не є CJK (китайською / японською / корейською).
  • Keep-all : Не дозволяйте переривання слів для тексту CJK. Поведінка тексту, що не стосується CJK, така ж, як і для звичайного.

джерело .


Тепер повернемось до вашого питання, головна відмінність переповнення переповнення та переривання слів полягає в тому, що перший визначає поведінку в ситуації переповнення , а пізніше визначає поведінку в нормальній ситуації (без переповнення). Переповнення ситуація відбувається , коли контейнер не має достатньо місця для зберігання тексту. Розривання ліній у цій ситуації не допомагає, оскільки місця немає (уявіть коробку з шириною та висотою виправлення).

Тому:

  • overflow-wrap: break-word: Про ситуацію, що переповнює, розбийте слова.
  • word-break: break-all: У звичайній ситуації просто переламайте слова в кінці рядка. Переповнення не потрібно.

4
Відмінне пояснення. Один приклад, на який я зіткнувся тільки зараз: довгі слова в комірці таблиці. overflow-wrap/ word-wrapне змусив їх загортати. Імовірно, тому, що комірки таблиці без фіксованої ширини розширюються замість переповнення. Натомість стіл розширився і зіткнувся з іншими елементами. word-breakз іншого боку зафіксував це.
Генрік Н

@HenrikN table-layout: fixed;(можливо, разом з width/ max-width) може змусити його працювати, overflow-wrap/word-wrapале це залежить від конкретного випадку використання; так само, як word-breakможе бути не тим, чого ти хочеш.
phk

42

Принаймні у Firefox (станом на v24) та Chrome (станом на v30), коли застосовується до вмісту в tableелементі:

word-wrap:break-word

насправді не призведе до загортання довгих слів, внаслідок чого таблиця перевищить межі її контейнера;

word-break:break-all

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

введіть тут опис зображення

jsfiddle демо .


5
Ви можете використовувати, table-layout:fixedщоб таблиця не розширювалася під час використанняword-wrap:break-work
veksen

@vesken Я не міг змусити це працювати (у Firefox 26). Чи можете ви надати оновлену версію моєї jsfiddle, пов'язаної вище, щоб продемонструвати, що ви маєте на увазі?
Джон Шнайдер

3
Я змусив його працювати, додавши ширину на стіл, будь-яку 100%, або перемістивши 80px ширину контейнера до таблиці. jsfiddle.net/SDGAX/37 Поведінка таблиці, однак, не однакова, використовуючиtable-layout:fixed
veksen

2
Така поведінка також відбувається при використанні word-wrapспільно з preтегами у Firefox, якщо вони не мають визначеної ширини. Використання word-breakдає бажаний результат. Я відповів на цю відповідь у коментарі, розміщеному вище, оскільки це демонструє звичайний випадок використання.
gfullam

Також елементи вбудованого відображення без ширини не впливають на "обгортання слів", але "перерив слова" все ще працює.
tfE

22

Це все, що я можу дізнатися. Не впевнений, чи допомагає це, але подумав, що додав би його до суміші.

ПЕРЕНОС СЛІВ

Це властивість визначає, чи повинен розбиватися поточний виведений рядок, якщо вміст перевищує межу зазначеного вікна візуалізації для елемента (це певним чином подібне до властивостей 'clip' та 'overflow' у намірі). Це властивість має застосовуватися лише якщо елемент має візуальну візуалізацію, це вбудований елемент з явною висотою / шириною, абсолютно розміщений та / або блоковий елемент.

СЛОВО-ВИПУСК

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


Дякую за це, коли я шукав різницю між тим word-wrap, word-breakщо може мати значення для обохbreak-word
Чад

10

Є величезна різниця. break-allв основному непридатний для візуалізації читаного тексту.

Скажімо, у вас є рядок This is a text from an old magazineу контейнері, який вміщує лише 6 символів у рядку.

word-break: break-all

This i
s a te
xt fro
m an o
ld mag
azine

Як бачите, результат жахливий. break-allспробує помістити якомога більше символів у кожен ряд, наскільки це можливо, воно навіть розділить на 2 ряди слово з двох літер типу "є"! Це смішно. Ось чому break-allвін рідко використовується.

word-wrap: break-word

This
is a
text
from
an old
magazi
ne

break-wordпорушить лише слова, які занадто довгі, щоб коли-небудь помістити контейнер (наприклад, "журнал", який становить 8 символів, а контейнер вміщує лише 6 символів). Він ніколи не порушить слова, які могли б вмістити контейнер у повному обсязі, натомість підштовхне їх до нового рядка.

<div style="width: 100px; border: solid 1px black; font-family: monospace;">
  <h1 style="word-break: break-all;">This is a text from an old magazine</h1>
  <hr>
  <h1 style="word-wrap: break-word;">This is a text from an old magazine</h1>
</div


Дуже добре пояснено. Приклад показує різницю дуже чітко. Це має бути прийнята відповідь!
naitsirch

9

word-break:break-all :

слово, щоб продовжити кордон, а потім перерватися в новому рядку.

word-wrap:break-word :

Спочатку загортання слова у новий рядок, потім продовжуйте обмежувати.

Приклад:

div {
   border: 1px solid red;
   width: 200px;
}

span {
  background-color: yellow;
}

.break-all {
  word-break:break-all;
 }
.break-word {
  word-wrap:break-word;  
}
<b>word-break:break-all</b>

<div class="break-all">
  This text is styled with
  <span>soooooooooooooooooooooooooome</span> of the text
  formatting properties.
</div>

<b> word-wrap:break-word</b>

<div class="break-word">
  This text is styled with
  <span>soooooooooooooooooooooooooome</span> of the text
  formatting properties.
</div>


8

З відповідних специфікацій W3 - які трапляються досить неясно через відсутність контексту - можна зробити наступне:

  • word-break: break-all призначений для розбиття іноземних слів, які не є CJK (скажімо, західними) у написах символів CJK (китайська, японська чи корейська).
  • word-wrap: break-word - це для розбиття слів змішаною (скажемо виключно західною) мовою.

Принаймні, це були наміри W3. Що насправді сталося, це був великий перелом із несумісністю веб-переглядача. Ось чудовий опис різних проблем .

Наведений нижче фрагмент коду може слугувати підсумком того, як домогтися загортання слів за допомогою CSS у перехресному середовищі браузера:

-ms-word-break: break-all;
 word-break: break-all;

 /* Non standard for webkit */
 word-break: break-word;

-webkit-hyphens: auto;
   -moz-hyphens: auto;
    -ms-hyphens: auto;
        hyphens: auto;

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