Jaka jest różnica między „dzieleniem słów: dzielenie wszystkich” a „zawijaniem słów: dzielenie słów” w CSS

397

Obecnie zastanawiam się, jaka jest różnica między nimi. Kiedy użyłem obu, wydaje się, że łamią słowo, jeśli nie pasuje do pojemnika. Ale dlaczego W3C zrobiło to na dwa sposoby?

Drzemka
źródło

Odpowiedzi:

215

Mówiąc o nich, specyfikacja W3 wydaje się sugerować, że word-break: break-allwymaga określonego zachowania w tekście CJK (chińskim, japońskim i koreańskim), podczas gdy word-wrap: break-wordjest to bardziej ogólne, nieświadome CJK zachowanie.

AakashM
źródło
28
Zwróć także uwagę, że zawijanie wyrazów jest starszą nazwą nowszej właściwości „overflow-wrap” w specyfikacji. w3.org/TR/css3-text/#overflow-wrap
squareman
12
Mówiąc wprost: „ word-breakokreśla możliwości miękkiego zawijania między literami…” Specyfikacja W3C wykorzystuje tekst CLK jako przykład , ale nie jest to jego jedyne zamierzone zastosowanie. Powszechnie używa się go word-breakw połączeniu z długimi ciągami (takimi jak adresy URL lub wiersze kodu), gdy chcesz, aby łamały się na szerokości kontenera - szczególnie jeśli kontener jest preelementem lub komórką tabeli, w której word-wrapwłaściwość może nie działać zgodnie z oczekiwaniami .
gfullam
1
Ponieważ specyfikacja używa tylko języków azjatyckich jako przykładu, a nie jako jedynego zamierzonego celu własności (opisanego również przez gfullam), co wydaje się jednak głównym wnioskiem tej odpowiedzi.
Shikkediel
3
word-wrap: break-word -> przyzwyczajenie tabela przerwa ---- słowo-break break-all -> breaks stoły
Fernando Silva
1
Zauważ, że link W3C, o którym wspomniał @squareman, jest teraz w3.org/TR/css-text-3/#overflow-wrap-property
Charles Wood
409

word-wrap: break-word ostatnio zmieniono na overflow-wrap: break-word

  • zawinie długie słowa w następnym wierszu.
  • dostosowuje różne słowa, aby nie łamały się w środku.

word-break: break-all

  • niezależnie od tego, czy jest to ciągłe słowo, czy wiele słów, dzieli je na granicy limitu szerokości. (tzn. nawet w obrębie znaków tego samego słowa)

Więc jeśli masz wiele rozpiętości o stałej wielkości, które dynamicznie uzyskują treść, możesz po prostu wolić używać word-wrap: break-word, ponieważ w ten sposób dzielone są tylko ciągłe słowa, a w przypadku zdania zawierającego wiele słów, spacje są dostosowywane, aby uzyskać nienaruszone słowa (bez przerwy w słowie).

A jeśli to nie ma znaczenia, wybierz jedno z nich.

Bhumi Singhal
źródło
28
Dlaczego nie jest to akceptowane? Ta odpowiedź jest bardziej pomocna dla większości użytkowników. Zachowanie CJK dotyczy tylko bardzo międzynarodowych stron internetowych.
MarioDS
3
Krótka, ale słodka odpowiedź! Chociaż może chcesz zmienić zawijanie słów na zawijanie przepełnienia?
Gaurav Agarwal
5
@MarioDS ma to zastosowanie do „bardzo międzynarodowych stron internetowych” lub, jak nazywa je 20% świata, „stron internetowych”
fregante
1
@GauravAgarwal: należy zauważyć, że IE (nawet w najnowszej wersji) nadal opiera się na starszej nazwie. Zobacz caniuse.com/#search=overflow-wrap
Felix Wienberg,
2
Symbol „zaakceptowana odpowiedź” odnosi się tylko do pytającego, istotny dla poprawności odpowiedzi, gdy była ona odpowiednia dla niej w tym czasie, to wszystko. Użytkownicy nie powinni wracać do swoich pytań po kilku latach i sprawdzać nowe odpowiedzi. Głosy liczone na odpowiedź pokazują, że społeczność „zaakceptowała odpowiedź”.
elpddev,
98

Z word-breakbardzo długim słowem zaczyna się w miejscu, w którym powinno się zacząć i jest łamane tak długo, jak to konieczne

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

Jednak z word-wrapbardzo długim słowem NIE Zaczyna się w miejscu, w którym powinno się zacząć. zawija się do następnej linii, a następnie jest łamany tak długo, jak to konieczne

[X] I am a text that 
012345678901234567890123
4567890123456789 want to
live inside this narrow 
paragraph.
shuky
źródło
2
Czy nadal tak jest, jeśli używasz break-word. Irytujące okazało się, że word-breakłamie adresy URL, ale nie word-wrap. Oba za pomocą break-wordotrzymały go z css-tricks.com/snippets/css/…
Karthik T
44

word-wrapzostał przemianowany, aby overflow-wrapprawdopodobnie uniknąć tego zamieszania.

Teraz mamy to:

przepełnienie

Właściwość overflow-wrap służy do określania, czy przeglądarka może przerywać wiersze w słowach, aby zapobiec przepełnieniu, gdy łańcuch, który w przeciwnym razie nie byłby łamliwy, jest zbyt długi, aby zmieścić się w jego polu zawierającym.

Możliwa wartość:

  • normal : wskazuje, że linie mogą się łamać tylko w normalnych punktach podziału słów.

  • słowo przerywane : Wskazuje, że zwykle niełamliwe słowa mogą być łamane w dowolnych punktach, jeśli w linii nie ma innych akceptowalnych punktów przerwania.

źródło .

podział słów

Właściwość CSS z podziałem słów służy do określania, czy należy przerywać wiersze w słowach.

  • normal : użyj domyślnej reguły podziału linii.
  • break-all : Podziały wyrazów mogą być wstawiane między dowolne znaki w tekście innym niż CJK (chiński / japoński / koreański).
  • keep-all : Nie zezwalaj na podziały słów w tekście CJK. Zachowanie tekstu innego niż CJK jest takie samo, jak w przypadku normalnego.

źródło .


Wracając do pytania, główna różnica między zawijaniem przepełnienia a dzieleniem słów polega na tym, że pierwsze określa zachowanie w sytuacji przepełnienia , a drugie określa zachowanie w sytuacji normalnej (bez przepełnienia). Przelewowy sytuacja zdarza się, gdy pojemnik nie ma wystarczającej ilości miejsca do przechowywania tekstu. Przełamywanie linii w tej sytuacji nie pomaga, ponieważ nie ma miejsca (wyobraź sobie pudełko o stałej szerokości i wysokości).

Więc:

  • overflow-wrap: break-word: W przypadku przepełnienia podziel słowa.
  • word-break: break-all: W normalnej sytuacji wystarczy rozbić słowa na końcu wiersza. Przepełnienie nie jest konieczne.
André Pena
źródło
4
Doskonałe wyjaśnienie. Jeden przykład, na który natknąłem się teraz: długie słowa w komórce tabeli. overflow-wrap/ word-wrapnie zmusił ich do zawinięcia. Prawdopodobnie dlatego, że komórki tabeli bez stałej szerokości rozszerzają się zamiast przepełniać. Zamiast tego stół stał się szeroki i zderzył się z innymi elementami. word-breakz drugiej strony to naprawiłem.
Henrik N
@HenrikN table-layout: fixed;(prawdopodobnie razem z width/ max-width) może sprawić, że będzie działać, overflow-wrap/word-wrapale zależy to od konkretnego przypadku użycia; tak jak word-breakmoże nie być tym, czego chcesz.
phk
42

Przynajmniej w Firefoksie (od wersji 24) i Chrome (od wersji 30), w przypadku zastosowania do zawartości w tableelemencie:

word-wrap:break-word

nie spowoduje zawijania długich słów, co może spowodować, że tabela przekroczy granice kontenera;

word-break:break-all

spowoduje zawijanie słów i dopasowanie stolika do jego pojemnika.

wprowadź opis zdjęcia tutaj

demo jsfiddle .

Jon Schneider
źródło
5
Możesz użyć tej opcji, table-layout:fixedaby tabela nie rozwijała się podczas używaniaword-wrap:break-work
veksen
@vesken Nie udało mi się tego uruchomić (w przeglądarce Firefox 26). Czy możesz podać zaktualizowaną wersję mojego pliku jsfiddle, do którego odsyłam, aby pokazać, co masz na myśli?
Jon Schneider
3
Sprawiłem, że zadziałało, dodając szerokość na stole, albo 100%, albo przenosząc do stołu szerokość 80 pikseli. jsfiddle.net/SDGAX/37 Zachowanie tabeli nie jest jednak takie samo przy użyciutable-layout:fixed
veksen
2
To zachowanie występuje również w przypadku używania word-wrapw połączeniu ze preznacznikami w przeglądarce Firefox, chyba że mają one zdefiniowaną stałą szerokość. Używanie word-breakdaje pożądany rezultat. Odniosłem się do tej odpowiedzi w komentarzu zamieszczonym powyżej, ponieważ pokazuje ona częsty przypadek użycia.
gfullam
Również elementy wstawiane do wyświetlacza bez szerokości nie podlegają wpływowi „zawijania słów”, ale „łamanie słów” nadal działa.
tef
22

To wszystko, co mogę się dowiedzieć. Nie jestem pewien, czy to pomaga, ale pomyślałem, że dodam to do miksu.

ZAWIJANIE TEKSTU

Ta właściwość określa, czy bieżąca renderowana linia powinna się zepsuć, jeśli zawartość przekroczy granicę określonego pola renderowania dla elementu (jest to pod pewnymi względami podobne do właściwości „klip” i „przepełnienie”). Ta właściwość powinna mieć zastosowanie tylko jeśli element ma wizualny rendering, jest elementem wbudowanym o wyraźnej wysokości / szerokości, jest pozycjonowany absolutnie i / lub jest elementem blokowym.

PRZERWA W SŁOWIE

Ta właściwość kontroluje zachowanie łamania wierszy w słowach. Jest to szczególnie przydatne w przypadkach, gdy w jednym elemencie używanych jest wiele języków.

Jonny Haynes
źródło
Dziękuję za to, ponieważ szukałem różnicy word-wrapi word-breakktóre mogą mieć zarówno wartośćbreak-word
Chad
10

Jest ogromna różnica. break-alljest zasadniczo bezużyteczny do renderowania czytelnego tekstu.

Powiedzmy, że masz ciąg This is a text from an old magazinew pojemniku, który mieści tylko 6 znaków w rzędzie.

word-break: break-all

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

Jak widać wynik jest okropny. break-allspróbuje dopasować jak najwięcej znaków do każdego wiersza, a nawet podzieli 2-literowe słowo w rodzaju „jest” na 2 wiersze! To jest niedorzeczne. Dlatego break-allrzadko jest używany.

word-wrap: break-word

This
is a
text
from
an old
magazi
ne

break-wordrozbija tylko słowa, które są zbyt długie, by zmieścić się w pojemniku (np. „magazynek”, który ma 8 znaków, a pojemnik mieści tylko 6 znaków). Nigdy nie rozbije słów, które mogłyby zmieścić cały pojemnik, zamiast tego popchnie je do nowej linii.

<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

Drkawashima
źródło
Bardzo dobrze wyjaśnione. Przykład pokazuje różnicę bardzo wyraźnie. To powinna być zaakceptowana odpowiedź!
naitsirch
9

word-break:break-all :

słowo, aby kontynuować obramowanie, a następnie włóż nowy wiersz.

word-wrap:break-word :

Najpierw zawijaj słowa w nowej linii, a następnie kontynuuj obramowanie.

Przykład:

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>

Ehsan
źródło
8

Z odpowiednich specyfikacji W3 - które są dość niejasne z powodu braku kontekstu - można wywnioskować:

  • word-break: break-all służy do dzielenia obcych, spoza CJK (powiedzmy zachodnich) słów w pismach znaków CJK (chińskich, japońskich lub koreańskich).
  • word-wrap: break-word służy do dzielenia słów w nie mieszanym (powiedzmy wyłącznie zachodnim) języku.

Takie były przynajmniej intencje W3. To, co się faktycznie wydarzyło, było dużym problemem z niezgodnościami przeglądarki. Oto doskonały opis różnych problemów .

Poniższy fragment kodu może służyć jako podsumowanie sposobu zawijania słów za pomocą CSS w środowisku przeglądarki internetowej:

-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;
Serge Stroobandt
źródło
2

Oprócz poprzednich komentarzy obsługa przeglądarki word-wrapwydaje się być nieco lepsza niż dla word-break.

użytkownik2619604
źródło