Qual è la differenza tra "word-break: break-all" e "word-wrap: break-word" nei CSS


397

Attualmente mi chiedo quale sia la differenza tra i due. Quando li ho usati entrambi sembrano rompere la parola se non si adatta al contenitore. Ma perché il W3C ha fatto due modi per farlo?

Risposte:


215

La specifica W3 che ne parla sembra suggerire che word-break: break-allè per richiedere un comportamento particolare con il testo CJK (cinese, giapponese e coreano), mentre word-wrap: break-wordè il comportamento più generale, non consapevole di CJK.


28
Si noti inoltre che word-wrap è un nome legacy per la nuova proprietà "overflow-wrap" nella specifica. w3.org/TR/css3-text/#overflow-wrap
Squareman

12
In poche parole: " word-breakspecifica le opportunità di avvolgimento soft tra le lettere ..." Le specifiche del W3C usano il testo CLK come esempio , ma non è il solo uso previsto. È comune utilizzare word-breakin combinazione con stringhe lunghe (come URL o righe di codice) quando si desidera che si spezzino alla larghezza del contenitore, soprattutto se il contenitore è un preelemento o una cella di tabella in cui la word-wrapproprietà potrebbe non funzionare come previsto .
gfullam,

1
Perché la specifica usa solo le lingue asiatiche come esempio, non come l'unico scopo previsto della proprietà (come descritto anche da Gfullam) che sembra comunque essere la conclusione principale di questa risposta.
Shikkediel,

3
word-wrap: break-word -> non romperà la tabella ---- word-break: break-all -> rompe le tabelle
Fernando Silva

1
Si noti che il link W3C menzionato da @squareman è ora w3.org/TR/css-text-3/#overflow-wrap-property
Charles Wood,

409

word-wrap: break-word recentemente cambiato in overflow-wrap: break-word

  • avvolgerà le parole lunghe sulla riga successiva.
  • regola diverse parole in modo che non si spezzino nel mezzo.

word-break: break-all

  • indipendentemente dal fatto che si tratti di una parola continua o di molte parole, le scompone al limite del limite di larghezza. (cioè anche all'interno dei caratteri della stessa parola)

Quindi, se hai molte span di dimensioni fisse che ottengono contenuti in modo dinamico, potresti semplicemente preferire l'uso word-wrap: break-word, poiché in questo modo vengono interrotte solo le parole continue e nel caso in cui sia una frase che comprende molte parole, gli spazi vengono regolati per ottenere parole intatte (nessuna interruzione all'interno di una parola).

E se non importa, scegli uno dei due.


28
Perché questo non è accettato? Questa risposta è più utile per la maggior parte degli utenti. Il comportamento di CJK si applica solo a siti Web molto internazionali.
MarioDS,

3
Risposta breve ma dolce! Anche se potresti voler cambiare la parola a capo in troppo pieno?
Gaurav Agarwal,

5
@MarioDS si applica a "siti Web molto internazionali" o, come il 20% del mondo li chiama, "siti Web"
fregante

1
@GauravAgarwal: va notato che IE (anche nell'ultima versione) si basa ancora sul nome legacy. Vedi caniuse.com/#search=overflow-wrap
Felix Wienberg il

2
Il simbolo "risposta accettata" è correlato solo per il richiedente, rilevante per la correttezza della risposta quando era rilevante per lei / lui in quel momento, tutto qui. Non ci si aspetta che gli utenti tornino alle loro domande dopo un paio d'anni e riesaminino nuove risposte. I voti contano sulla risposta mostrano la comunità "risposta accettata".
elpddev,

98

Con word-break, una parola molto lunga inizia nel punto in cui dovrebbe iniziare e viene spezzata per tutto il tempo necessario

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

Tuttavia, con word-wrap, una parola molto lunga NON inizierà nel punto in cui dovrebbe iniziare. si avvolge alla riga successiva e poi viene spezzato per tutto il tempo necessario

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

2
È ancora così se lo usi break-word. Ho fastidiosamente scoperto che word-breakrompe gli URL ma non word-wrap. Entrambi lo hanno break-wordpreso da css-tricks.com/snippets/css/…
Karthik T

44

word-wrapè stato rinominato overflow-wrapprobabilmente per evitare questa confusione.

Questo è ciò che abbiamo:

trabocco-wrap

La proprietà overflow-wrap viene utilizzata per specificare se il browser può interrompere le righe all'interno delle parole al fine di impedire l'overflow quando una stringa altrimenti infrangibile è troppo lunga per rientrare nella sua casella di contenimento.

Valori possibili:

  • normale : indica che le linee possono interrompersi solo nei normali punti di interruzione di parole.

  • break-word : indica che parole normalmente infrangibili possono essere spezzate in punti arbitrari se non ci sono punti di interruzione altrimenti accettabili nella linea.

fonte .

word-break

La proprietà CSS di interruzione parola viene utilizzata per specificare se interrompere le linee all'interno delle parole.

  • normale : utilizza la regola di interruzione di riga predefinita.
  • break-all : le interruzioni di parole possono essere inserite tra qualsiasi carattere per il testo non CJK (cinese / giapponese / coreano).
  • keep-all : non consentire interruzioni di parole per il testo CJK. Il comportamento del testo non CJK è lo stesso del normale.

fonte .


Ora tornando alla tua domanda, la differenza principale tra overflow-wrap e word-break è che la prima determina il comportamento in una situazione di overflow , mentre la successiva determina il comportamento in una situazione normale (nessun overflow). Una situazione di overflow si verifica quando il contenitore non ha spazio sufficiente per contenere il testo. Rompere le linee su questa situazione non aiuta perché non c'è spazio (immagina una scatola con larghezza e altezza fisse).

Così:

  • overflow-wrap: break-word: In caso di tracimazione, rompere le parole.
  • word-break: break-all: In una situazione normale, basta rompere le parole alla fine della riga. Non è necessario un overflow.

4
Spiegazione eccellente. Un esempio in cui mi sono imbattuto proprio ora: parole lunghe in una cella di tabella. overflow-wrap/ word-wrapnon li ha fatti avvolgere. Presumibilmente perché le celle della tabella senza larghezza fissa si espandono anziché overflow. Invece, il tavolo si è allargato e si è scontrato con altri elementi. word-breakd'altra parte riparato.
Henrik N,

@HenrikN table-layout: fixed;(possibilmente insieme awidth / max-width) può farlo funzionare overflow-wrap/word-wrapma dipende dal caso d'uso specifico; proprio come word-breakpotrebbe non essere quello che vuoi.
phk,

42

Almeno in Firefox (a partire dalla v24) e Chrome (a partire dalla v30), quando applicato al contenuto in un tableelemento:

word-wrap:break-word

in realtà non causerà il riavvolgimento di parole lunghe, il che può portare la tabella a superare i limiti del suo contenitore;

word-break:break-all

comporterà il wrapping delle parole e il montaggio della tabella all'interno del suo contenitore.

inserisci qui la descrizione dell'immagine

demo di jsfiddle .


5
Puoi usare table-layout:fixedper fare in modo che la tabella non si espanda quando usiword-wrap:break-work
veksen

@vesken Non sono riuscito a farlo funzionare (in Firefox 26). Potresti fornire una versione aggiornata del mio jsfiddle linkato sopra per dimostrare cosa intendi?
Jon Schneider,

3
L'ho fatto funzionare aggiungendo una larghezza sul tavolo, al 100%, o spostando la larghezza di 80 px del contenitore sul tavolo. jsfiddle.net/SDGAX/37 Il comportamento della tabella non è tuttavia lo stesso usandotable-layout:fixed
veksen

2
Questo comportamento si verifica anche quando si utilizza word-wrapinsieme ai pretag in Firefox a meno che non abbiano una larghezza fissa definita. L'utilizzo word-breakproduce il risultato desiderato. Ho collegato a questa risposta in un commento pubblicato sopra perché dimostra un caso d'uso comune.
Gfullam,

Anche gli elementi inline display senza larghezza non sono influenzati da "word-wrap", ma "word-break" funziona ancora.
fino al

22

Questo è tutto ciò che posso scoprire. Non sono sicuro che possa aiutare, ma ho pensato di aggiungerlo al mix.

Word-wrap

Questa proprietà specifica se la riga di rendering corrente deve interrompersi se il contenuto supera il limite della casella di rendering specificata per un elemento (questo è in qualche modo simile alle proprietà 'clip' e 'overflow' nell'intento.) Questa proprietà deve essere applicata solo se l'elemento ha un rendering visivo, è un elemento inline con altezza / larghezza esplicite, è assolutamente posizionato e / o è un elemento a blocchi.

WORD-PAUSA

Questa proprietà controlla il comportamento di interruzione di riga all'interno delle parole. È particolarmente utile nei casi in cui vengono utilizzate più lingue all'interno di un elemento.


Grazie per questo perché stavo cercando la differenza tra word-wrape word-breakche possono avere entrambi il valorebreak-word
Ciad

10

C'è un'enorme differenza. break-allè sostanzialmente inutilizzabile per il rendering di testo leggibile.

Supponiamo che tu abbia la stringa This is a text from an old magazinein un contenitore che può contenere solo 6 caratteri per riga.

word-break: break-all

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

Come puoi vedere, il risultato è terribile. break-allproverà ad adattare il maggior numero possibile di caratteri in ogni riga, dividerà persino una parola di 2 lettere come "è" su 2 righe! È ridicolo. Questo è il motivo per cui break-allraramente viene mai usato.

word-wrap: break-word

This
is a
text
from
an old
magazi
ne

break-wordromperà solo le parole troppo lunghe per adattarsi al contenitore (come "rivista", che è di 8 caratteri, e il contenitore può contenere solo 6 caratteri). Non romperà mai le parole che potrebbero adattarsi al contenitore nella sua interezza, invece le spingerà verso una nuova linea.

<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


Molto ben spiegato. L'esempio mostra la differenza molto chiara. Questa dovrebbe essere la risposta accettata!
naitsirch,

9

word-break:break-all :

parola per continuare a confinare e poi rompere in newline.

word-wrap:break-word :

Inizialmente, la parola a capo in newline quindi continua a confinare.

Esempio :

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

Dalle rispettive specifiche del W3 - che sembrano essere poco chiare a causa della mancanza di contesto - si può dedurre quanto segue:

  • word-break: break-all è per spezzare parole straniere, non CJK (diciamo occidentali) negli scritti di personaggi CJK (cinese, giapponese o coreano).
  • word-wrap: break-word è per rompere le parole in una lingua non mista (diciamo solo occidentale).

Almeno, queste erano le intenzioni di W3. Ciò che è effettivamente accaduto è stato un grosso problema con incompatibilità del browser di conseguenza. Ecco un eccellente resoconto dei vari problemi coinvolti .

Il seguente frammento di codice può servire da riepilogo di come ottenere il ritorno a capo automatico utilizzando i CSS in un ambiente cross-browser:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.