Come forzare un'interruzione di riga in una parola lunga in un DIV?


417

Ok, questo mi sta davvero confondendo. Ho un contenuto all'interno di un div in questo modo:

<div style="background-color: green; width: 200px; height: 300px;">

Thisisatest.Thisisatest.Thisisatest.Thisisatest.Thisisatest.Thisisatest.

</div>

Tuttavia, il contenuto trabocca il DIV (come previsto) perché la "parola" è troppo lunga.

Come posso forzare il browser a "spezzare" la parola dove necessario per adattare tutto il contenuto all'interno?


Date un'occhiata a questa domanda: stackoverflow.com/questions/2046530/...
nickf

Risposte:


610

Uso word-wrap:break-word;

Funziona anche in IE6, che è una piacevole sorpresa.


word-wrap: break-wordè stato sostituito con il overflow-wrap: break-word;quale funziona in ogni browser moderno. IE, essendo un browser morto, farà invece affidamento per sempre su quelli obsoleti e non standard word-wrap.

Gli usi word-wrapattuali di oggi funzionano ancora in quanto è un alias per overflow-wraple specifiche.


75
In realtà, la parola a capo è un'invenzione di IE. Quindi nessuna sorpresa che funzioni in IE :)
Savas Vedova,

1
Affinché funzioni in una tabella, potrebbe essere necessario applicare table-layout: fixed;la tabella
Serj Sagan,

28
word-wrap: break-wordnon ha funzionato per me ma word-break: break-wordcome suggerito da @rahul di seguito ha funzionato.
Yves,

1
Nota: questo funzionerà solo se lo dai nel div parent in IE (non nell'intervallo interno all'interno del div).
sms

125

Non sono sicuro della compatibilità del browser

word-break: break-all;

Inoltre puoi usare il <wbr>tag

<wbr>(interruzione di parola) significa: "Se lo desideri, il browser può inserire un'interruzione di riga qui". Se il browser non ritiene necessaria un'interruzione di linea, non accade nulla.


23
Siate consapevoli di quella rottura di parole: break-all; spezzerà le parole nel mezzo se può ancora adattarsi a qualsiasi carattere su una linea con altre parole prima, il che potrebbe non essere il risultato desiderato, mentre il ritorno a capo automatico: break-word; sposta le parole su una nuova riga e rompe la parola solo se è troppo lungo per adattarsi alla propria linea nel contenitore. Esempio: jsfiddle.net/4AKhn/1
alexteg

break-all rompe tutto. Va bene usare con una classe specifica che ha solo un lungo URL ecc., Ma non con BODY o P
Upendra,

Questo è sicuramente perfettamente (e desiderato) accettabile quando si sta tentando di visualizzare qualcosa come un URI di richiesta in una cella della tabella di registro e è necessario che smetta di rompere l'intera tabella con una cella lunga gigante. È necessaria la rottura nel mezzo di una "parola";) Mentre la risposta accettata non si accovaccia in questo senso.
IncredibleHat

@ Skelly1983 non esiste IE12
TylerH,

@TylerH Ne sono consapevole, grazie per avermelo segnalato dopo 3 anni. Questo è elencato nella tabella di supporto del browser w3schools per il tag wbr, che elenca il supporto come "Internet Explorer / Edge" e ha il numero di versione elencato come 12.0, che in realtà è la prima versione di Edge.
Skelly1983,

98

Questo potrebbe essere aggiunto alla risposta accettata per una soluzione "cross-browser".

fonti:

.your_element{
    -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;
}

L'ho preso su Chrome / Opera e Safari, ma ancora non lo avevo su Firefox e IE. Con questo ho risolto Firefox, ma IE sta ancora andando oltre il contenitore (ho un lungo nome file di soli caratteri alfanumerici).
Kamafeather,

1
Ciao Kamafeather, non ne sono sicuro, ma se stai cercando un nome molto lungo, stai cercando di rompere l'intero contesto (browser, codice html-css) per aiutarti ancora di più. Forse, potresti creare un'altra domanda con la tua situazione.
Milche Patern,

Si noti che questo rompe le parole in luoghi non schematici.

@ user1322720 che cos'è un luogo "non grammaticale"?
TylerH,

31

Stavo solo cercando su Google lo stesso problema e ho pubblicato la mia soluzione finale QUI . È rilevante anche per questa domanda.

Puoi farlo facilmente con un div dandogli lo stile word-wrap: break-word(e potresti aver bisogno di impostarne anche la larghezza).

div {
    word-wrap: break-word;         /* All browsers since IE 5.5+ */
    overflow-wrap: break-word;     /* Renamed property in CSS3 draft spec */
    width: 100%;
}

Tuttavia, per le tabelle , è inoltre necessario applicare: table-layout: fixed. Ciò significa che le larghezze delle colonne non sono più fluide, ma sono definite in base alle larghezze delle colonne solo nella prima riga (o tramite larghezze specificate). Leggi di più qui .

Codice di esempio:

table {
    table-layout: fixed;
    width: 100%;
}

table td {
    word-wrap: break-word;         /* All browsers since IE 5.5+ */
    overflow-wrap: break-word;     /* Renamed property in CSS3 draft spec */
}

1
Grazie per la soluzione delle tabelle;) Tuttavia, non capisco bene perché il break-word non possa essere utilizzato con il layout automatico. Qualche suggerimento?
ondObno,

@ondObno Sì, non sono sicuro del motivo tecnico, ma diversi browser sembrano comportarsi in questo modo. Forse è perché le parole super lunghe pasticciano con tutti i calcoli necessari per determinare la larghezza di ogni colonna.
Simon East,

L'impostazione width: 100%;era l'unico modo per farlo funzionare su FF e Chrome!
Putzi San

27

&#8203;è l'entità HTML per un carattere unicode chiamato spazio a larghezza zero (ZWSP) che è un carattere invisibile che specifica un'opportunità di interruzione di riga. Allo stesso modo lo scopo del trattino è quello di specificare un'opportunità di interruzione di riga all'interno di un limite di parole.


1
Consiglio molto bello! Solo per integrare: &#8203;ha una priorità inferiore rispetto a uno spazio bianco (cioè se ce n'è uno vicino, la linea si spezzerà in uno spazio bianco).
CPHPython,

Sembra essere l' <wbr/>equivalente unicode che stavo cercando
Xenos

20

È emerso che l'utilizzo di quanto segue ha funzionato sulla maggior parte dei principali browser (Chrome, IE, Safari iOS / OSX) ad eccezione di Firefox (v50.0.2) quando si utilizza flexbox e si fa affidamento width: auto.

.your_element {
    word-wrap: break-word;   
    overflow-wrap: break-word;
    word-break: break-word;
}

Nota: potrebbe non essere necessario aggiungere i prefissi del fornitore del browser se non si utilizza un prefissatore automatico.

Un'altra cosa a cui prestare attenzione è che il testo utilizzato &nbsp;per la spaziatura può causare interruzioni di riga a metà parola.


5
Questo è esattamente ciò di cui avevo bisogno. Le altre soluzioni non hanno funzionato con larghezza: 100%. Una cosa da notare: word-break: break-word; dovrebbe essere word-break: break-all;
jscul,

7

CSS word-wrap:break-word; , testato in FireFox 3.6.3



5

Rimuovi white-space: nowrap, se presente.

Strumento:

white-space: inherit;
word-break: break-word;

3

Lo spazio bianco è conservato dal browser. Il testo andrà a capo quando necessario e le interruzioni di riga

.pre-wrap {
    white-space: pre-wrap;
    word-break: break-word;
}

DEMO

td {
   word-break: break-word;
   white-space: pre-wrap;
   -moz-white-space: pre-wrap;      
}

table {
    width: 100px;
    border: 1px solid black;
    display: block;
}
<table>
<tr><th>list</th>
<td>
1.longtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtext
2.breaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreakline
</td>
</tr>
</table>


2

Da MDN :

La overflow-wrapproprietà CSS specifica se il browser deve inserire o meno le interruzioni di riga all'interno delle parole per evitare che il testo trabocchi nella sua casella di contenuto.

Al contrario word-break, overflow-wrapcreerà un'interruzione solo se un'intera parola non può essere posizionata sulla propria riga senza traboccare.

Quindi puoi usare:

overflow-wrap: break-word;

Posso usare ?


2

Per prima cosa dovresti identificare la larghezza del tuo elemento. Per esempio:

#sampleDiv{
  width: 80%;
  word-wrap:break-word;
}
<div id="sampleDiv">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

in modo che quando il testo raggiunge la larghezza dell'elemento, sarà suddiviso in righe.


2

Come indicato nella risposta di @ davidcondrey, non c'è solo la ZWSP, ma anche la SHY &#173; &shy;che può essere usato in tempo molto lungo, le parole costruite (si pensi tedesco o olandese) che devono essere rotto sul posto che si desidera che sia. Invisibile, ma dà un trattino nel momento in cui è necessario, mantenendo così sia la parola connessa che la linea piena al massimo.

In questo modo si potrebbe notare la parola luchthavenpolitieagent in quanto lucht&shy;haven&shy;politie&shy;agentindica parti più lunghe delle sillabe della parola.
Anche se non ho mai letto nulla di ufficiale, questi trattini morbidi riescono a ottenere una priorità maggiore nei browser rispetto ai trattini ufficiali nelle singole parole del costrutto ( se hanno qualche estensione per esso).
In pratica, nessun browser è in grado di spezzare una parola così lunga e costruita da sola; su schermi più piccoli con conseguente nuova linea per esso, o in alcuni casi anche una linea di una parola (come quando seguono due di quelle parole costruite).

Cordiali saluti: è olandese per agente di polizia aeroportuale


0

word-break: normale sembra meglio usare di word-break: break-word perché break-word rompe l'iniziale come EN

word-break: normal

-3

Fai questo:

<div id="sampleDiv">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

#sampleDiv{
   overflow-wrap: break-word;
}

-4

prova questo nel nostro stile

white-space: normal;

1
Nella maggior parte dei casi, la duplicazione delle risposte tra più domande è disapprovata . In questo caso, sembra essere una risposta errata a entrambe le domande. normalè il white-spacevalore predefinito . Penso che aggiungerlo non avrebbe alcun effetto sull'esempio nella domanda. Per favore, correggimi se sbaglio.
Jeremy Banks,

Dipende dall'override effettuato dal CSS. Nel mio caso, ho dovuto dichiararlo nuovamente su "stile" nel mio componente JSF per sovrascrivere lo stile CSS predefinito che non era "spazio bianco: normale;"
Benjamin Fuentes,
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.