Es gibt eine CSS-Eigenschaft für Tabellen, die meiner Meinung nach gut unterstützt, wenig bekannt und super nützlich ist. Sie verändert die Art und Weise, wie Tabellen gerendert werden, sodass sie ein stabileres, vorhersagbareres Layout erhalten.
Es ist dieser
table {
table-layout: fixed;
}
Die Standardeigenschaft für table-layout ist auto, und das ist das Tabellenlayout, mit dem die meisten von uns vertraut sind. Dieser Stil fühlt sich für mich schwammig und seltsam an. Hier ist eine Untersuchung
Siehe den Stift Default Tables are Weird. von Chris Coyier (@chriscoyier) auf CodePen.
Mit table-layout: fixed;
Die Dinge werden mit dieser Eigenschaft/diesem Wert viel stabiler und vorhersagbarer.
Das Layout wird basierend auf der ersten Zeile fixiert. Setzen Sie die Breite dieser Zeile, und der Rest der Tabelle folgt.
Es ist etwas komplizierter, aber nicht viel. Hier ist eine Untersuchung
Siehe den Stift Fixed Tables Solve Some Issues von Chris Coyier (@chriscoyier) auf CodePen.
Anwendungsfall
Ich habe das untersucht, weil ich versuchte, eine einheitliche Zeilenhöhe für Pens in der Listenansicht auf CodePen beizubehalten (d. h. Pen-Titel nicht umbrechen), aber auch nicht die Breite der Tabelle aufblähen. Das hat gut funktioniert.

Ich stelle mir vor, dass die meisten von Ihnen das wissen: Tabellen sind für tabellarische Daten und E-Mails da. Nicht für Web-Layouts, wegen Gründen.
Praktisches HTML und CSS
Ich stelle mir vor, die meisten Anwendungen werden so aussehen
<table class="users">
<thead>
<tr>
<th class="row-1 row-ID">ID</th>
<th class="row-2 row-name">Name</th>
<th class="row-3 row-job">Job</th>
<th class="row-4 row-email">Email<th>
</tr>
</thead>
<tbody>
<tr>
<td>0001</td>
<td>Johnny Five</td>
<td>Robotin'</td>
<td>[email protected]</td>
</tr>
<tr>
<td>0002</td>
<td>Super Superlonglastnamesmith</td>
<td>Doin' stuff</td>
<td>[email protected]</td>
</tr>
</tbody>
</table>
.users {
table-layout: fixed;
width: 100%;
white-space: nowrap;
}
.users td {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Column widths are based on these cells */
.row-ID {
width: 10%;
}
.row-name {
width: 40%;
}
.row-job {
width: 30%;
}
.row-email {
width: 20%;
}
Siehe den Stift xFcrp von Chris Coyier (@chriscoyier) auf CodePen.
Zur Sicherheit sollten Sie wissen, dass Sie auch das <col>-Element verwenden können, um Spaltenbreiten festzulegen, da diese sich auf die erste Reihe von Zellen auswirken und es nur um diese erste Reihe von Zellen geht, die die Grundlage für den Rest der Tabelle bildet.
Layout-Geschwindigkeit
Ich habe gehört, dass diese Art von Tabellenlayout auch *schneller* ist, was logisch ist, da der Inhalt der gesamten Tabelle nicht analysiert werden muss, um zu wissen, wie groß die Spaltenbreiten sein werden. Daten dazu habe ich jedoch keine.
In E-Mails
Die Support-Chart von Campaign Monitor für CSS in E-Mail-Clients zeigt, dass table-layout durchgängig unterstützt wird.
Mehr Infos
- Viel mehr Informationen über
<table>-Tags - table-layout auf MDN. Beinhaltet Browserunterstützung, die im Grunde allgegenwärtig ist.
Follow-Up-Tweets
@chriscoyier das ist, was ich verwendet habe, um ungrid zu erstellen, mein responsives Grid, das nur 97 Bytes hat https://#/RgIFjpcCXu
— Chris Nager (@chrisnager) 2. Juli 2014
@chriscoyier Schau mal: https://#/lO62D4lECK
— Harry Roberts (@csswizardry) 2. Juli 2014
@chriscoyier @twbootstrap verwendet dies zur Handhabung von horizontalen Button-Gruppen: https://#/dhLRuN0Jof
— Lucas Constantino (@luconsilva) 2. Juli 2014
@chriscoyier Chris, gibt es einen Grund, warum man nicht einfach immer table-layout: fixed verwenden sollte?
— Mike Aparicio (@peruvianidol) 2. Juli 2014
Wenn ich die vertikale Ausrichtung mit
display: table;unddisplay: table-cell; vertical-align: middle;bei den Kindern mache und eines der Kinder einen „ enthält, den ich auch skalieren und sein Verhältnis beibehalten möchte, musste ichtable-layout: fixedauf das Element mitdisplay: table;anwenden, damit es in Firefox gut funktioniert.Entschuldigung, der Tippfehler in meinem vorherigen Kommentar sollte ein
img-Tag sein.Ja, das ist mir auch ständig aufgefallen, das vertikale Zentrieren von Bildern mit unterschiedlichen Abmessungen in einem Container mit festem Verhältnis, wie in einem Produktlistungsraster! Die Bilder skalieren in Chrome gut, aber in FF sprengen die Bilder den Container ohne table-layout: fixed.
Wie immer großartig, Chris. Danke!
Toller Beitrag, aber warum keine Erwähnung von colgroups und cols?
Das gibt es. Ich habe es nur nicht vertieft, weil ich sie nicht besonders nützlich finde.
Für meine responsiven E-Mails wende ich dies nur auf die äußerste Tabelle an. Sonst kablooey.
Hallo Chris,
Danke für den Tipp! Ich musste das kürzlich auch verwenden und es ist enorm nützlich, wie Sie hier klar demonstriert haben.
Ich habe eine Frage zum letzten CodePen-Beispiel (dem größenveränderbaren mit text-overflow: ellipsis). Wenn Sie die Breite verkleinern, erhält die erste Spalte mit den IDs korrekt die Ellipse. Aber wenn ich sie auf ihre minimale Breite schrumpfe, haben die IDs in der ersten Spalte keine Ellipse mehr und zeigen stattdessen nur 000 an, während der Rest abgeschnitten ist, als wäre overflow: hidden.
Haben Sie eine Ahnung, warum das so ist? Ich bin nur neugierig!
Das ist mir auch aufgefallen! Irgendwie seltsam. Vielleicht ist es so, als ob es standardmäßig auf den Text zurückfällt, wenn die Ellipse nicht passt. Was seltsam und wahrscheinlich ein Fehler ist. Oder vielleicht auch nicht. Schwer zu sagen.
Übrigens wird overflow in Firefox nicht auf Tabellenzellen angewendet. Der Fehler wurde bereits 2003 gemeldet (https://bugzilla.mozilla.org/show_bug.cgi?id=221154), aber *Stille*.
Ja, Firefox hat ein anderes Verhalten als andere Browser. Ich hatte einen Fehler, weil andere Browser die Zelle wie einen Block behandeln, Firefox aber nicht. Deshalb musste ich einen Div in die Zelle einfügen, um das zu beheben.
Ich habe diese Eigenschaft bereits für 2 Projekte verwendet, aber auf DIVs. Das Schöne daran ist, dass ein untergeordnetes Element eine feste Breite haben kann und sich der Rest einfach anpasst.
Sie können es auf dieser Seite in Aktion sehen. Die Zeitleiste unten ist auf diese Weise erstellt.
http://windpowerpioneers.vestas.com/timeline
Das ausgewählte Jahr wird mindestens unter Firefox bei bestimmten Browserbreiten auf zwei Zeilen umgebrochen. Dies wird durch
word-wrap: break-word;verursacht, was eine Sternregel ist. Gibt es einen Grund, warum Sie das angewendet haben? Mir scheint das etwas zu sein, das viele unerwartete Layoutprobleme verursachen wird.Hallo Vesa
Sie haben einen guten Punkt. In diesem Beispiel würde ich word-wrap entfernen. Aber generell finde ich es gut, es auf das * anzuwenden, da Kunden manchmal lange Wörter schreiben oder eine lange URL in den Inhalt kopieren.
Gute Arbeit, Chris.
Auch etwas ganz anderes. Es scheint ein Problem mit Ihrem CDN zu geben...
Bezüglich: „Und ich bin 1000px breit. Man könnte meinen, sie wäre letztendlich 1/3 so breit, aber so funktioniert es nicht.“
Ist es nicht genau das, was es tut? Diese Spalte ist 1/3 so breit wie die andere oder 1/4 der Gesamtbreite der Tabelle (1000px von insgesamt 4000px).
Für mich ist es das nicht. Sie ist kleiner als 1/4, genau so breit wie das längste Wort, nämlich „ultimately,“.
Ja, es funktioniert tatsächlich so.
Ich habe das Beispiel aktualisiert, um es klarer zu machen, wobei eine Zelle 2000 Pixel breit und die andere 1000 Pixel breit ist, was zu 2/3 und 1/3 führt.
Einige weitere Verwendungen/Beispiele http://csswizardry.com/2013/11/taming-data-tables/
Ich liebe
table-layout: fixed. Ich benutze es immer noch als Alternative zu Flexbox, bis IE8 sicher vergessen werden kann. Es macht es trivial einfach, ein fließendes Element den verbleibenden Platz im Container einnehmen zu lassen.IE9 unterstützt auch keine Flexbox, planen Sie dann IE9 (mit der geringeren Benutzerbasis als IE8) zu überspringen, wenn Sie IE8 verlassen?
Mein Unternehmen hat IE8 schon vor langer Zeit abgeschafft und bereitet sich darauf vor, auch IE9 abzuschaffen, aber die Verwendung von
table-layout: fixedwar manchmal nützlich.Ich muss etwas übersehen – hier ist, wie mein Versuch aussieht, Ihren Code zu überprüfen: http://jsfiddle.net/clayshannon/8m8xr/
Fügen Sie die Eigenschaft
text-align:leftzumtable-Element hinzuDie Verwendung von <col> in einer Tabelle mit fixed-layout kommt wirklich zum Tragen, wenn Zellen in der ersten Zeile „colspan=“ verwenden.
Danke!!!
Ich denke, table-layout:fixed ist gleich breit
IE9 unterstützt Flexbox auch nicht, planen Sie dann IE9 (mit der Benutzerliste kleiner als IE8) zu überspringen, wenn Sie IE8 verlassen?
Danke. Ich wurde so oft beim Verwenden von Tabellenlayouts in CSS „anstelle“ der herkömmlichen HTML-Tabellenlayouts verbrannt, dass ich schließlich aufgegeben und mich komplett an die HTML-Sachen gehalten habe. Es sind Artikel wie Ihrer, die keine allgemeinen Formulierungen ohne konkrete und nützliche Aussagen verwenden, die ich brauche, um durch die „CSS-Reha“ zu kommen. Mein Problem ist, dass ich viele Legacy-XLS- und ODT-Tabellen/Datenbanken mit viel Material habe, das ich online stellen wollte, und jedes Mal, wenn ich es versuchte, zerfiel es „an den Nähten“.
Ja, es funktioniert tatsächlich so, danke