662 Stimmen

Zeilenumbruch in einer HTML-Tabelle

Ich habe mit word-wrap: break-word um Text einzuschließen div s und span s. In Tabellenzellen scheint es jedoch nicht zu funktionieren. Ich habe eine Tabelle eingestellt auf width:100% mit einer Zeile und zwei Spalten. Text in Spalten, obwohl mit dem obigen Stil versehen word-wrap nicht verpackt. Dadurch wird der Text über die Grenzen der Zelle hinausgeschoben. 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 der Rahmen meiner Seite, aber es bricht nicht mit dem obigen HTML. Ich habe die folgenden Vorschläge ausprobiert, indem ich Folgendes hinzugefügt habe text-wrap:suppress y text-wrap:normal aber beides hat nicht geholfen.

0 Stimmen

Hard-Hyphen hinzufügen. <tr> <td style="text-wrap:normal;word-wrap:break-word"> Dies ist ein Vorspruch. </td> </tr>

0 Stimmen

Leider stammt der darin enthaltene Text aus nutzergenerierten Inhalten. Natürlich könnte ich ihn vorverarbeiten und den Bindestrich hinzufügen, aber ich hatte gehofft, es gäbe einen besseren Weg.

0 Stimmen

Ich entschuldige mich für die Verwendung des Wortes "harter Bindestrich". In HTML wird der einfache Bindestrich durch das Zeichen "-" (- oder -) dargestellt. Der weiche Bindestrich wird durch die Zeicheneinheit ­ ( oder ) dargestellt.

25voto

Slava Punkte 2697

Workaround, der overflow-wrap verwendet und mit normalem Tabellenlayout + Tabellenbreite 100% 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;
}

Vorteile:

  • Verwendet overflow-wrap:break-word anstelle von word-break:break-all . Das ist besser, weil es zuerst versucht, bei Leerzeichen umzubrechen, und das Wort nur dann abschneidet, wenn es größer als sein Container ist.
  • No table-layout:fixed benötigt. Verwenden Sie die normale automatische Größenanpassung.
  • Nicht erforderlich, um fest zu definieren width oder fest max-width in Pixel. Definieren Sie % des Elternteils, falls erforderlich.

Getestet in FF57, Chrome62, IE11, Safari11

0 Stimmen

Dieser Hack scheint zwar tatsächlich in allen Browsern zu funktionieren, aber die CSS-Spezifikation bietet dafür keine Garantie. 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". .

0 Stimmen

Sie brauchen nicht einmal eine separate div aber vielen Dank dafür!

20voto

Piotr Findeisen Punkte 16757

Problem mit

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

ist, dass es nicht so gut funktioniert, wenn Text hat einige Räume, z.B.

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

Wenn das Wort andthenlongerwithoutspaces passt in eine Tabellenzelle in einer Zeile, aber long text with andthenlongerwithoutspaces nicht, wird das lange Wort in zwei Teile geteilt, anstatt umbrochen zu werden.

Alternative Lösung: U+200B einfügen ( ZWSP ), U+00AD ( weicher Bindestrich ) oder U+200C ( ZWNJ ) in jedem langen Wort nach etwa jedem 20. Zeichen (siehe jedoch die 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. Es 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 Webanwendung verwendet wird, wird die Suche unterbrochen. Obwohl diese Lösung in einigen bekannten Webanwendungen zu sehen ist, sollten Sie sie nach Möglichkeit vermeiden.

Warnung : Wenn Sie zusätzliche Zeichen einfügen, sollten Sie nicht mehrere Codepunkte innerhalb eines Graphems trennen. Siehe https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries für weitere Informationen.

0 Stimmen

Vielleicht ist die Ausgabe etwas besser, wenn Sie bei ausreichend langen Wörtern einen weichen Bindestrich nach jede Zeichen, so dass der Browser das Wort am rechten Rand des enthaltenen Elements zuverlässig umbrechen kann.

0 Stimmen

Dies ist zwar eine praktikable Lösung, aber der scheinbar harmlose Vorschlag, etwas hinzuzufügen "nach jedem, sagen wir, 20. Zeichen" ist voller Fallen, wenn Sie es programmatisch auf Ihrem Server durchführen wollen. Das Iterieren über die Zeichen einer Unicode-Zeichenkette ist in den meisten Programmiersprachen schwierig. Unter am besten Eine Sprache kann es leicht machen, über Unicode-Codepunkte zu iterieren, aber diese sind nicht unbedingt das, was wir als "Zeichen" bezeichnen wollen (z. B. e kann als zwei Codepunkte geschrieben werden). Wir meinen wahrscheinlich wirklich "Grapheme", aber ich weiß es nicht. jede Sprache, die es trivial macht, eine Schleife über diese zu ziehen.

1 Stimmen

@MarkAmery Sie haben Recht. Aber selbst mit einfachem ASCII ist das nicht gut. Ich habe "Warnungen" hinzugefügt.

18voto

Duc Nguyen Punkte 436

Ändern Sie Ihren Code

word-wrap: break-word;

à

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>

0 Stimmen

-1; dies führt dazu, dass der Browser Wortumbrüche komplett ignoriert und in der Mitte von Wörtern umbricht, auch wenn dies nicht erforderlich ist. Das ist selten wünschenswertes Verhalten und vermutlich nicht das Verhalten, das der OP wollte, sonst hätte er nicht break-word an erster Stelle.

16voto

AabinGunz Punkte 11356

Überprüfen Sie diese 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>

Hier ist der Link zu lesen

0 Stimmen

-1; mit break-all führt dazu, dass der Browser Wortumbrüche komplett ignoriert, wenn er entscheidet, wo er Zeilenumbrüche setzt, mit dem Effekt, dass selbst wenn Ihre Zelle normale Prosa ohne sehr lange Wörter enthält, Sie Zeilenumbrüche in der Mitte von Wörtern erhalten. Dies ist in der Regel unerwünscht.

10voto

Waylon Flinn Punkte 19361

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 wird die Tabelle an die Breite der Seite angepasst und jede Spalte nimmt 50 % der Breite ein.

Wenn Sie möchten, dass die erste Spalte mehr Platz auf der Seite einnimmt, fügen Sie ein width: 80% zum td wie im folgenden Beispiel, wobei Sie 80 % durch den von Ihnen gewünschten Prozentsatz 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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X