A capo automatico in una tabella HTML


566

Ho usato word-wrap: break-wordper avvolgere il testo in divs e spans. Tuttavia, non sembra funzionare nelle celle della tabella. Ho una tabella impostata su width:100%, con una riga e due colonne. Il testo in colonne, sebbene in stile con quanto sopra word-wrap, non va a capo. Fa sì che il testo passi oltre i limiti della cella. Questo succede su Firefox, Google Chrome e Internet Explorer.

Ecco come appare la fonte:

td {
  border: 1px solid;
}
<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-wrap: break-word;">
        Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
      </div>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>

La lunga parola sopra è più grande dei limiti della mia pagina, ma non si rompe con l'HTML sopra. Ho provato i suggerimenti seguenti per aggiungere text-wrap:suppresse text-wrap:normal, ma nessuno dei due ha aiutato.


aggiungi trattino. <tr> <td style = "text-wrap: normal; word-wrap: break-word"> Questa è una pre-sentation. </td> </tr>
adatapost l'

Sfortunatamente, il testo lì dentro proviene da contenuti generati dagli utenti. Certo, potrei pre-elaborarlo e aggiungere il trattino, ma speravo che ci sarebbe stato un modo migliore.
psychotik,

Chiedo scusa per aver usato la parola "trattino duro". In HTML, il trattino semplice è rappresentato dal carattere "-" (& # 45; o & # x2D;). Il trattino morbido è rappresentato dal riferimento all'entità personaggio & timido; (& # 173; o & # xAD;)
adatapost l'

Stai davvero usando <code>break-wor<em>k</em> </code>? Forse potrebbe avere qualcosa a che fare con questo.
Ms2ger,

1
Se sei qui, potresti anche dare un'occhiata a white-space: pre-wrap developer.mozilla.org/en-US/docs/Web/CSS/white-space
Tom Prats

Risposte:


624

Quanto segue funziona per me in Internet Explorer. Nota l'aggiunta dell'attributo table-layout:fixedCSS

td {
  border: 1px solid;
}
<table style="table-layout: fixed; width: 100%">
  <tr>
    <td style="word-wrap: break-word">
      LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongWord
    </td>
  </tr>
</table>


@ewomac sì, a volte devo solo ignorare gli errori VS2010 su HTML / CSS se so che funzionerà nel browser.
Marc Stober,

2
@ Marc !! amico, grazie mille per questo. Mi è stato affidato il compito di creare una versione mobile di un sito client che utilizza tabelle e ho avuto problemi a farlo funzionare! tabella-layout: risolto il problema!
debug

17
Questo rende le altre colonne troppo larghe.
Clément,

2
Assicurati di leggere developer.mozilla.org/en-US/docs/Web/CSS/table-layout Le larghezze di tabella e colonna sono impostate in base alla larghezza degli elementi table e col o alla larghezza della prima riga di celle. Le celle nelle righe successive non influiscono sulla larghezza delle colonne. Sembra che questo sia buono anche per le prestazioni.
Sam Barnum,

2
@ Clément vedi la risposta di Indrek qui sotto <colgroup>, mi ha risolto questo problema.
Andrewtweber,

164
<td style="word-break:break-all;">longtextwithoutspace</td>

o

<span style="word-break:break-all;">longtextwithoutspace</span>

Può confermare che l'approccio di Pratik funziona anche su Safari su iOS (iPhone).
occulus

Per aggirare il problema con alcune parole brevi e lunghe, è possibile preelaborare il testo e racchiudere solo le parole lunghe (diciamo,> 40 caratteri) in <span>.
nornagon,

9
questo non è supportato da Firefox, Opera
Meotimdihia,

5
questo non si interrompe preferibilmente su caratteri non di parole (come se avessi una serie di parole più brevi separate da spazi, farebbe sempre scorrere le parole fino alla riga, quindi spezzerebbe l'ultima parola a metà). Word-wrapromperà le parole solo quando necessario
Hashbrown

Questo approccio è migliore perché non richiede table-layout: fixed;.
Finesse

125

Un colpo lungo, ma ricontrolla con Firebug (o simile) che non stai ereditando accidentalmente la seguente regola:

white-space:nowrap;

Ciò può ignorare il comportamento di interruzione di riga specificato.


Questo è ciò che è stato ereditato e ha rotto la parola avvolgendo per me
shane lee

@RickGrundy In cosa lo cambi se hai questo problema?
cokedude,

7
@cokedude Sono troppo tardi qui, ma èwhite-space:normal;
Beer Me

46

Si scopre che non c'è un buon modo per farlo. Il più vicino a me è stato l'aggiunta di "overflow: nascosto;" al div attorno al tavolo e perdendo il testo. La vera soluzione sembra essere quella di abbandonare il tavolo però. Usando div e posizionamento relativo sono stato in grado di ottenere lo stesso effetto, meno l'eredità di<table>

AGGIORNAMENTO 2015: Questo è per quelli come me che vogliono questa risposta. Dopo 6 anni, funziona, grazie a tutti i collaboratori.

* { // this works for all but td
  word-wrap:break-word;
}

table { // this somehow makes it work for td
  table-layout:fixed;
  width:100%;
}

29

Come accennato, inserire il testo divquasi funziona. Devi solo specificare il widthdi div, che è una fortuna per i layout che sono statici.

Funziona su FF 3.6, IE 8, Chrome.

<td>
  <div style="width: 442px; word-wrap: break-word">
    <!-- Long Content Here-->
  </div>
</td>

2
È possibile aggiungere min-width: 100%insieme widthper assicurarsi che divoccupi l'intera cella.
user1091949

Voglio fare un ritorno a capo automatico con la virgola (,). Come Long,Long,Long,Long,Long. Voglio racchiuderlo dopo una virgola (,).
Karthikeyan,

20

Soluzione alternativa che utilizza overflow-wrap e funziona perfettamente con il layout normale della tabella + larghezza della tabella 100%

https://jsfiddle.net/krf0v6pw/

HTML

<table>
  <tr>
    <td class="overflow-wrap-hack">
      <div class="content">
        wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
      </div>
    </td>
  </tr>
</table>

CSS

.content{
  word-wrap:break-word; /*old browsers*/
  overflow-wrap:break-word;
}

table{
  width:100%; /*must be set (to any value)*/
}

.overflow-wrap-hack{
  max-width:1px;
}

Benefici:

  • Utilizza overflow-wrap:break-wordinvece di word-break:break-all. Il che è meglio perché cerca prima di rompere gli spazi e interrompe la parola solo se la parola è più grande del suo contenitore.
  • Non table-layout:fixedserve Usa il tuo dimensionamento automatico regolare.
  • Non necessario per definire fisso widtho fisso max-widthin pixel. Definire %il genitore, se necessario.

Testato in FF57, Chrome62, IE11, Safari11


Anche se questo hack sembra funzionare in tutti i browser, fai attenzione che le specifiche CSS non lo garantiscono. Per w3.org/TR/CSS21/visudet.html#propdef-max-width , "l'effetto di 'larghezza minima' e 'larghezza massima' su tabelle, tabelle incorporate , celle di tabella, colonne di tabella e gruppi di colonne è indefinito " .
Mark Amery,

17

Cambia il tuo codice

word-wrap: break-word;

per

word-break:break-all;

Esempio

<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-break:break-all;">longtextwithoutspacelongtextwithoutspace Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content</div>
    </td>
    <td><span style="display: inline;">Short Content</span>
    </td>
  </tr>
</table>


-1; questo fa sì che il browser ignori completamente le interruzioni di parole e le interruzioni nel mezzo delle parole anche se non è necessario. Questo è un comportamento raramente desiderabile e presumibilmente non il comportamento che l'OP voleva, altrimenti non avrebbero usato break-wordin primo luogo.
Mark Amery,

16

Problema con

<td style="word-break:break-all;">longtextwithoutspace</td>

è che non funzionerà molto bene quando il testo ha degli spazi, ad es

<td style="word-break:break-all;">long text with andthenlongerwithoutspaces</td>

Se la parola si andthenlongerwithoutspacesadatta alla cella della tabella in una riga ma long text with andthenlongerwithoutspacesnon lo fa, la parola lunga verrà spezzata in due, anziché essere racchiusa.

Soluzione alternativa: inserire U + 200B ( ZWSP ), U + 00AD ( trattino morbido ) o U + 200C ( ZWNJ ) in ogni parola lunga dopo ogni, diciamo, 20 ° carattere (tuttavia, vedere l'avviso seguente):

td {
  border: 1px solid;
}
<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-wrap: break-word;">
        Looooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooong word
      </div>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>

Avvertenza : l'inserimento di caratteri aggiuntivi di lunghezza zero non influisce sulla lettura. Tuttavia, influisce sul testo copiato negli appunti (anche questi personaggi sono ovviamente copiati). Se il testo degli Appunti viene successivamente utilizzato in alcune funzioni di ricerca nell'app Web ... la ricerca verrà interrotta. Sebbene questa soluzione sia visibile in alcune note applicazioni Web, evita se possibile.

Avvertenza : quando si inseriscono caratteri aggiuntivi, non è necessario separare più punti di codice all'interno di grapheme. Vedi https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries per maggiori informazioni.


Forse l'output di questo è leggermente migliore se, in parole sufficientemente lunghe, si inserisce un trattino morbido dopo ogni carattere, in modo che il browser possa rompere in modo affidabile la parola sul bordo destro dell'elemento contenitore.
Mark Amery,

Mentre questa è una soluzione praticabile, il suggerimento apparentemente innocuo di aggiungere qualcosa "dopo ogni, diciamo 20esimo personaggio" è irto di trappole se vuoi farlo programmaticamente sul tuo server. Iterare sui caratteri di una stringa Unicode è difficile nella maggior parte dei linguaggi di programmazione. Nella migliore delle ipotesi , una lingua può semplificare l'iterazione su punti di codice Unicode, ma quelli non sono necessariamente quelli che vorremmo fare riferimento a "caratteri" (ad esempio, possono essere scritti come due punti di codice). Probabilmente intendiamo davvero "graphhemes", ma non conosco alcuna lingua che renda banale passare sopra a quelli.
Mark Amery,

1
@MarkAmery hai ragione. Tuttavia, anche con la semplice ASCII questo non è eccezionale. Ho aggiunto "avvisi".
Piotr Findeisen, il

14

Dai un'occhiata a questa demo

   <table style="width: 100%;">
    <tr>
        <td><div style="word-break:break-all;">LongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWord</div>
        </td>
        <td>
            <span style="display: inline;">Foo</span>
        </td>
    </tr>
</table>

Ecco il link da leggere


-1; l'utilizzo break-allfarà sì che il browser ignori completamente le interruzioni di parola quando decide dove inserire le interruzioni di riga, con l'effetto che anche se la tua cella contiene prosa normale senza parole molto lunghe, finirai con interruzioni di riga nel mezzo di parole. Questo è generalmente indesiderabile.
Mark Amery,

10

Testato in IE 8 e Chrome 13.

<table style="table-layout: fixed; width: 100%">
    <tr>
        <td>
              <div style="word-wrap: break-word;">
                 longtexthere
              </div>
        </td>
        <td><span style="display: inline;">Foo</span></td>
    </tr>
</table>

In questo modo la tabella si adatta alla larghezza della pagina e ogni colonna occupa il 50% della larghezza.

Se preferisci che la prima colonna occupi più parte della pagina, aggiungi width: 80%a tdcome nell'esempio seguente, sostituendo l'80% con la percentuale di tua scelta.

<table style="table-layout: fixed; width: 100%">
    <tr>
        <td style="width:80%">
               <div style="word-wrap: break-word;">
                 longtexthere
               </div>
            </td>
        <td><span style="display: inline;">Foo</span></td>
    </tr>
</table>

10

L'unica cosa che deve essere fatta è aggiungere larghezza all'interno <td>o <div>in <td>base al layout che si desidera ottenere.

per esempio:

<table style="width: 100%;" border="1"><tr>
<td><div style="word-wrap: break-word; width: 100px;">looooooooooodasdsdaasdasdasddddddddddddddddddddddddddddddasdasdasdsadng word</div></td>
<td><span style="display: inline;">Foo</span></td>
</tr></table>

o

 <table style="width: 100%;" border="1"><tr>
    <td width="100" ><div style="word-wrap: break-word; ">looooooooooodasdsdaasdasdasddddddddddddddddddddddddddddddasdasdasdsadng word</div></td>
    <td><span style="display: inline;">Foo</span></td>

</tr></table>

1
Questo in pratica ripete semplicemente ciò che la risposta di loungerdork aveva già detto mesi prima senza aggiungere nuove informazioni o approfondimenti.
Mark Amery,

Ha

8

La risposta che ha vinto la taglia è corretta, ma non funziona se la prima riga della tabella ha una cella unita / unita (tutte le celle hanno la stessa larghezza).

In questo caso dovresti usare i tag colgroupe colper visualizzarlo correttamente:

<table style="table-layout: fixed; width: 200px">
<colgroup>
    <col style="width: 30%;">
    <col style="width: 70%;">
</colgroup>
<tr>
    <td colspan="2">Merged cell</td>
</tr>
<tr>
    <td style="word-wrap: break-word">VeryLongWordInThisCell</td>
    <td style="word-wrap: break-word">Cell 2</td>
</tr>
</table>

8
<p style="overflow:hidden; width:200px; word-wrap:break-word;">longtexthere<p>

1
-1 sia per la mancanza di spiegazioni che per la cattiva soluzione. Inserendo il contenuto in una larghezza di pixel fissa pall'interno di una cella di tabella che non ha una larghezza di pixel fissa, quasi sicuramente finirà con l' poverflow o la mancata compilazione della cella della tabella.
Mark Amery,

8

Sembra che sia necessario impostare word-wrap:break-word;un elemento a blocchi ( div), con la larghezza specificata (non relativa). Ex:

<table style="width: 100%;"><tr>
    <td><div style="display:block; word-wrap: break-word; width: 40em;">loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word</div></td>
    <td><span style="display: inline;">Foo</span></td>
</tr></table>

o usando word-break:break-allil suggerimento di Abhishek Simon.


5

Questo funziona per me:

<style type="text/css">
    td {

        /* CSS 3 */
        white-space: -o-pre-wrap;
        word-wrap: break-word;
        white-space: pre-wrap;
        white-space: -moz-pre-wrap;
        white-space: -pre-wrap;
    }

E l'attributo table è:

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

</style>

Come molte altre risposte, la chiave qui che lo fa funzionare sta usando table-layout: fixed, ma c'è già una risposta molto più vecchia che lo suggerisce, quindi questa risposta non aggiunge alcuna nuova informazione.
Mark Amery,

4

Se non hai bisogno di un bordo della tabella, applica questo:

table{
    table-layout:fixed;
    border-collapse:collapse;
}
td{
    word-wrap: break-word;
}

C'è già una risposta molto più vecchia che suggerisce di usare table-layout: fixed; questo non aggiunge nulla di nuovo alla pagina.
Mark Amery,

4

Ho trovato una soluzione che sembra funzionare su Firefox, Google Chrome e Internet Explorer 7-9. Per fare un layout di tabella a due colonne con testo lungo su un lato. Ho cercato dappertutto un problema simile e ciò che ha funzionato in un browser ha rotto l'altro, o l'aggiunta di più tag a una tabella sembra solo una cattiva codifica.

NON ho usato una tabella per questo. DL DT DD in soccorso. Almeno per correggere un layout a due colonne, che è fondamentalmente una configurazione di glossario / dizionario / significato delle parole.

E un po 'di stile generico.

    dl {
        margin-bottom:50px;
    }

    dl dt {
        background:#ccc;
        color:#fff;
        float:left;
        font-weight:bold;
        margin-right:10px;
        padding:5px;
        width:100px;
    }

    dl dd {
        margin:2px 0;
        padding:5px 0;
        word-wrap:break-word;
        margin-left:120px;
    }
<dl>
    <dt>test1</dt>
    <dd>Fusce ultricies mi nec orci tempor sit amet</dd>
    <dt>test2</dt>
    <dd>Fusce ultricies</dd>
    <dt>longest</dt>
    <dd>
        Loremipsumdolorsitametconsecteturadipingemipsumdolorsitametconsecteturaelit.Nulla
        laoreet ante et turpis vulputate condimentum. In in elit nisl. Fusce ultricies
        mi nec orci tempor sit amet luctus dui convallis. Fusce viverra rutrum ipsum,
        in sagittis eros elementum eget. Class aptent taciti sociosqu ad litora
        torquent per conubia nostra, per.
    </dd>
</dl>

Usando il ritorno a capo mobile e il margine sinistro, ho ottenuto esattamente ciò di cui avevo bisogno. Ho pensato di condividere questo con gli altri, forse aiuterebbe qualcun altro con un layout in stile a due colonne, con difficoltà a mettere le parole a capo.

Ho provato a usare il ritorno a capo automatico nella cella della tabella, ma ha funzionato solo in Internet Explorer 9, (e ovviamente Firefox e Google Chrome) principalmente cercando di riparare il browser Internet Explorer rotto qui.


2

Le tabelle si avvolgono per impostazione predefinita, quindi assicurati che la visualizzazione delle celle della tabella sia table-cell:

td {
   display: table-cell;
}

-1; il testo in qualsiasi elemento HTML si avvolge per impostazione predefinita, non solo le tabelle. Il suggerimento qui non ha davvero alcun senso.
Mark Amery,

1

style = "layout della tabella: fisso; larghezza: 98%; a capo automatico: parola spezzata"

<table bgcolor="white" id="dis" style="table-layout:fixed; width:98%; word-wrap:break-word" border="0" cellpadding="5" cellspacing="0" bordercolordark="white" bordercolorlight="white" >

Demo - http://jsfiddle.net/Ne4BR/749/

Questo ha funzionato alla grande per me. Avevo lunghi collegamenti che avrebbero portato la tabella a superare il 100% sui browser web. Testato su IE, Chrome, Android e Safari.


Questo è fondamentalmente un duplicato come la risposta più votata ; in entrambi i casi la soluzione si riduce a "usare table-layout: fixed".
Mark Amery

0

Una soluzione che funziona con Google Chrome e Firefox (non testata con Internet Explorer) è quella di impostare display: table-cell come elemento di blocco.


0

Puoi provare questo se ti va bene ...

Inserisci un'area di testo all'interno della tua td e disabilitala con il colore di sfondo bianco e definisci il suo numero di righe.

<table style="width: 100%;">
  <tr>
    <td>
        <textarea rows="4" style="background-color:white;border: none;" disabled>      Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
      </textarea>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>
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.