Zeilenumbruch in eine HTML-Tabelle


566

Ich habe verwendet word-wrap: break-word, um Text in divs und spans zu verpacken . In Tabellenzellen scheint es jedoch nicht zu funktionieren. Ich habe eine Tabelle width:100%mit einer Zeile und zwei Spalten. Text in Spalten word-wrapwird nicht umgebrochen , obwohl er wie oben beschrieben gestaltet ist . Dadurch überschreitet der Text die Grenzen der Zelle. Dies geschieht in Firefox, Google Chrome und Internet Explorer.

So sieht die Quelle aus:

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>

Das lange Wort oben ist größer als die Grenzen meiner Seite, aber es bricht nicht mit dem obigen HTML. Ich habe die folgenden Vorschläge zum Hinzufügen ausprobierttext-wrap:suppress undtext-wrap:normal , aber keiner hat geholfen.


Fügen Sie einen Bindestrich hinzu. <tr> <td style = "Textumbruch: normal; Zeilenumbruch: Umbruchwort"> Dies ist eine Darstellung. </ td> </ tr>
Adatapost

Leider stammt der Text dort aus benutzergenerierten Inhalten. Natürlich könnte ich es vorverarbeiten und den Bindestrich hinzufügen, aber ich hatte gehofft, dass es einen besseren Weg geben würde.
Psychotik

Ich entschuldige mich für die Verwendung des Wortes "harter Bindestrich". In HTML wird der einfache Bindestrich durch das Zeichen "-" (& # 45; oder & # x2D;) dargestellt. Der weiche Bindestrich wird durch die Zeichenentitätsreferenz & shy; (& # 173; oder & # xAD;)
adatapost

Verwenden Sie wirklich <code> break-wor<em> k </ em> </ code>? Vielleicht könnte das etwas damit zu tun haben.
Ms2ger

1
Wenn Sie hier sind, möchten Sie vielleicht auch unter white-space: pre-wrap developer.mozilla.org/en-US/docs/Web/CSS/white-space
Tom Prats

Antworten:


624

Das Folgende funktioniert für mich in Internet Explorer. Beachten Sie das Hinzufügen des table-layout:fixedCSS-Attributs

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


@ewomac Ja, manchmal muss ich die VS2010-Fehler in Bezug auf HTML / CSS einfach ignorieren, wenn ich weiß, dass es im Browser funktioniert.
Marc Stober

2
@ Marc !! Alter, vielen Dank dafür. Ich wurde beauftragt, eine mobile Version einer Client-Site zu erstellen, die Tabellen verwendet, und ich hatte Probleme, dies zum Laufen zu bringen! Tabellenlayout: behoben hat den Trick gemacht!
Debug

17
Dies macht die anderen Spalten viel zu breit.
Clément

2
Lesen Sie unbedingt developer.mozilla.org/en-US/docs/Web/CSS/table-layout. Tabellen- und Spaltenbreiten werden durch die Breite der Tabellen- und Spaltenelemente oder durch die Breite der ersten Zellenzeile festgelegt. Zellen in nachfolgenden Zeilen wirken sich nicht auf die Spaltenbreite aus. Klingt so, als wäre das auch gut für die Leistung.
Sam Barnum

2
@ Clément siehe Indreks Antwort unten <colgroup>, es hat dies für mich behoben.
Andrew Tweber

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

oder

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

Kann bestätigen, dass Pratiks Ansatz auch auf Safari unter iOS (iPhone) funktioniert.
Occulus

Um das Problem mit einigen kurzen und einigen langen Wörtern zu umgehen, können Sie den Text möglicherweise vorverarbeiten und nur lange Wörter (z. B.> 40 Zeichen) in das Textzeichen einschließen <span>.
Nornagon

9
Dies wird nicht von Firefox, Oper
Meotimdihia

5
Dies wurde bei Nicht-Wort-Zeichen nicht bevorzugt unterbrochen (wenn ich eine Reihe kürzerer Wörter durch Leerzeichen getrennt hätte, würden die Wörter immer bis zur Zeile ausgeführt und dann das letzte Wort in zwei Hälften geteilt). Word-wrapwird Wörter nur brechen, wenn nötig
Hashbrown

Dieser Ansatz ist besser, weil nicht erforderlich table-layout: fixed;.
Finesse

125

Ein langer Versuch, aber überprüfen Sie mit Firebug (oder ähnlichem), ob Sie nicht versehentlich die folgende Regel erben:

white-space:nowrap;

Dies kann Ihr angegebenes Zeilenumbruchverhalten überschreiben .


Dies ist, was geerbt wurde und brach die Wortumhüllung für mich
Shane Lee

@ RickGrundy Was ändern Sie, wenn Sie dieses Problem haben?
Kokedude

7
@ Kokedude Ich bin viel zu spät hier, aber es istwhite-space:normal;
Beer Me

46

Es stellt sich heraus, dass es keinen guten Weg gibt, dies zu tun. Das nächste, was ich kam, ist das Hinzufügen von "Überlauf: versteckt"; zum div um den Tisch und den Text zu verlieren. Die wirkliche Lösung scheint jedoch darin zu bestehen, den Tisch loszuwerden. Mit divs und relativer Positionierung konnte ich den gleichen Effekt erzielen, abzüglich des Erbes von<table>

UPDATE 2015: Dies ist für diejenigen wie mich, die diese Antwort wollen. Nach 6 Jahren funktioniert dies dank aller Mitwirkenden.

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

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

29

Wie bereits erwähnt, divfunktioniert das Einfügen des Textes fast. Sie haben soeben die angeben müssen widthvon derdiv , die für Layouts ist das Glück , die statisch sind.

Dies funktioniert unter FF 3.6, IE 8, Chrome.

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

2
Sie können min-width: 100%zusammen mit hinzufügen, widthum sicherzustellen div, dass die gesamte Zelle belegt wird.
user1091949

Ich möchte einen Zeilenumbruch mit Komma (,) durchführen. Wie Long,Long,Long,Long,Long. Ich möchte dies nach einem Komma (,) einschließen.
Karthikeyan

20

Problemumgehung, die Overflow-Wrap verwendet und mit normalem Tabellenlayout + Tabellenbreite 100% einwandfrei funktioniert

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

Leistungen:

  • Verwendet overflow-wrap:break-wordstattword-break:break-all . Was besser ist, weil es versucht, zuerst Leerzeichen zu durchbrechen und das Wort nur dann abschneidet, wenn das Wort größer als der Container ist.
  • Nicht table-layout:fixedbenötigt. Verwenden Sie Ihre reguläre automatische Größenanpassung.
  • Nicht erforderlich, um fest widthoder fest max-widthin Pixel zu definieren . Definieren Sie %bei Bedarf das übergeordnete Element.

Getestet in FF57, Chrome62, IE11, Safari11


Obwohl dieser Hack tatsächlich in allen Browsern zu funktionieren scheint, beachten Sie, dass die CSS-Spezifikation keine Garantie dafür bietet. Per w3.org/TR/CSS21/visudet.html#propdef-max-width , „die Wirkung von‚min-width‘und‚max-width‘auf Tabellen, Inline - Tabellen, Tabellenzellen, Tabellenspalten und Spaltengruppen ist undefiniert " .
Mark Amery

17

Ändern Sie Ihren Code

word-wrap: break-word;

zu

word-break:break-all;

Beispiel

<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; Dadurch ignoriert der Browser Wortumbrüche vollständig und bricht mitten in Wörtern auf, auch wenn dies nicht erforderlich ist. Das ist selten wünschenswertes Verhalten und vermutlich nicht das Verhalten, das das OP wollte, sonst hätten sie es überhaupt nicht benutzt break-word.
Mark Amery

16

Problem mit

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

ist , dass es nicht so gut , wenn Text funktioniert hat einige Räume, zB

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

Wenn das Wort andthenlongerwithoutspacesin einer Zeile in die Tabellenzelle passt, dies long text with andthenlongerwithoutspacesjedoch nicht, wird das lange Wort in zwei Teile geteilt, anstatt umbrochen zu werden.

Alternative Lösung: Fügen Sie U + 200B ( ZWSP ), U + 00AD ( weicher Bindestrich ) oder U + 200C ( ZWNJ ) in jedes lange Wort nach beispielsweise dem 20. Zeichen ein (siehe jedoch Warnung unten):

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>

Warnung : Das Einfügen zusätzlicher Zeichen mit der Länge Null hat keinen Einfluss auf das Lesen. Dies wirkt sich jedoch auf Text aus, der in die Zwischenablage kopiert wird (diese Zeichen werden natürlich auch kopiert). Wenn der Text in der Zwischenablage später in einer Suchfunktion in der Web-App verwendet wird, wird die Suche unterbrochen. Obwohl diese Lösung in einigen bekannten Webanwendungen zu finden ist, sollten Sie sie nach Möglichkeit vermeiden.

Warnung : Wenn Sie zusätzliche Zeichen einfügen, sollten Sie nicht mehrere Codepunkte innerhalb des Graphems trennen. Weitere Informationen finden Sie unter https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries .


Vielleicht ist die Ausgabe davon etwas besser, wenn Sie in ausreichend langen Wörtern nach jedem Zeichen einen weichen Bindestrich einfügen , damit der Browser das Wort am rechten Rand des enthaltenen Elements zuverlässig brechen kann.
Mark Amery

Obwohl dies eine praktikable Lösung ist, ist der scheinbar harmlose Vorschlag, "nach jedem 20. Zeichen" etwas hinzuzufügen , mit Fallen behaftet, wenn Sie dies programmgesteuert auf Ihrem Server tun möchten. Das Iterieren über die Zeichen einer Unicode-Zeichenfolge ist in den meisten Programmiersprachen schwierig. Im besten Fall kann eine Sprache das Iterieren über Unicode-Codepunkte vereinfachen, aber diese sind nicht unbedingt das, was wir als "Zeichen" bezeichnen möchten (z. B. können sie als zwei Codepunkte geschrieben werden). Wir meinen wahrscheinlich wirklich "Grapheme", aber ich kenne keine Sprache, die es trivial macht, diese zu durchlaufen.
Mark Amery

1
@ MarkAmery du hast recht. Selbst mit einfachem ASCII ist dies jedoch nicht großartig. Ich habe "Warnungen" hinzugefügt.
Piotr Findeisen

14

Schauen Sie sich diese Demo an

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

Hier ist der Link zum Lesen


-1; Verwendung break-allwird der Browser vollständig zu Wort bricht ignorieren , wenn wohin mit Zeilenumbrüche, mit der Wirkung der Entscheidung , dass , selbst wenn Ihr Handy normale Prosa ohne sehr lange Wörter enthält, können Sie mit Zeilenumbrüche in der Mitte von Wörtern am Ende werden. Dies ist typischerweise unerwünscht.
Mark Amery

10

Getestet in IE 8 und 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>

Dadurch passt die Tabelle an die Breite der Seite an und jede Spalte nimmt 50% der Breite ein.

Wenn Sie die erste Spalte lieber mehr von der Seite zu nehmen, fügen Sie ein width: 80%zu der tdwie im folgenden Beispiel, 80% mit dem Prozentsatz Ihrer Wahl ersetzen.

<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

Das einzige, was getan werden muss, ist, dem <td>oder dem <div>Inneren <td>je nach dem Layout, das Sie erreichen möchten, eine Breite hinzuzufügen .

z.B:

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

oder

 <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
Dies wiederholt im Grunde nur die Antwort von Loungerdork, die bereits Monate zuvor gesagt wurde, ohne neue Informationen oder Erkenntnisse hinzuzufügen.
Mark Amery

Es hat bei mir
funktioniert

8

Die Antwort, die das Kopfgeld gewonnen hat, ist richtig, funktioniert jedoch nicht, wenn die erste Zeile der Tabelle eine zusammengeführte / verbundene Zelle enthält (alle Zellen erhalten die gleiche Breite).

In diesem Fall sollten Sie die Tags colgroupund verwenden col, um sie richtig anzuzeigen:

<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 sowohl für das Fehlen jeglicher Erklärung als auch für die schlechte Lösung. Wenn Sie den Inhalt in eine feste Pixelbreite pinnerhalb einer Tabellenzelle einfügen, die keine feste Pixelbreite hat, wird pdie Tabellenzelle mit ziemlicher Sicherheit entweder überlaufen oder nicht ausgefüllt.
Mark Amery

8

Es scheint, dass Sie word-wrap:break-word;ein Blockelement ( div) mit der angegebenen (nicht relativen) Breite festlegen müssen . 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>

oder mit word-break:break-alldem Vorschlag von Abhishek Simon.


5

Das funktioniert bei mir:

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

Das Tabellenattribut lautet:

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

</style>

Wie bei einigen anderen Antworten wird hier das Schlüsselelement verwendet, mit dem es funktioniert table-layout: fixed, aber es gibt bereits eine viel ältere Antwort, die dies nahelegt, sodass diese Antwort keine neuen Informationen hinzufügt.
Mark Amery

4

Wenn Sie keinen Tabellenrand benötigen, wenden Sie Folgendes an:

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

Es gibt bereits eine viel ältere Antwort, die die Verwendung vorschlägt table-layout: fixed. Dieser fügt der Seite nichts Neues hinzu.
Mark Amery

4

Ich habe eine Lösung gefunden, die in Firefox, Google Chrome und Internet Explorer 7-9 zu funktionieren scheint. Für ein zweispaltiges Tabellenlayout mit langem Text auf der einen Seite. Ich habe überall nach ähnlichen Problemen gesucht, und was in einem Browser funktioniert hat, hat den anderen kaputt gemacht, oder das Hinzufügen weiterer Tags zu einer Tabelle scheint nur eine schlechte Codierung zu sein.

Ich habe dafür KEINEN Tisch benutzt. DL DT DD zur Rettung. Zumindest zum Korrigieren eines zweispaltigen Layouts ist dies im Grunde ein Glossar / Wörterbuch / Wortbedeutungs-Setup.

Und etwas generisches Styling.

    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>

Mit schwebendem Zeilenumbruch und Rand links bekam ich genau das, was ich brauchte. Ich dachte nur, ich würde dies mit anderen teilen, vielleicht hilft es jemand anderem mit einem zweispaltigen Layout im Definitionsstil, mit Problemen beim Umschließen der Wörter.

Ich habe versucht, Zeilenumbruch in der Tabellenzelle zu verwenden, aber es funktionierte nur in Internet Explorer 9 (und natürlich in Firefox und Google Chrome), hauptsächlich um den defekten Internet Explorer-Browser hier zu reparieren.


2

Tabellen werden standardmäßig umbrochen. Stellen Sie daher sicher, dass die Tabellenzellen wie folgt angezeigt werden table-cell:

td {
   display: table-cell;
}

-1; Text in jedem HTML-Element wird standardmäßig umgebrochen, nicht nur in Tabellen. Der Vorschlag hier macht eigentlich keinen Sinn.
Mark Amery

1

style = "Tabellenlayout: fest; Breite: 98%; Zeilenumbruch: Umbruchwort"

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

Das hat bei mir super funktioniert. Ich hatte lange Links, die dazu führten, dass die Tabelle in Webbrowsern 100% überschritt. Getestet auf IE, Chrome, Android und Safari.


Dies ist im Grunde ein Duplikat als Antwort mit der höchsten Bewertung . In beiden Fällen läuft die Lösung auf "Verwendung table-layout: fixed" hinaus.
Mark Amery

0

Eine Lösung, die mit Google Chrome und Firefox funktioniert (nicht mit Internet Explorer getestet), besteht darin, display: table-cellein Blockelement festzulegen.


0

Sie können dies versuchen, wenn es Ihnen passt ...

Fügen Sie einen Textbereich in Ihr td ein und deaktivieren Sie ihn mit der Hintergrundfarbe Weiß und definieren Sie die Anzahl der Zeilen.

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.