Das <table>-Element in HTML wird zur Anzeige tabellarischer Daten verwendet. Man kann es sich als eine Möglichkeit vorstellen, Daten zu beschreiben und anzuzeigen, die in einer Tabellenkalkulationssoftware Sinn ergeben würden. Im Wesentlichen: Spalten und Zeilen. In diesem Artikel werden wir uns ansehen, wie man sie verwendet, wann man sie verwendet und alles andere, was man wissen muss.
Ein sehr grundlegendes Beispiel
Hier ist eine sehr einfache Demo von Tabellendaten
Es handelt sich um Daten, die über mehrere Achsen hinweg nützlich sind. Stellen Sie sich vor, Sie fahren mit dem Finger über eine Zeile (horizontal), um eine einzelne Person und relevante Informationen über sie zu sehen. Oder eine Spalte hoch und runter (vertikal), um ein Gefühl für die Vielfalt oder das Muster der Daten an diesem Punkt zu bekommen.
Kopf und Körper
Eine Sache, die wir im sehr grundlegenden Beispiel oben nicht getan haben, ist semantisch anzuzeigen, dass die erste Zeile der Kopf der Tabelle war. Das hätten wir wahrscheinlich tun sollen. Die gesamte erste Zeile enthält keine Daten, es sind lediglich die Titel der Spalten. Wir können dies mit dem <thead>-Element tun, das die erste <tr> umschließen würde (es könnte so viele Zeilen umschließen, wie für Header-Informationen erforderlich sind).
Dieses HTML würde so aussehen
Wenn Sie <thead> verwenden, darf kein <tr> ein direktes Kind von <table> sein. Alle Zeilen müssen entweder innerhalb von <thead>, <tbody> oder <tfoot> liegen. Beachten Sie, dass wir hier auch alle Datenzeilen in <tbody> eingeschlossen haben.
Fuß
Zusammen mit <thead> und <tbody> gibt es <tfoot> zum Umschließen von Tabellenzeilen, die den Fußbereich der Tabelle angeben. Wie <thead> ist es am besten geeignet, semantisch anzuzeigen, dass es sich nicht um Datenzeilen, sondern um Zusatzinformationen handelt.
Noch vor HTML5 musste das <tfoot>-Element nach <thead> und vor <tbody> stehen! Man könnte meinen, es wäre das Letzte vor dem Ende von <table>, aber das war nicht der Fall. Jetzt in HTML5 ist es genau umgekehrt, es muss nach dem <tbody> kommen, wie man es wahrscheinlich erwarten würde.
Es kann zum Beispiel verwendet werden, um den Header bei einer visuell sehr hohen/langen Tabelle zu wiederholen, wo es einfacher sein kann, die Spaltentitel unten als oben zu sehen. Obwohl Sie es nicht unbedingt so verwenden müssen.
Die Zellen: td und th
Die einzelnen Zellen einer Tabelle sind immer eines von zwei Elementen: <td> oder <th>. Sie können alles in eine Tabellenzelle legen, was Sie möchten, aber dies sind die Elemente, die sie zu einer Tabellenzelle machen. <th>-Elemente sind „tabellarische Überschriften“ und <td>-Elemente sind „tabellarische Daten“.
Mit unserer bestehenden einfachen Demo sind die oberste Zeile alle Überschriften. Keine Daten, nur Titel für die Daten. Alle anderen Zeilen sind Daten. Also
<th>-Elemente sind nicht unbedingt auf die Verwendung innerhalb von <thead> beschränkt. Sie kennzeichnen lediglich Header-Informationen. Sie könnten also beispielsweise am Anfang einer Zeile im <tbody> verwendet werden, falls dies relevant wäre. Einen solchen Fall werden wir später behandeln.
Grundlegendes Styling
Die meisten Tabellen, die Sie jemals sehen werden, verwenden Farben und Linien, um verschiedene Teile der Tabelle zu unterscheiden. Rahmen sind sehr häufig. Standardmäßig sind alle Tabellenzellen um 2px voneinander entfernt (über das User-Agent-Stylesheet), so:
Beachten Sie den leichten zusätzlichen Abstand zwischen der ersten Zeile und dem Rest. Dies wird durch den standardmäßigen border-spacing verursacht, der auf <thead> und <tbody> angewendet wird und sie etwas auseinanderdrückt. Dies sind keine Margins, sie kollabieren nicht. Sie können diesen Abstand steuern wie folgt
table {
border-spacing: 0.5rem;
}
Aber viel häufiger ist es, diesen Abstand zu entfernen. Diese Eigenschaft wird komplett ignoriert und der Abstand wird aufgehoben, wenn Sie dies tun
table {
border-collapse: collapse;
}
Nur ein wenig Padding, Ränder und das Linksbündig-Ausrichten dieser <th>-Elemente reicht weit aus, um eine einfache, gestylte Tabelle zu erstellen
Zellen verbinden
Es gibt zwei wichtige Attribute, die für jedes Tabellenzellenelement (<th> oder <td>) verwendet werden können: colspan und rowspan. Sie akzeptieren jede positive Ganzzahl 2 oder größer. Wenn ein td einen colspan von 2 hat (d.h. <td colspan="2">), bleibt es eine einzelne Zelle, nimmt aber horizontal den Platz von zwei Zellen in einer Zeile ein. Dasselbe gilt für rowspan, aber vertikal.
Sie müssen ein bisschen Kopfrechnen betreiben, wenn Sie mit verbundenen Zellen arbeiten. Colspan ist ziemlich einfach. Jede Tabellenzelle ist "eins" wert, es sei denn, sie hat ein colspan-Attribut, dann ist sie so viele wert. Addieren Sie die Werte für jede Tabellenzelle in dieser Tabellenzeile, um den Endwert zu erhalten. Jede Zeile sollte genau diesen Wert haben, sonst erhalten Sie ein ungeschicktes Tabellenlayout, das kein Rechteck bildet (die längste Zeile ragt heraus).
Rowspan ist ähnlich, es ist nur etwas schwieriger und erfordert einen größeren gedanklichen Sprung, da Spalten nicht wie Zeilen gruppiert sind. Wenn ein Tabellenelement ein rowspan-Attribut hat, erstreckt es sich vertikal über zwei Zeilen. Das bedeutet, dass die Zeile darunter +1 zu ihrer Tabellenzellenanzahl erhält und eine Tabellenzelle weniger benötigt, um die Zeile zu vervollständigen.
Es kann schwierig sein, sich das im Kopf vorzustellen, aber wir sind Entwickler hier, wir schaffen das =).
Oft werden diese Attribute auf sehr einfache Weise verwendet, z. B. um einige verwandte Tabellenüberschriften zu verbinden
So breit wie nötig... Oder den Container füllen... Oder darüber hinaus
Das Tabellenelement selbst ist ungewöhnlich in seiner Breite. Es verhält sich wie ein Block-Level-Element (z.B. <div>), da jede Tabelle, wenn man eine nach der anderen platziert, in eine eigene Zeile umbricht. Aber die tatsächliche Breite der Tabelle ist nur so breit wie nötig.
Wenn die Textmenge in der breitesten Zeile der Tabelle nur 100px breit ist, wird die Tabelle 100px breit sein. Wenn die Textmenge (auf einer Zeile) breiter als der Container wäre, wird sie umbrochen.
Wenn Text jedoch nicht umbrochen werden soll (d.h. white-space: nowrap;), sprengt die Tabelle gerne den Container und wird breiter. Tabellenzellen werden ebenfalls nicht umbrochen, so dass die Tabelle auch breiter wird, wenn zu viele nicht hineinpassen.
Zweiachsige Tabellen
Manchmal ist es sinnvoll, wenn tabellarische Daten zwei Achsen haben. Wie eine Kreuzreferenzsituation. Eine Multiplikationstabelle ist ein Beispiel dafür
Ich würde in dieser Situation ein <thead> weglassen, obwohl diese erste Zeile komplett eine Überschrift ist. Sie ist nicht wichtiger als die vertikale Spalte der Überschriften, daher fühlt es sich seltsam an, diese oberste Zeile allein zu gruppieren. Erstellen Sie einfach eine Zeile mit allen <th> und jede nachfolgende Zeile mit der ersten Zelle nur als <th>.
Wann Tabellen verwendet werden sollten
Es ist ein guter Zeitpunkt, eine Pause einzulegen und das wann von Tabellen zu diskutieren. Vielleicht haben Sie den allgemeinen Rat gehört: Tabellen sind für tabellarische Daten (siehe den ersten Satz dieses Blogbeitrags). Der Test „Würde das in einer Tabellenkalkulation Sinn ergeben?“ ist normalerweise angemessen.
Welche Arten von Dingen sind in Tabellen angebracht? Hier sind einige: ein Plan-/Preis-/Funktionsvergleich, Bowling-Ergebnisse, ein internes Raster mit Mitarbeiterdaten, Finanzdaten, ein Kalender, das Nährwertinformationsfeld, ein Logikrätsellöser usw.
Manchmal hört man: Tabellen sind unsemantisch. Das stimmt nicht – sie kennzeichnen semantisch tabellarische Daten. Tabellen sind die richtige Wahl, wenn dies der Fall ist.
Wann Tabellen nicht verwendet werden sollten
Ein ungeeigneter Einsatz für Tabellen ist das Layout. Das mag kontraintuitiv erscheinen. Auf den ersten Blick könnte die Funktionsweise von Tabellen sie ideal für das Layout erscheinen lassen. Einfach zu steuern, extrem logisch, vorhersehbar und überhaupt nicht fragil.
Es gibt jedoch einige erhebliche Probleme bei der Verwendung von Tabellen für das Layout. Erstens bedeuten HTML-Tags etwas. Wie wir bereits besprochen haben, beschreiben Tabellenelemente semantisch tabellarische Daten. Sie für etwas anderes zu verwenden, ist ein Verstoß gegen die semantische Pflicht. Sie werden keine Geldstrafe per Post erhalten, aber Sie erhalten nicht so viel Wert aus Ihrem HTML, wie Sie könnten.
Über Semantik zu sprechen ist manchmal etwas schwierig (einige Lesetipps: 1, 2, 3, 4, 5), also sprechen wir über etwas, worüber wir uns alle im Allgemeinen einig sind (auch wenn wir nicht so gut darin sind, wie wir es gerne wären): Websites sollten barrierefrei sein. Ein Teil der Barrierefreiheit sind Screenreader. Screenreader lesen Tabellen von oben nach unten, von links nach rechts. Das bedeutet, dass die Reihenfolge, in der Ihre Website präsentiert wird, durch die Tabellenstruktur bestimmt wird, die wiederum durch visuelle Entscheidungen und nicht durch Barrierefreiheitsentscheidungen bestimmt wird. Ganz zu schweigen davon, dass ein Screenreader sogar den Beginn tabellarischer Daten ankündigen könnte, was schlimmer als nutzlos wäre.
Apropos Quelltextreihenfolge, das beeinflusst mehr als nur die Zugänglichkeit. Stellen Sie sich ein Layout mit einer "Sidebar links" vor. Eine Tabelle würde vorschreiben, dass diese Tabelle zuerst in der Quelltextreihenfolge steht, was zwar schlecht für die Zugänglichkeit ist, aber wahrscheinlich auch schlecht für SEO, da möglicherweise Ihr Nebeninhalte über den primären Inhalt gestellt werden.
Könnten Sie die SEO-Probleme beheben, indem Sie semantische Tags innerhalb der Tabellen-Tags verwenden? Vielleicht etwas, aber jetzt verwenden Sie doppelt so viel HTML. Wenn Sie wirklich die Layout-Fähigkeiten einer Tabelle benötigen, aber semantische Tags verwenden möchten, lesen Sie den nächsten Abschnitt. Wenn Sie irgendwie absolut darauf angewiesen sind, Tabellen-Tags für das Layout zu verwenden, verwenden Sie das ARIA role="presentation" auf der Tabelle, um dies anzuzeigen.
Während ich dies in der zweiten Hälfte des Jahres 2013 schreibe, sind Tabellen als Layout-Wahl weitaus weniger verbreitet und sogar ansprechend geworden. Wir sehen viel mehr den Einsatz von fester und absoluter Positionierung, die man innerhalb einer Tabelle nicht machen kann. Wir sehen Flexbox als großartig an und sind kurz vor dem Mainstream-Einsatz. Wir sehen, wie das Grid-Layout wächst. Wir sehen, wie Inline-Block wirkungsvoll eingesetzt wird. Wir sehen, wie die Fragilität von Floats in alten Zeiten verblasst.
Moderne Websites verwenden Tabellen selten für das Layout. Der letzte Rückzugsort sind HTML-E-Mails. Die Landschaft dessen, was E-Mails rendert, ist superweit. Es ist alles, womit wir im Web zu tun haben, plus die Welt der nativen Apps auf Mobil- und Desktop-Betriebssystemen, neuen und alten. Man kann progressive Verbesserungen für E-Mails vornehmen, aber das Layout selbst gilt immer noch als am sichersten in Tabellen erstellt. Das wird durch die Tatsache untermauert, dass die großen E-Mail-Dienste immer noch Vorlagen als Tabellen anbieten.
Semantische Elemente sich wie eine Tabelle verhalten lassen
CSS verfügt über Eigenschaften, um jedes gewünschte Element so zu verhalten, als wäre es ein Tabellenelement. Sie müssen sie im Wesentlichen wie eine Tabelle strukturieren, und es wird derselben Abhängigkeit von der Quellreihenfolge unterliegen wie eine Tabelle, aber Sie können es tun. Ich mache es auch nicht schlecht, es ist manchmal wirklich nützlich. Wenn dieser Layout-Stil ein Problem löst und keine negativen Reihenfolge-Auswirkungen hat, verwenden Sie ihn.
Verwenden Sie keine Inline-Stile, aber zum besseren Verständnis sehen Sie hier, wie das funktionieren würde
<section style="display: table;">
<header style="display: table-row;">
<div style="display: table-cell;"></div>
<div style="display: table-cell;"></div>
<div style="display: table-cell;"></div>
</header>
<div style="display: table-row;">
<div style="display: table-cell;"></div>
<div style="display: table-cell;"></div>
<div style="display: table-cell;"></div>
</div>
</section>
Ein praktischer Trick hier ist, dass Sie das table-row-Element nicht einmal benötigen, wenn Sie nicht möchten. Eine Reihe von display: table-cell;-Elementen, die Kinder eines display: table;-Elements sind, verhalten sich so, als wären sie alle in einer Zeile.
Sie ändern immer die Anzeigeeigenschaft des Elements, um das tabellenartige Verhalten zu erhalten. Hier sind die Werte
display: table /* <table> */
display: table-cell /* <td> */
display: table-row /* <tr> */
display: table-column /* <col> */
display: table-column-group /* <colgroup> */
display: table-footer-group /* <tfoot> */
display: table-header-group /* <thead> */
Beachten Sie, dass es keine <th>-Alternative gibt. Das hat nur semantischen Wert. Ansonsten verhält es sich genau wie ein <td>, daher ist es nicht nötig, es in CSS zu replizieren.
Es gibt auch display: inline-table;, was ziemlich interessant ist. Erinnern Sie sich, wir haben oben darüber gesprochen, wie seltsam die Breiten von Tabellenelementen sind. Sie sind nur so breit, wie sie sein müssen, brechen aber in neue Zeilen um. Es ist fast so, als wären es Inline-Block-Elemente, die zufällig umbrechen. Dies macht sie buchstäblich zu Inline-Block-Elementen, ohne den Zeilenumbruch.
Wenn Sie viel mehr über die Verwendung semantischer Elemente, aber auch über tabellenartiges Layout erfahren möchten, lesen Sie das Buch Everything You Know About CSS Is Wrong!

Ich war nie ein großer Fan dieses Titels, da er suggeriert, dass die Verwendung dieses tabellenartigen Layouts der richtige Weg ist und jede andere Layout-Technik, die Sie verwenden, der falsche Weg ist. Aber wie ich bereits sagte, kann dies ungeheuer nützlich sein, und ich bin froh, dass es in CSS enthalten ist. Seien Sie sich nur bewusst, dass egal welche Art von Elementen Sie verwenden, um ein tabellenbasiertes Layout zu erstellen, es immer noch denselben Problemen unterliegt (hauptsächlich der Abhängigkeit von der Quellreihenfolge).
Alle Tabellenbezogenen Elemente
Es gibt einige Elemente oben, die wir noch nicht behandelt haben. Werfen wir einen Blick auf alle HTML-Tabellen-bezogenen Elemente. Wissen Sie was, wir könnten genauso gut eine Tabelle verwenden, um das zu tun
| Element | Was es ist |
|---|---|
<table> | Die Tabelle selbst |
<caption> | Die Beschriftung für die Tabelle. Wie eine figcaption für eine Figur. |
<thead> | Der Tabellenkopf |
<tbody> | Der Tabellenkörper |
<tfoot> | Der Tabellenfuß |
<tr> | Eine Tabellenzeile |
<th> | Eine Tabellenzelle, die eine Überschrift ist |
<td> | Eine Tabellenzelle, die Daten enthält |
<col> | Eine Spalte (ein inhaltsloses Element) |
<colgroup> | Eine Spaltengruppe |
Alle Tabellenbezogenen Attribute
Es gibt überraschend wenige Attribute, die spezifisch für Tabellen sind. Natürlich können Sie Klasse und ID und alle typischen globalen Attribute verwenden. Früher gab es ziemlich viele, aber die meisten davon waren spezifisch für das Styling und daher veraltet (da dies die Aufgabe von CSS ist).
| Attribut | Element(e) gefunden auf | Was es bewirkt |
|---|---|---|
colspan | th, td | Erweitert eine Zelle, um so breit wie 2 oder mehr Zellen zu sein |
rowspan | th, td | Erweitert eine Zelle, um so hoch wie 2 oder mehr Zellen zu sein |
span | col | Sorgt dafür, dass die Spalte für 2 oder mehr Spalten gilt |
sortierbar | Tabelle | Zeigt an, dass die Tabelle das Sortieren ermöglichen sollte. UPDATE: Mir wurde gesagt, dass dies aufgrund mangelnder Implementierungen aus der Spezifikation entfernt wurde. |
headers | td | Leerzeichen-separierte Zeichenkette, die den IDs der für die Daten relevanten <th>-Elemente entspricht |
scope | th | row | col | rowgroup | colgroup (Standard) – spezifiziert im Wesentlichen die Achse der Überschrift. Standard ist, dass eine Überschrift eine Spalte überschreibt, was typisch ist, aber eine Zeile könnte auch mit einer Überschrift beginnen, wobei Sie diese Überschrift auf die Zeile oder Zeilengruppe beschränken würden. |
Veraltete Attribute
Verwenden Sie keine dieser Eigenschaften. Sie sind veraltet. Auch wenn sie heute in einigen Browsern funktionieren mögen, besteht die Möglichkeit, dass sie in Zukunft nicht mehr funktionieren.
| Veraltetes Attribut | Was stattdessen verwendet werden sollte |
|---|---|
| align | Verwenden Sie stattdessen die Eigenschaft float. |
| valign | Verwenden Sie stattdessen die Eigenschaft vertical-align. |
| char | Die richtige Antwort ist, text-align: "x"; zu verwenden, wobei x das Zeichen ist, an dem ausgerichtet werden soll, aber es ist noch nirgendwo implementiert. Dieses Attribut wird jedoch auch nicht unterstützt, also kein großer Verlust. |
| charoff | Siehe oben |
| bgcolor | Verwenden Sie stattdessen die Eigenschaft background. |
| abbr | „Erwägen Sie, den Zelleninhalt mit einem eigenständigen abgekürzten Inhalt zu beginnen oder den abgekürzten Inhalt als Zelleninhalt zu verwenden und den langen Inhalt als Beschreibung der Zelle zu verwenden, indem Sie ihn in das title-Attribut setzen.“ |
| axis | Verwenden Sie stattdessen das Attribut scope. |
| border | Verwenden Sie stattdessen die Eigenschaft border. |
| cellpadding | Verwenden Sie stattdessen die Eigenschaft padding. |
| cellspacing | Verwenden Sie stattdessen die Eigenschaft border-spacing. |
| frame | Verwenden Sie stattdessen die Eigenschaft border. |
| rules | Verwenden Sie stattdessen die Eigenschaft border. |
| summary | Verwenden Sie stattdessen das <caption>-Element. |
| width | Verwenden Sie stattdessen die Eigenschaft width. |
Der Tabellenstapel
Es gibt eine implizite vertikale Stapelung von Tabellenelementen, genau wie bei jedem HTML-Eltern- > Nachfahren-Szenario. Es ist wichtig, dies in Tabellen zu verstehen, da es besonders verlockend sein kann, Dinge wie Hintergründe auf die Tabelle selbst oder Tabellenzeilen anzuwenden, nur um dann festzustellen, dass der Hintergrund einer Tabellenzelle diesen "überschreibt" (er liegt eigentlich nur darüber).
So sieht das aus (mit der 3D-Funktion von Firefox in seinen Entwicklertools)

Wichtige Stilregeln für Tabellen
Die meisten CSS-Eigenschaften können auf Tabellenelemente angewendet werden. font-family funktioniert beispielsweise auf Tabellen genauso wie auf jedes andere Element. Und die Regeln der Kaskade gelten. Wenden Sie font-family auf die Tabelle an, aber eine andere font-family auf die Tabellenzelle, gewinnt die Tabellenzelle, da dies das tatsächliche Element mit dem Text darin ist.
Diese Eigenschaften sind entweder einzigartig für Tabellenelemente oder sie verhalten sich einzigartig auf Tabellenelementen.
| CSS-Eigenschaft | Mögliche Werte | Was es bewirkt |
|---|---|---|
| vertical-align | baseline sub super text-top text-bottom middle top bottom % length (Länge) | Richtet den Inhalt innerhalb einer Zelle aus. Funktioniert besonders gut in Tabellen, obwohl in diesem Kontext nur top/bottom/middle viel Sinn ergeben. |
| white-space | normal pre nowrap pre-wrap pre-line | Steuert, wie Text in einer Zelle umbrochen wird. Einige Daten müssen möglicherweise in einer einzigen Zeile stehen, um sinnvoll zu sein. |
| border-collapse | collapse separate | Wird auf die Tabelle angewendet, um zu bestimmen, ob Ränder in sich selbst kollabieren (ähnlich wie Margin-Kollaps, nur bidirektional) oder nicht. Was ist, wenn zwei ineinander kollabierende Ränder widersprüchliche Stile (z. B. Farbe) haben? Die auf diese Elementtypen angewendeten Stile "gewinnen" in der Reihenfolge ihrer "Stärke": Zelle, Zeile, Zeilengruppe, Spalte, Spaltengruppe, Tabelle. |
| border-spacing | length (Länge) | Wenn border-collapse auf separate gesetzt ist, können Sie angeben, wie weit Zellen voneinander entfernt sein sollen. Moderne Version des cellspacing-Attributs. Und apropos, padding ist die moderne Version des cellpadding-Attributs. |
| width | length (Länge) | Width funktioniert bei Tabellenzellen ungefähr so, wie Sie es erwarten würden, außer wenn es eine Art Konflikt gibt. Wenn Sie zum Beispiel der Tabelle selbst eine Breite von 400px geben und der ersten Zelle einer dreizelligen Zeile eine Breite von 100px zuweisen und die anderen in Ruhe lassen, ist die erste Zelle 100px breit und die anderen beiden teilen sich den restlichen Platz auf. Wenn Sie jedoch allen dreien eine Breite von 10000px geben, bleibt die Tabelle 400px breit und gibt jedem von ihnen ein Drittel des Platzes. Dies setzt voraus, dass white-space oder Elemente wie ein Bild nicht ins Spiel kommen. Dies ist wahrscheinlich ein eigener Beitrag! |
| border | length (Länge) | Border funktioniert auf jedem der Tabellenelemente und so, wie Sie es erwarten würden. Die Eigenheiten treten auf, wenn Sie die Ränder kollabieren. In diesem Fall haben alle Tabellenzellen nur eine Randbreite zwischen sich, anstatt der zwei, die Sie erwarten würden (border-right an der ersten Zelle und border-left an der nächsten Zelle). Um einen Rand in einer kollabierten Umgebung zu entfernen, müssen beide Zellen "zustimmen", ihn zu entfernen. Wie td:nth-child(2) { border-right: 0; } td:nth-child(3) { border-left: 0; } Andernfalls gewinnt die Quellreihenfolge/Spezifität, welcher Rand an welcher Kante angezeigt wird. |
| table-layout | auto fixed | auto ist der Standardwert. Die Breite der Tabelle und ihrer Zellen hängt vom Inhalt ab. Wenn Sie dies auf fixed ändern, werden die Breiten der Tabelle und der Spalten durch die Breiten der Tabellen- und Spaltenelemente oder durch die Breite der ersten Zeile der Zellen festgelegt. Zellen in nachfolgenden Zeilen beeinflussen die Spaltenbreiten nicht, was das Rendern beschleunigen kann. Wenn der Inhalt in nachfolgenden Zellen nicht passt, bestimmt die overflow-Eigenschaft, was passiert. |
Diese Liste ist nicht erschöpfend. Es gibt andere CSS-Eigenheiten, die für Tabellen relevant sind. Sie können beispielsweise eine Tabellenzelle nicht relativ positionieren, um sie entweder zu verschieben oder Dinge absolut darin zu positionieren. Es gibt jedoch Wege.
Wenn Ihnen weitere CSS-Eigenheiten bei Tabellen einfallen, teilen Sie diese bitte in den Kommentaren unten mit.
Standardstile / User-Agent-Stylesheet
WebKit macht das hier
table {
display: table;
border-collapse: separate;
border-spacing: 2px;
border-color: gray
}
thead {
display: table-header-group;
vertical-align: middle;
border-color: inherit
}
tbody {
display: table-row-group;
vertical-align: middle;
border-color: inherit
}
tfoot {
display: table-footer-group;
vertical-align: middle;
border-color: inherit
}
table > tr {
vertical-align: middle;
}
col {
display: table-column
}
colgroup {
display: table-column-group
}
tr {
display: table-row;
vertical-align: inherit;
border-color: inherit
}
td, th {
display: table-cell;
vertical-align: inherit
}
th {
font-weight: bold
}
caption {
display: table-caption;
text-align: -webkit-center
}
Ich habe auch jedes Element in den Chrome Dev Tools inspiziert, die jetzt auf Blink basieren, und es ist immer noch dasselbe.
Es ist jedoch lustig. Sicherlich ist der Text in <th>-Elementen standardmäßig zentriert (text-align: center;). Aber das steht nicht im UA-Stylesheet. Keine große Sache, aber eher mysteriös und lässt einen fragen, welche anderen mysteriösen Dinge beim Rendering passieren.
Das UA-Stylesheet für Tabellen unterscheidet sich von Browser zu Browser. Zum Beispiel haben Tabellenzellen in Firefox (hier ist 3.6s UA Stylesheet, aber das gilt auch in v23) dies
td {
display: table-cell;
vertical-align: inherit;
text-align: inherit;
padding: 1px;
}
Am auffälligsten ist der 1px-Abstand, den WebKit nicht hat. In den meisten Fällen ist das sicherlich keine große Sache, aber es ist anders. Darum geht es bei CSS-Resets (und verwandten Projekten): die Unterschiede zu beseitigen. Also schauen wir uns das mal an.
Standard-Tabellenstile zurücksetzen
Der weltweit beliebteste CSS-Reset, der Meyer Reset, macht dies mit Tabellen
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
Es wird auf die gleiche Weise im HTML5 Reset und im HTML5 (Doctor) Reset Stylesheet gemacht.
Es gibt jedoch eine Alternative zu CSS-Resets: Normalize.css. Die Philosophie ist etwas anders. Anstatt alle Stile auf Null zu setzen, werden bekanntermaßen inkonsistente Stile explizit auf einen vernünftigen Standardwert gesetzt. Mein allgemeiner Rat zur Verwendung von Normalize.css lautet: Entfernen Sie nichts daraus. Wenn es darin enthalten ist, muss es zur Konsistenz dienen. Aber fühlen Sie sich frei, alles darin zu ändern.
Normalize macht das nur für Tabellen
table {
border-collapse: collapse;
border-spacing: 0;
}
Ich muss mich hier etwas tiefer in die Begründung einarbeiten, denn es scheint ungewöhnlich...
- Ich bin ein Fan von
border-collapse: collapse, weil der Abstand zwischen den Zellen normalerweise sehr unangenehm ist, aber der Standard in jedem mir bekannten Browser istborder-collapse: separate;, so dass keine Normalisierung erforderlich ist. - Wenn
border-collapseaufcollapsegesetzt ist, spieltborder-spacingkeine Rolle. - Tabellenzellen-Elemente müssen normalisiert werden (z.B. Firefox Padding-Unterschied), aber das ist nicht vorhanden.
Keine riesige Sache.
Das ist die Art von Sache, die ich wahrscheinlich normalerweise tun würde
table {
border-collapse: collapse;
width: 100%;
}
th, td {
padding: 0.25rem;
text-align: left;
border: 1px solid #ccc;
}
„Implizite“ Elemente und nicht geschlossene Tags
Schau dir dieses ziemlich umständliche Stück HTML an
<table>
<col>
<tr>
<td>Cell
</table>
Das mag seltsam aussehen, aber es ist gültig. Was passiert hier?
- Der
<col>-Tag ist einfach eines dieser inhaltslosen Elemente, das nie einen schließenden Tag benötigt. Wie<br>/<br /> - Das
<td>-Element muss unter bestimmten Umständen nicht geschlossen werden: „Der End-Tag darf weggelassen werden, wenn ihm unmittelbar ein<th>- oder<td>-Element folgt oder wenn in seinem Elternelement keine weiteren Daten vorhanden sind.“ - Das fehlende schließende
</tr>-Tag ist die gleiche Geschichte: „Das End-Tag darf weggelassen werden, wenn dem<tr>-Element unmittelbar ein<tr>-Element folgt oder wenn das übergeordnete Tabellengruppen-Element (<thead>,<tbody>oder<tfoot>) keinen weiteren Inhalt hat.“
Wenn wir die gerenderte Tabelle im Browser inspizieren, können wir sehen, dass die Tags, denen ihre schließenden Tags fehlten, mit schließenden Tags angezeigt werden. Diese werden automatisch für uns hinzugefügt. Aber es gibt auch einige brandneue Elemente darin

Eine Sache, die man beachten sollte, ist, dass das <col> automatisch in ein <colgroup> eingeschlossen wird. Selbst wenn wir dies tun würden
<table>
<col>
<colgroup>
<col>
</colgroup>
<tr>
<td>Cell
<td>Cell
</table>
Dann
colgroup:first-child {
background: red;
}
Man würde denken, die zweite Zelle wäre rot, nicht die erste, weil die "erste" Colgroup nur die zweite Zelle betrifft. Aber beim Rendern werden beide Spalten in eine Colgroup eingeschlossen, so dass der CSS-Selektor die erste auswählt.
Das <tbody>-Element ist ebenfalls impliziert. Wenn Sie keine von tbody, thead oder tfoot verwenden, wird das gesamte Innere der Tabelle in tbody eingeschlossen. Wenn Sie ein thead verwenden, wird die gesamte Tabelle darin eingeschlossen, bis ein tbody gefunden wird, dann wird das thead automatisch geschlossen, wenn Sie es nicht tun, und der Rest in tbody eingeschlossen (ebenfalls optional zu schließen). Wenn ein tfoot gefunden wird, können Sie sich vorstellen, was passiert (obwohl Sie sich erinnern sollten, dass tfoot vor tbody kommen sollte).
Sie können diese Elemente tatsächlich in CSS-Selektoren verwenden, obwohl Sie sie nicht in Ihrem tatsächlichen HTML platziert haben. Ich würde es wahrscheinlich nicht empfehlen, einfach weil das seltsam und verwirrend ist und das Styling von Tag-Selektoren ohnehin meist nicht ratsam ist.
Eine Tabelle zu keiner Tabelle machen
Es kann eines Tages eine Situation eintreten, in der Sie ein Tabellenelement zwingen müssen, sein tabellenartiges Layout-Verhalten nicht zu zeigen und sich eher wie ein reguläres Element zu verhalten.
Der Trick besteht im Wesentlichen darin, die Anzeigeeigenschaft der Tabellenzellen zurückzusetzen
th, td {
display: inline;
}
Wir können eine Tabelle ziemlich schnell ent-tabellisieren
Nur um sicherzugehen, würde ich das Ganze zurücksetzen. Ich fühle mich einfach besser, wenn ich weiß, dass die Elternelemente auch mitmachen und nicht verrückt spielen.
table, thead, tbody, tfoot, tr, td, th, caption {
display: block;
}
Dies ist hauptsächlich im responsiven Design nützlich, wo das traditionelle Tabellenlayout auf großen Bildschirmen Sinn ergibt, aber auf kleineren Bildschirmen erhebliche Änderungen erfordert, um sinnvoll zu sein. Dazu gibt es unten einen ganzen Abschnitt.
Tabellen-Barrierefreiheit
Wir haben bereits über die Probleme bei der Verwendung von Tabellen für Layout und Barrierefreiheit gesprochen. Aber vorausgesetzt, Tabellen werden korrekt für tabellarische Daten verwendet, gibt es immer noch einige Bedenken hinsichtlich der Barrierefreiheit.
Es gibt einige großartige Artikel dazu da draußen
- WebAIM: Barrierefreie Tabellen erstellen
- Portland Community College: Beispiele für gutes und schlechtes Tabellenlayout für Screenreader
- Web Usability: Barrierefreie Datentabellen
Zebra-Tabellen
Wenn Sie keine Hintergrundfarbe auf die Tabellenzellen-Elemente setzen, können Sie sie auf die Tabellenzeilen selbst setzen. Am einfachsten können Sie also Folgendes tun
tbody tr:nth-child(odd) {
background: #eee;
}
Wir verwenden den tbody im Selektor, da es unwahrscheinlich ist, dass Sie Header- und Footer-Zeilen gestreift haben möchten. Setzen Sie auch die geraden Zeilen, wenn Sie spezifisch sein möchten, anstatt das durchscheinen zu lassen, was darunter liegt.
Wenn Sie Browser unterstützen müssen, die :nth-child() nicht verstehen (ziemlich alt), können Sie jQuery dafür verwenden.
Studien scheinen zu zeigen, dass Zebra-Striping im Allgemeinen eine gute Idee ist.
Hervorheben von Zeilen und Spalten
Das Hervorheben einer bestimmten Zeile ist ziemlich einfach. Sie könnten einer Zeile speziell dafür einen Klassennamen hinzufügen
<tr class="highlight">
...
</tr>
Das Hervorheben einer Spalte ist etwas kniffliger. Eine Möglichkeit ist die Verwendung des <col>-Elements, das uns erlaubt, Stile für Zellen festzulegen, die in dieser Spalte erscheinen. Es ist seltsam, sich das vorzustellen, denn die Zellen, die von <col> betroffen sind, sind eigentlich keine Nachkommen davon. Der Browser weiß einfach irgendwie, was Sie meinen.
Eine Tabelle mit vier Spalten in jeder Zeile hätte vier <col>-Elemente
<table>
<col>
<col>
<col>
<col>
<thead>
...
</table>
Dann könnten Sie eine bestimmte hervorheben, wie z.B.
col:nth-child(3) {
background: yellow;
}
Dies ist jedoch selten nützlich. Wenn Sie den Hintergrund eines Zeilenelements oder Tabellenzellenelements festlegen, übertrifft dieser immer den Hintergrund eines Spaltenelements. Unabhängig von der Spezifität.
Es ist wahrscheinlich besser, jedem einzelnen Tabellenzellenelement einen Klassennamen zu geben, der zufällig mit der Spaltenposition in der Zeile übereinstimmt. Wie z.B.
td:nth-child(2),
th:nth-child(2){
background: yellow;
}
Hervorheben von Spalte/Zeile/Zelle beim Hover
Zellenhervorhebung ist sehr einfach. Sie können es direkt in CSS tun
td:hover { /* th:hover also if you wish */
background: yellow;
}
Zeilenhervorhebung ist genauso einfach. Sie können den Hintergrund für Tabellenzeilen festlegen, und er wird angezeigt, solange Sie keinen Hintergrund für die Tabellenzellen festlegen.
tbody tr:hover {
background: yellow;
}
Wenn Sie einen Hintergrund für die Tabellenzellen festlegen, können Sie immer einfach tr:hover td, tr:hover th { } verwenden, was immer noch ziemlich einfach ist.
Spaltenhervorhebung ist schwieriger. Sie können col:hover nicht verwenden, da diese Spalten keine tatsächlichen Elemente sind, die Pixelplatz auf dem Bildschirm einnehmen, über die Sie schweben könnten. Die einzige Option ist JavaScript.
Ich habe es hier in Vanilla JavaScript geschrieben, nur zum Spaß
Es funktioniert so
- Sammeln Sie alle Zellen
- Verknüpfen Sie ein mouseover- und mouseout-Ereignis mit all diesen Zellen
- Wenn das mouseover-Ereignis ausgelöst wird, ermitteln Sie die Position der Zelle in der Zeile.
- Durchlaufen Sie alle Zeilen und fügen Sie jeder Zelle in dieser Zeile, die dieser Position entspricht, eine Hervorhebungsklasse hinzu.
- Wenn das mouseout-Ereignis ausgelöst wird, entfernen Sie die Hervorhebungsklasse von allen Zellen.
Und hier habe ich sowohl Zeilen- als auch Spaltenhervorhebung kombiniert. Ich habe jQuery verwendet, um alles auf 12 Zeilen Code zu bringen (das reine JavaScript war ziemlich anstrengend).
Es ist dasselbe Konzept, es ist nur viel einfacher, Elementkollektionen zu erstellen und nach Indizes in jQuery zu suchen und auszuwählen.
Schön gestaltete Tabellen
Etwas Tiefe, visuell unterschiedliche Header und ein Terminal, das dem Header entspricht.
Wenn die Tabelle im Hover-Zustand ist, bleiben nur die hervorgehobenen Zeilen mit dunklem Text, die anderen verblassen. Beachten Sie auch hier: Die abgerundeten Ecken der Tabelle selbst sind nur möglich, wenn Sie border-collapse: separate; haben.
Hier ist noch eine, bei der die nicht überfahrenen Zeilen buchstäblich verschwimmen
Twitter Bootstrap hat ein sehr minimalistisches Tabellen-Styling
Dieser hat als Bonus sogar Tastatursteuerung!
Ich versuche, eine Sammlung gut gestalteter Tabellen als Referenz zu führen. Wenn Sie also welche haben, lassen Sie es mich wissen. Hong Kiat hat auch eine Blogpost-Sammlung.
Tabellensuche
Wo das Sortieren von Tabellen recht kompliziert sein kann, kann die Tabellensuche recht einfach sein. Fügen Sie ein Suchfeld hinzu, und wenn der Wert darin Text irgendwo in einer Zeile übereinstimmt, zeigen Sie diese an und blenden Sie die anderen aus. Mit jQuery könnte das so einfach sein wie
var allRows = $("tr");
$("input#search").on("keydown keyup", function() {
allRows.hide();
$("tr:contains('" + $(this).val() + "')").show();
});
Hier ist eine Version mit RegExp stattdessen
Und hier ist eine in reinem JavaScript
Tabellen können in flüssigen/responsiven Designs schwierig sein
Ich habe in der Vergangenheit darüber geschrieben, und ich denke, diese Grafik fasst die Erfahrung einer Datentabelle auf einem kleinen Bildschirm ziemlich gut zusammen

Ich habe letztendlich eine Zusammenfassung erstellt, sobald eine Vielzahl interessanter Lösungen auftauchte.
Ganz schnell aber
- Zeilen in Blöcke umwandeln (1) (2)
- FooTable – jQuery-Plugin, das Zeilen ausblendet und diese Daten über ein Toggle-Symbol verfügbar macht.
- Daten in Diagramm umwandeln
- Spalten ausblenden, um Platz zu sparen, und dem Benutzer erlauben, sie wieder einzublenden.
- Zellen quetschen und umbrechen lassen (toter Link :()
- Kopfzeile fixieren und den Inhalt scrollen lassen (1) (2) (3)
Hier sind ein paar gestylte Live-Demos mit verschiedenen Ansätzen
Tabellen mit fester Kopfzeile
Das ist noch etwas, worüber ich in der Vergangenheit geschrieben und auch einen kleinen Screencast gemacht habe. Die sind zwar ziemlich alt, aber die Demo funktioniert immer noch.
Die modernste Art, feste Header zu handhaben, ist position: sticky; Hier ist ein Artikel dazu. Ich bin ehrlich gesagt nicht ganz sicher, wie es am besten mit Tabellen verwendet werden sollte. Es funktioniert unter normalen Umständen nicht auf <thead>. Das macht irgendwie Sinn, weil man Tabelleninhalte nicht absolut positionieren kann. Aber es funktioniert auf <th>. Jedenfalls, wenn jemand das herausfinden will, wäre das ein gutes Update für diesen Artikel (oder so etwas).
Hier ist eine Live-Demo eines jQuery-Plugins, das den Trick macht. Ich würde heutzutage wahrscheinlich so etwas wählen, bis sich "sticky" mehr durchsetzt.
Verwendung von Emmet zur Erstellung von Tabellen-Markup
Emmet ist aus vielen Gründen ein großartiges Werkzeug. Einer davon ist das Schreiben von HTML-Abkürzungen und deren Erweiterung zu echtem HTML. Da Tabellen so repetitiv und ausführlich sind, ist Emmet perfekt dafür. Emmet funktioniert auch auf CodePen =)
Einfache vier Zeilen und vier Spalten
table>tr*4>td*4
Fünf Zeilen mit dem Header auf der linken Seite
table>tr*5>th+td*4
Eine Zeile mit Headern oben
table>tr>th*5^tr*3>td*5
Mitarbeiter mit fortlaufenden IDs
table>tr>th{Name}+th{ID}+th{Favorite Color}^tr*3>td{Name}+td{$$$$$}+td{Blue}
Tabelle mit Kopf-, Fuß- und Inhaltsbereich
table>thead>tr>th*5^^tfoot>tr>th*5^^tbody>tr*10>th+td*4
Dasselbe, aber mit Zellinhalt in jeder Zelle
table>thead>tr>th{Header Cell}*5^^tfoot>tr>th{Footer Cell}*5^^tbody>tr*10>th{Row Header}+td{Cell Data}*4
JavaScript generierte Tabellen
JavaScript bietet einige sehr spezifische Methoden für den Umgang mit Tabellen über die HTMLTableElement-API. Louis Lazaris hat kürzlich etwas darüber geschrieben. Sie können es verwenden, um Tabellen mit JavaScript zu erstellen, auf Unterelemente zuzugreifen und Eigenschaften auf sehr spezifische Weise zu ändern. Hier ist die MDN-Seite mit den Details.
Hier ist das in Aktion
Tabellensortierung
Stellen Sie sich eine Tabelle mit zwei Spalten vor. Eine für Mitarbeiter-IDs und eine andere für die E-Mail-Adresse des Mitarbeiters. Für jede Spalte gibt es Überschriften. Es wäre praktisch, auf diese Überschriften klicken zu können und die Tabelle nach den darin enthaltenen Daten zu sortieren. Zum Beispiel numerisch, abwechselnd auf- und absteigend für die IDs und alphabetisch für die E-Mail-Adressen. Darum geht es bei der Tabellensortierung. Die Daten nützlicher machen.
Dies ist ein so häufiger und allgemeiner Bedarf, dass es tatsächlich eine Spezifikation dafür gibt. Legen Sie einfach das sortable-Attribut für die Tabelle fest, und sie wird dies automatisch tun, solange Sie ein paar in der Spezifikation festgelegte Regeln befolgen.
Update Juni 2019: Link entfernt, da er sortierbar nicht mehr erwähnt. Scheint derzeit eine tote Spezifikation zu sein.
Zum Zeitpunkt des Verfassens dieses Artikels kenne ich keine Browser, die die Tabellensortierung nativ unterstützen. Aber es gibt viele Drittanbieteroptionen!
- tablesorter – jQuery-basiertes „Flexibles clientseitiges Tabellensortieren“
- sorttable – reines JavaScript
- tablesort – „eine kleine & einfache Sortierkomponente für Tabellen. Geschrieben in Javascript und ohne Abhängigkeiten“
Was ist mit Tabellensortierskripten und Kleinbuchstaben? Wie auch immer, hier ist eine Demo von tablesorter
Wenn diese Ihnen nicht genügen, hat Codrops 33 verschiedene Tabellensortierskripte zusammengetragen, es gibt also reichlich Auswahl.
Und das sind alles JavaScript-Lösungen. Es ist sicherlich möglich, Daten im Backend zu sortieren und die Tabelle bereits sortiert in HTML anzuzeigen. Dies könnte im Falle von paginierten Tabellen erforderlich sein, bei denen nicht alle Daten direkt im DOM verfügbar sind.
<tfoot>kommt vor<tbody>, damit 'User-Agents den Footer vor den zahlreichen Datenzeilen rendern können', gemäß der Spezifikation über http://stackoverflow.com/a/5574112/1119655Uups. Zu früh gefreut. Ich glaube, der andere Grund ist der Druck von Tabellen. Wenn der
<tfoot>vor allen Daten steht, kann der Browser ihn verwenden, um den Tabellenfuß zu rendern, wenn die Tabelle durch einen Seitenumbruch getrennt wird. Wenn der<tfoot>zuletzt kommt, kann der Browser nicht voraussehen, ob der<tfoot>überhaupt verwendet wird.Als Antwort auf Ihren zweiten Kommentar: Ja, beim Drucken einer sehr langen Tabelle mit Informationen aus
tfoot, die auf jeder Seite wiederholt und gedruckt werden, könnte es 50 Seiten und Tonnen vontbody-Code erfordern, um gedruckt und analysiert zu werden (auf einem Pentium- oder 68040-Prozessor mit wenigen MB RAM in den Neunzigern).Die möglichst frühzeitige Bereitstellung aller zu wiederholenden Informationen ermöglicht es den Benutzeragenten, die erste Seite zu drucken, bevor die restlichen 49 Seiten verarbeitet wurden…
Danke! Der beste Artikel über Tabellen!
Das ist seltsam, das bringt mein Dreamweaver zum Absturz! Verwenden Sie die neue CS6 oder die älteren Versionen? Ich glaube, ich brauche ein [Tag] direkt vor dem Schließen von [Tag].
Ja, das stimmt.
Schöner Tabellenüberblick, aber Sie haben vergessen, table-layout: auto und fixed zu erwähnen, wobei auto der Standard ist, der Zellen schön erweitern lässt, jedoch werden Sie gelegentlich feste Spaltenbreiten benötigen, und sobald Sie in die Welt von table-layout: fixed eintreten, müssen Sie explizite Breiten für jede Zelle oder Spalte festlegen, was schnell zu einer Plage werden kann.
Guter Artikel darüber, wie vielseitig man mit CSS sein und Tabellen schön gestalten kann.
Wunderbarer Artikel, wie immer. Eine Frage zur Semantik jedoch. Auf Seiten wie The Verge gibt es normalerweise Artikelraster, die in einem sehr tabellenartigen Stil angelegt sind. Während Sie sagen, dass Tabellen nur für tabellarische Daten verwendet werden sollten, behaupte ich, dass ein solches Layout tatsächlich tabellarische Daten sind. Die Konvention erscheint selten außerhalb von Blog-Startseiten, aber sie erfüllt tatsächlich die ursprüngliche Funktion einer Tabelle: Werte visuell organisiert darzustellen.
Mein einziger Grund, Tabellen auf diese Weise zu verwenden, wäre die row/columnspan-Funktionalität, angesichts der diskutierbaren Semantik. Gibt es eine einfache Möglichkeit, dies ohne Tabellen zu duplizieren?
Man könnte
display:table, table-row, table-cell, Flexbox, absolute Positionierung verwenden, wie The Verge es tut, oder man könnte es sogar mit Floats tricksen. Jede Methode hat ihre eigenen Vor- und Nachteile. Wenn Sie es mit Tabellen-Markup tun würden, würden Sie auf Schwierigkeiten stoßen, es responsiv zu gestalten und in weniger Spalten zusammenzufassen.Ich würde sagen, eine Gruppe von Artikeln ist definitiv keine tabellarischen Daten. Das ist ein guter Kandidat für die Verwendung von
display: tableund seinen Begleitern, um ein tabellenähnliches Layout zu replizieren, ohne tatsächliche Tabellen verwenden zu müssen.Es sind wirklich keine tabellarischen Daten. Das Rasterlayout ist eine stilistische Wahl und kann als tabellenartiges Raster, als einzelne Spalte oder um einen einzelnen Fokus herum angeordnet gelesen werden.
Wenn Sie ein tabellarisches Aussehen replizieren möchten, das reiner Stil ist, verwenden Sie Stile.
Das ist tiefgründig! Der beste Artikel, den ich dazu gesehen habe.
Ich stimme zu
Genau. Ziemlich detailliert. Dies sollte von der HTML5Doctors-Diagnose für <table> verlinkt werden. Vielen Dank, Chris, dass Sie die Verwendung von Tabellenstilen für Nicht-Tabellenelemente validieren. Hört auf, euch über Tabellenstile zu beschweren, Leute. Sie erfüllen einen sehr guten und einzigartigen Zweck.
Auch einverstanden!
Ausgezeichneter Artikel, den ich als Referenz für zukünftige Arbeiten speichere.
Vielen Dank!
Vielen Dank für den schönen und umfassenden Bericht!
Leider war es IE9 egal, wie Sie eine Tabelle mit CSS dekonstruieren möchten, wie z.B.
table, thead, tbody, tfood, tr, td, th, caption { display: block }Soweit ich weiß, funktioniert es überall sonst, aber nicht in IE9… Nun, überall sonst, solange Sie
tbody { display: block }einschließen, auch wenn Sie keintbody-Element in Ihrem Code haben! Browser fügen ein Schatten-tbodyhinzu, und es wird standardmäßig wie jedes tbody gestylt.Safari 6 und Gesamtbreite einer Tabelle
Browser passen sich vielen Dingen an, wenn es um Tabellen geht, sowohl mit dem Rendering-Algorithmus
table-layout: fixedals auch mit dem Algorithmustable-layout: auto: widersprüchliche Breitenwerte oder sogar fehlende Zellen in einigen Zeilen (ziemlich erstaunlich meiner Meinung nach)!Die meisten Browser erlauben es Ihnen, Breiten für jede Kopfzelle im Header (
thead > tr > th) und eine Breite für die Elterntabelle festzulegen, die nicht gleich der Gesamtbreite ihrer Spalten ist. Zusammen mittable-layout: fixedwerden die Breiten der einzelnen Spalten auf eine vernünftige Weise angepasst.Stellen Sie jedoch sicher, dies auf Safari 6 zu testen, da dieser sich nicht wie andere verhält und möglicherweise größere Tabellen rendert, als Sie nach Tests in Fx, Chr und E6-10 erwarten würden. Sie benötigen einen Mac oder einen Testdienst, da Safari 6 nur auf OS X vorhanden ist.
Kurz gesagt
Ich stimme zu.
Entschuldigung für die Unannehmlichkeiten! Ich schätze Ihre durchdachte Kritik.
@Chris Coyier es ist eigentlich ein großartiger Artikel. Nur ein kleiner Scherz mit einem Kollegen.
Ich habe diesen Artikel mit einem Lesezeichen versehen und werde ihn wohl jahrelang als Referenz nutzen :) Übrigens habe ich einen Tippfehler gefunden: Ich denke, Sie meinen "tfoot" und nicht "tfood"
Anmerkung des Herausgebers: Danke für den Tippfehler. Ich bin buchstäblich direkt nach diesem Abschnitt zum Mittagessen aufgestanden.
Nicht dass es wirklich wichtig wäre, aber mein Kommentar hatte meine alte Blog-URL. Die neue ist: http://boilingplastic.com/
Wirklich interessanter Artikel, vielen Dank fürs Schreiben, Chris. Ich wollte Sie nur darauf hinweisen, dass es unter 'Using Emmet for Creating Table Markup' einen kleinen Tippfehler gibt, wo 'perfect' als 'prefect' geschrieben ist.
Verdammt! Muss wohl den "Hitchhiker’s Guide" gelesen haben. #OBSKURERER VERWEIS
Gerade als ich an einer langen 20-30-Spalten-Tabelle arbeiten wollte (fragen Sie nicht, der Gedanke daran bereitet mir Sodbrennen), kommt dieser Artikel. Was ist los mit diesen großartigen Artikeln, die immer genau dann erscheinen, wenn ich sie brauche!
Vielen Dank!
Großartiger Artikel! Ich werde ihn auf jeden Fall als Lesezeichen speichern. Danke für die klare und umfassende Behandlung.
Als ich bei Schwab war, mussten wir E-Mail-Kampagnen mit Tabellen codieren, und es wurde nur das grundlegendste CSS verwendet; font-family, font-size und color. Alles andere war reines HTML, da wir die Anzahl der Geräte, E-Mail-Clients und browserbasierten E-Mail-Reader berücksichtigen mussten (sogar Lotus Notes!). Wir sind auf die alte Schule gegangen und haben eine Menge über Tabellen gelernt, und das Wichtigste betrifft die Breite. Es wurde oben erwähnt, aber der beste Weg, um sicherzustellen, dass Ihre Tabelle für die Welt felsenfest ist; nicht nur für die etwa 30%, die unter 30 sind(!), ist die Verwendung einer Kontrollzeile... eine Zeile, und es kann die erste mit Daten sein, aber wo die Breiten der Zellen definiert sind, und das ist alles, was Sie brauchen. Sie müssen nicht überall Breiten definieren; nur eine Zeile, deren Zellen sich zur Breite der Tabelle addieren. Bald wird es großartig sein, sich mit "100%" abzufinden, aber im Moment, wenn Sie wirklich ein Publikum von mindestens 1 Million oder so erreichen, dann wird eine definierte Zeile alles sein, was man braucht, um zu debuggen, warum in Outlook 2007 in IE 7 eine Tabelle kaputt geht, wenn sie selbst auf einem Blackberry nicht kaputt geht!
Großartiger Artikel, wie immer, Chris! Wenn Sie Beispiele für super komplizierte Tabellen posten möchten, schauen Sie sich unsere Abonnententabelle an, die wir in den letzten Releases bei MailChimp verfeinert haben.
Ich versuche, einen Screenshot zu finden, aber ich kann keinen von unserer Liste machen, ohne Ihnen die E-Mails unserer Abonnenten zu zeigen :( Ich werde ein Video machen, um die Interaktion zu zeigen.
Es verfügt über einen schwebenden Header, um Benutzern das Sortieren jederzeit zu ermöglichen, und hat auch eine feste erste Spalte (die E-Mail-Spalte), damit der Benutzer immer den Kontext dessen hat, was er sich ansieht. Diese Tabelle kann für einige Benutzer so groß und unübersichtlich werden, dass wir sie wirklich gut funktionieren lassen wollten.
Um den schwebenden Header + das horizontale Überlauf-Scrolling richtig zum Laufen zu bringen, haben wir im Wesentlichen den Tabellen-Thead geklont, und damit der geklonte Tabellen-Header gleichzeitig mit dem Body scrollt, mussten wir einige JS-Listener einrichten, um den scrollLeft-Wert des neuen Theads basierend auf dem Tabellen-Body-Wert zu aktualisieren.
Wir arbeiten noch an der besten Lösung, um es auf kleinen Bildschirmen zum Laufen zu bringen, sind aber noch nicht ganz so weit.
Viele super verrückte Sachen, aber es hat viel Spaß gemacht, daran zu arbeiten!
Ohne Zweifel... der beste Artikel über Tabellen, den ich je gelesen habe... Punkt.... Einfach großartig.... Danke, dass Sie sich die Zeit genommen haben, einen so erstaunlichen Blog-Post zu schreiben... Ich bin sicher, dies wird für viele Menschen für eine ganze Weile Referenzmaterial sein...
Hey Chris, vielen Dank für den wunderbaren Artikel über Tabellen, jetzt weiß ich alles über Tabellen... danke Chris für den Beitrag....>!
Wow (Lesezeichen gesetzt)! Dies muss einer der ausführlichsten Berichte über Tabellen in einem einzigen Beitrag sein. Gut gemacht.
Zwei zusätzliche Verhaltensweisen, die zu berücksichtigen sind
1) AP/RP wird browserübergreifend nicht berücksichtigt (FF ignoriert AR/RP); Ein Grund, warum die Verwendung von CSS-Tabellen für das Layout immer noch "unvollkommen" ist
2) Margins auf einem table/display:table-Element funktionieren ähnlich wie Floats (und funktionieren natürlich überhaupt nicht auf TD, TH, TR, etc.)
ups.. Ich habe den Teil über AP gesehen... bei meinem zweiten erneuten Lesen :: roter Kopf:
Toller Artikel. Ich habe mich allerdings auf den Teil über HTML-E-Mails gefreut?
Vielleicht in einem Folgeartikel? :)
Definitiv interessiert an jedem Follow-up für EDMs.
Schöner und umfassender Leitfaden zum guten alten HTML-Tabellen-Tag. Selbst im tableless-Design-Trend ist es schwer, das table-Tag komplett zu ignorieren. Danke fürs Teilen.
Schöner, ausführlicher Artikel
Heiliger Strohsack, das war umfassend. Ich fordere jeden heraus, etwas zu finden, das Chris ausgelassen hat!
Gut gemacht
D
Ich habe eine, oder wenn sie drin ist, habe ich sie übersehen…
Die einzigartige Zentrierung von allem innerhalb einer Zelle. Wenn Sie beispielsweise eine Zelle auf die Größe des gesamten Bildschirms einstellen und ein 10px großes Bild darin platzieren, wird es automatisch vertikal und horizontal zentriert. Soweit ich weiß, ist
display:table-celldas Einzige, was dies ohne eine Art Skript tut.Ich habe viele Ressourcen von "css-trics" gefunden, seit ich Google durchsuche;
Ich lerne noch viel mehr von Chris Coyier Lynda Tutorial.
Er ist wirklich eine erfahrene und nette Person.
Ich denke, Sie haben einen sehr wichtigen Aspekt der colspan- und rowspan-Attribute übersehen – wie man eine Zelle 100% der Tabellenbreite einnehmen lässt (ich bin nicht sicher, ob dies mit der Höhe möglich ist), unabhängig von der tatsächlichen Anzahl der Zellen in einer Zeile.
In HTML5 ist eine Quellreihenfolge von
thead -> tbody -> tfoottatsächlich in OrdnungQuelle: W3C – HTML5: Unterschiede zu HTML4
Dies ist ein Meisterwerk! Danke!
Zur Info:
tfootist jetzt in HTML5 nachtbodyerlaubtWas es viel einfacher macht, Tabellen responsiv zu formatieren
Das ist wirklich hochwertiger Inhalt! Besonders der Teil bezüglich des responsiven Stylings von Tabellen. Wenn ich in Zukunft damit zu tun habe, werde ich definitiv auf diesen Artikel und die Codepen-Sammlung zurückkommen!
Schöner zusammenfassender Artikel.
ist nicht korrekt. Es war in HTML 4/XHTML 1 erlaubt und ist es immer noch in HTML5
„…ein Thead-Element, optional gefolgt von einem Tfoot-Element, gefolgt von entweder null oder mehr Tbody-Elementen oder einem oder mehr Tr-Elementen…“
Es ist erwähnenswert, dass
<tr>-Elemente automatisch von<tbody>umschlossen werden, egal ob Sie<tbody>im Quellcode schreiben oder nicht. Dies ähnelt der Art und Weise, wie der Inhalt der Seite mit<body>umschlossen wird, selbst wenn Ihr Markup so aussiehtAus diesem Grund empfehle ich Entwicklern, ihre
<tr>-Elemente immer mit<tbody>zu umschließen, um Verwirrung zu vermeiden.Zur Verwendung von Tabelleneigenschaften für das Layout anderer Elemente als Tabellen zitiere ich nur Eric Meyer im Jahr 2009
Quelle: Gesucht: Layout-System
Ich muss dem großen E. Meyer hier widersprechen: Der Missbrauch von HTML-Elementen für ihre Standarddarstellung, unabhängig von ihrer Semantik, hat nichts mit der Verwendung von CSS-Eigenschaften und -Werten auf HTML-Elementen zu tun!
CSS ändert nicht die Semantik des HTML-Codes: Es stilisiert ihn.
Die Eigenschaft
displayexistiert aus einem Grund, undtableodertable-cellsind absolut gültige Werte. Außer bei ersetzten Elementen (img,inputusw.) können sie überall verwendet werden, wo wir wollenCSS-Tabellenlayouts, die über
tableodertable-cellerhalten werden, haben interessante Eigenschaften wie das Verbleiben in einer einzigen Zeile, sich selbst an den Inhalt anpassende Breiten oder nicht, einfaches vertikales Zentrieren oder Nachbarelemente gleicher Höhe.Ich bin mit dem Titel dieses Beitrags einverstanden: Wir brauchen(ten) andere Layoutsysteme als die bestehenden, weil Floats, Positionierung und Tabellenlayouts nicht ausreichen, um alle Fälle abzudecken.
Chris,
Ein weiterer großartiger Artikel. Vielleicht habe ich es übersehen, aber bitte klären Sie für mich die responsiven Tabellen. Wird die als Responsive gelistete Tabelle mit Media Queries richtig dimensioniert? Die als RWD List-to-Table gelistete Tabelle. Verwendet diese das "Responsive Elements" js, über das Sie am 17. Sep. im Blog-Post "Responsive Elements" geschrieben haben? Das CSS erwähnt die Notwendigkeit des "respond.js polyfill" für IE, und das ist neu für mich.
Ich bin der Meinung, dass es keinen Grund gibt, eine Tabelle auf einer Website zu erstellen, wenn sie nicht responsiv sein wird, daher versuche ich, Klarheit darüber zu bekommen, welcher Ansatz der beste ist. Skripte überall auf meiner Website zu platzieren, macht mich aufgrund möglicher Konflikte vorsichtig, daher verwende ich sie selektiv.
Hey John,
Ich habe das Codepen-Beispiel geschrieben, über das Sie sprechen. Denken Sie daran, dass es nur ein Proof of Concept war.
Das respond.js wird nur für IE8 und älter benötigt, weil a) diese keine Media Queries unterstützen, b) das SCSS mobile-first geschrieben ist; daher zeigen IE8,7 das CSS falsch an.
Das CSS könnte für große Displays und dann wieder für kleinere Bildschirme geschrieben werden. Ich finde jedoch mobile-first CSS schneller zu schreiben und würde lieber Zeit bei der Entwicklung sparen, anstatt Zeit mit der Unterstützung alter Browser zu verschwenden. Das Bereitstellen von respond.js für IE8 und 7 ermöglicht es ihnen, die Media Queries korrekt zu lesen.
Fantastischer Artikel. Dies ist der ULTIMATIVE Tabellenführer
Danke, dass Sie darüber geschrieben haben.
Ich kann Ihnen nicht sagen, wie oft ich bei Tabellen verwirrt war.
Schöner Artikel, aber sehr schlechte browserübergreifende Kompatibilität.
Das table-Tag hat wahrscheinlich die beste Cross-Browser-Kompatibilität (viel besser als jeder CSS-basierte Ansatz), da es seit den Anfängen von HTML verwendet wird…
Schöner Artikel! Besonders gut gefielen mir die Sortierfunktionen, ohne dass die Daten aus einer Datenbank stammen mussten.
Und die Verwendung von Tabellen als Layout-Tool ist eines der Dinge, die mich zähneknirschend machen, wenn ich den Code auf WordPress-Seiten durchsehe!
Dies ist ein ausgezeichneter Artikel, die Beispiele sind äußerst hilfreich. Ich bin vor ein paar Tagen zufällig auf diese Seite gestoßen und Sie haben einen Stammleser gewonnen. Großartige Arbeit.
Großartiger Artikel!
Bezüglich der 'Fixed Header Table' schauen Sie sich meine Lösung an, die ich in meinen Projekten verwende.
Eine Demo und den Code finden Sie unter http://www.hgsweb.de/floater/
Grüße
Ist es schlimm, dass ich das
rowspan-Attribut erst heute kannte? Ein weiterer großartiger Leitfaden, Chris. Gut gemacht!Sehr hilfreich :) mehr solche Tutorials sollten bereitgestellt werden .. ! :)
Sehr informativer und nützlicher Beitrag, danke.
Hallo Chris!
Ich habe eine (vielleicht) interessante Workaround-Lösung für die Anzeige von Tabellen auf responsiven Websites entwickelt… Hier ist ein Link, falls jemand interessiert ist (ich habe Ihr CSS-Modell mit neuem JS verwendet): http://www.netgenlabs.com/Blog/Responsive-Data-Tables-with-ngResponsiveTables-jQuery-plugin
Fantastisch!
Ich betrachte mich selbst als HTML-Veteran, da ich 1997/1998 meine Reise mit dem Schreiben von HTML (und folglich Tabellen) begann und den Übergang von der Verwendung von Tabellen für das Layout zu Div-Layouts vollzog, aber selbst ich habe mit diesem Artikel ein oder zwei Dinge gelernt... hauptsächlich über das Styling von Tabellen mit CSS (ich kannte die CSS-Eigenschaft border-spacing nie) und dies ist absolut unerlässlich für jeden, der heute HTML lernt. Als Lesezeichen gesetzt!!
Dennoch habe ich festgestellt, dass immer mehr E-Mails mit Divs und CSS strukturiert werden und sogar responsiv sind. Ich bin so bereit, mit den archaischen Tabellenlayouts fertig zu werden, aber ich habe noch keine dieser neuen Methoden ausprobiert.
Dieser Artikel ist wirklich hilfreich. Ich habe ihn gerade für zukünftige Referenz als Lesezeichen gespeichert. Besonders gut gefällt mir die Demo zur Live-Suche in Tabellendaten mit jQuery oder JavaScript. Ich mag auch, dass dieser Artikel so viele Beispiele und Code-Schnipsel enthält. Es ist der beste Artikel über Tabellen, den ich je gelesen habe.
Danke für diesen Beitrag, Chris. Auch einige wirklich großartige Beispiele für das Styling von Tabellen.
Ich suche nach einem wirklich guten Beispiel, wie man
ul- undli-Elemente verwendet, um schöne, responsive mehrspaltige Listen (verschachtelt?) zu erstellen, wie man sie in einer E-Mail-Anwendung oder einem Social-Media-Feed sehen würde. Mehrspaltige Listen-Suchergebnisse sind normalerweise Beispiele für artikelähnlichen Inhalt, der Spalten einer Seite überspannt.Ich denke, was ich suche, erfordert eine einfache Gitterstruktur innerhalb der Listenelemente, aber ich bin sicher, dass es viele CSS-Eigenheiten auf verschiedenen Geräten gibt. Ein E-Mail-Beispiel ähnlich der integrierten Mail-App von iOS wäre perfekt, kann mich jemand darauf hinweisen?
Ich werde natürlich Ihre Website danach durchsuchen :).
Sehr ausführlicher Artikel! Es fehlt nur das eine, wonach ich gesucht habe – Zeilenhervorhebung durch Klicken auf ein Kontrollkästchen wie bei phpMyAdmin, oder auch nur durch Klicken irgendwo in der Zeile. Hover ist nett, aber ich habe einige Datenbanken, die einen horizontalen Bildlauf benötigen. Das Hervorheben einer Zeile mit Hover hilft nicht, wenn man den Cursor zum Scrollen bewegen muss.
Sie benötigen etwas JS, um dies zu tun.
Erstellen Sie in Ihrem CSS eine ausgewählte Klasse und geben Sie ihr den gewünschten Hintergrund.
Und in Ihrem JS,
Sie können auch einen Event Listener an das Kontrollkästchen anhängen, wenn Sie ein Kontrollkästchen verwenden und es die ausgewählte Klasse umschalten lassen möchten.
Toller Artikel, Chris, danke, dass Sie alles für uns in einer Liste zusammengefasst haben. Im Abschnitt Hervorheben von Spalte/Zeile/Zelle bei Hover, wo Sie sagen
Ich hatte das Gefühl, dass es möglich sein könnte, die gleiche Aufgabe in ungefähr der gleichen Anzahl von Zeilen in nativem JavaScript zu erledigen. Tatsächlich stellte es sich als noch einfacher heraus, als ich es mir zuerst vorgestellt hatte. Also dachte ich, ich teile es.
Der obige JS-Code wendet die
hover-Klasse nur auf die Spalte an, da ich die Zeilenzellen mit der CSS-Regeltr:hover tdeinfärbe, wie unten gezeigt.Schön! Meine Amateur-JS-Fähigkeiten haben mich wohl im Stich gelassen. Mein Beispiel umfasst 67 Zeilen voller Blut, Schweiß und Tränen.
Sehr clever, das Event-Target zu verwenden und an die Tabelle selbst zu binden (ich würde wahrscheinlich an die Tabelle selbst statt an den tbody binden, nur weil man vielleicht einen Header hovern möchte, um eine Spalte hervorzuheben), anstatt an die Zellen selbst.
Könnte dies angepasst werden, um eine Zeile mit Klick statt Hover hervorzuheben?
@Chris: sehr guter Punkt bezüglich der Möglichkeit, nur die Tabellenspalte auszuwählen, indem die Ereignisse an die Tabelle selbst gebunden werden. Eine schöne, einfache Änderung für gute zusätzliche Funktionalität.
@Darrel: Wenn ich Sie richtig verstehe, möchten Sie, dass eine Zeile in der Tabelle bei einem Klick ausgewählt/abgewählt wird, richtig? Wenn ja, dann ist eine Möglichkeit dazu unten aufgeführt.
Und Sie müssen eine CSS-Regel für
selectedhinzufügen, zum BeispielFür eine bessere Benutzererfahrung machen Sie die code-pen-Felder bitte größenverstellbar. Das wird uns helfen, die Dinge sehr gut zu sehen.
Hey Chris. Gutes Zeug. Ich frage mich, welche Regeln für die korrekte Verwendung eines
<a href="">innerhalb von Tabellen-Markup gelten.Ist es in Ordnung, eine ganze Tabellenzeile in einen Link zu verpacken?
Ist es in Ordnung, eine Reihe von
<td>sin einen Link zu verpacken?Oder denken Sie, wir sollten Links immer nur innerhalb eines
<td>verwenden?Das ist tatsächlich eine gute Frage, denn HTML5 erlaubt Anker-Elemente („a“), fast alles zu umschließen, sogar Block-Elemente. Aber ich habe es getestet und, wie erwartet, schlägt es nicht nur die Validierung fehl, sondern scheint auch nichts zu bewirken (zumindest nicht in Chrome).
Bezüglich der Kommentare zur Positionierung von
<tfoot>Beachten Sie, dass, wenn der Benutzer eine Tabelle kopiert und an anderer Stelle einfügt, die Zeilen in DOM-Reihenfolge erscheinen, auch wenn der Browser die Fußzeile korrekt anzeigt. Wenn Ihr Publikum dies wahrscheinlich häufig tut (z. B. regelmäßig Daten in Excel einfügt), können Sie Verwirrung vermeiden, indem Sie
<tfoot>nach<tbody>platzieren.Was für ein fantastischer Beitrag, den ich heute gelesen habe. Display-Eigenschaft kann auch verwendet werden, um jedes Element als Tabelle anzuzeigen. Erstaunlich zu wissen. Danke Chris. :)
Fantastischer Beitrag. Zweifellos der umfangreichste und durchdachteste Beitrag über Tabellen, den ich je gesehen habe.
Wirklich toller Artikel!
Ich möchte eine semantische Frage zu Tabellen stellen…
Ich verwende häufig Tabellen, um Formulare darzustellen, in einer dreispaltigen Art und Weise: Beschriftung, Eingabefeld und Hilfe-/Infobereich, wobei sich die Zeilen für jede Datenzeile wiederholen… eine einfachere Möglichkeit, Formulare zu konstruieren.
Meine Hypothese ist, dass die Daten tabellarisch, assoziiert sind
Jede Zeile ist ein kohärenter Satz (Bezeichnung / Eingabe / Hilfe)
Das gesamte Formular stellt eine Möglichkeit zur Eingabe dar… eine Zeile in einer Datenbank, also…)
Einige meiner Kollegen sagten NEIN! Es ist "Old School", Sie müssen ul / li / div verwenden ... und float oder display: table* ... (also meiner Meinung nach viel CSS, um dasselbe zu tun, und weniger semantisch)...
Wer hat (mehr) Recht?
Ihr beide. Sie sollten
<fieldset>verwenden http://stackoverflow.com/questions/9741328/why-do-we-need-a-fieldset-tag<ol>sind auch nützlich, da sie der assistiven Technologie mitteilen, wie viele Felder im<form>sind und bei welcher Nummer sie sich befinden.Willkommen im Jahr 2006
Ich wünschte, Sie hätten mehr als nur einen flüchtigen Moment auf das Attribut "scope" verwendet.
So viele Designer überspringen den Barrierefreiheitsaspekt des Designs, und ich persönlich finde es eine oft übersehene Pflicht als Profi, sicherzustellen, dass Inhalte bestmöglich zugänglich sind.
Vertrauen Sie mir, wenn Sie sich erst einmal durch den American's with Disabilities Act, insbesondere (Abschnitt 508a), gekämpft haben, ist es von entscheidender Bedeutung, Unternehmen zu ermutigen, ihre Websites/Geschäfte für Menschen mit Behinderungen zugänglich zu machen. Nicht nur, um inklusiv zu sein, nicht exklusiv für ihre Besucher, sondern auch, um rechtliche Probleme zu vermeiden.
Ich erinnere mich, wie vor Jahren die Target Corporation in Schwierigkeiten geriet, weil ein "nicht sehender" oder blinder Mann ihr Menü nicht navigieren konnte und infolgedessen eine Klage einreichte. Target änderte kurz darauf ihre Navigation.
Verstehen Sie mich nicht falsch, der Artikel war eine ausgezeichnete Sammlung von Best Practices usw., aber als Designer und jemand, der Design für ein örtliches College unterrichtet (ja, ich habe die Form „diejenigen, die nicht können, lehren“ durchbrochen), ermutige ich meine Studenten, Barrierefreiheit genauso hoch einzustufen wie jede andere Designmethodik/Ideologie.
Toller Artikel!
Das war sehr lesenswert, also vielen Dank! Ein paar Tippfehler, zum Beispiel denke ich, "on" sollte "one" sein, aber großartige Informationen. Ich gestehe, dass ich Tabellen im Header und Footer verwendet habe, um Elemente zu positionieren, wenn schwebende Divs sich nicht gut verhielten. Sie haben mir einen Weg gezeigt, diese Divs dazu zu bringen, sich zu verhalten und diese Tabellen loszuwerden.
Sie sagen: „Man sieht selten, dass moderne Websites Tabellen für das Layout verwenden.“
Schauen Sie sich Amazon.co.uk an .... Überall Tabellen!
Vorsicht vor vertical-align: baseline-Einstellungen am
<td>-Tag im Meyer's Reset CSS!Ich bin kürzlich in eine seltsame Situation geraten, in der zwei nebeneinander liegende Tabellenzellen, eine mit Text und die andere mit einem Bild, nicht richtig ausgerichtet waren, und es dauerte eine Weile, bis ich herausfand, dass es an den vertical-align-Einstellungen im CSS Reset lag.
Beispiel auf CodePen
bitte @chris, wie kann ich den Tabellendateninhalt für eine bestimmte Tabelle verwenden, da alle Tabellen auf meiner Website diesen Stil erben.
Ich habe nicht alle Kommentare gelesen, um zu sehen, ob jemand anderes dies bereits erwähnt hat, aber…
Im Beispiel des Sortierens einer Tabelle sieht das Skript nur die Zahlen vor einem Komma. Zum Beispiel würde die Zahl 2.234 niedriger als die Zahl 456 und höher als 1.234.567 sortiert.
Dieser Artikel ist wirklich hilfreich. Ich habe ihn gerade für zukünftige Referenz als Lesezeichen gespeichert. Besonders gut gefällt mir die Demo zur Live-Suche in Tabellendaten mit jQuery oder JavaScript. Ich mag auch, dass dieser Artikel so viele Beispiele und Code-Schnipsel enthält. Es ist der beste Artikel über Tabellen, den ich je gelesen habe.
Hey Hallo,
Ich habe eine Datentabelle, bei der die zweite Spalte Lorem Ipsum enthält
Jetzt möchte ich CSS auf den Fokus des Links schreiben.
Derzeit habe ich Code und CSS auf a:focus geschrieben, was außer bei WebKit-Browsern wie Chrome & Safari einwandfrei funktioniert.
Gibt es eine andere Alternative, dies zu implementieren?
Schöner Artikel.
Ich habe eine Frage, wie Sie die Tabelle so gestalten würden, dass sie Verhaltensweisen wie das DataGrid in Flex aufweist? Ich meine, die Ränder der Spalten ziehen zu können, um deren Breite zu ändern (wie in einer Tabelle auch).
Hallo, ich habe ein Problem, 2 variable Tabellen in demselben Div anzupassen.
Ich habe ein Haupt-Div, das 2 Tabellen enthält, beide müssen eine variable Breite haben, das einzige, was ich weiß, ist, dass die linke Tabelle 2, 3, 4, 5 oder 6 Spalten haben könnte, aber eine maximale Breite von 39% haben muss (falls sie 6 Spalten hat)
Die rechte Tabelle muss den verbleibenden Platz der linken Tabelle anpassen, und die maximale Breite, die diese Tabelle haben würde (stellen Sie sich vor, die linke Tabelle hat nur 2 Spalten), beträgt ungefähr 83 %.
Haben Sie eine Idee, wie man beide in demselben Div anpasst, ohne dass sie in die nächste Zeile springen und beide sich dem 100% Div-Platz anpassen?
Vielen Dank im Voraus, Marian.
Großartiger Artikel. Ich weiß nicht viel über HTML / CSS. Dies hat mir geholfen, schnell eine HTML-Tabelle zu erstellen.
Gutes Zeug, danke!
Ich habe in einem der Filterbeispiele wiederholte IDs bemerkt und anstatt im Internet darüber zu kommentieren, dachte ich, ich repariere es auf Codepen und teile es. http://codepen.io/anon/pen/BysKz wenn Sie es aktualisieren möchten.
Nochmals vielen Dank!
Etwas anderes, das in Betracht gezogen werden könnte, ist die Verwendung von Jquery, um Ihre Tabellenelemente dynamisch zu dimensionieren. Dies könnte jedoch etwas knifflig sein, es sei denn, Sie wandeln bereits eine Vorlage um, um damit zu beginnen. Google ist Ihr Freund.
Wie immer, einfach exzellent. Eigentlich suchte ich etwas anderes, aber das war unter meinen Suchergebnissen: "A complete guide to the table element" von Chris Coyier. Muss lesenswert sein, dachte ich. Absolut richtig :)
Ich sehe, Sie erwähnen Tablesorter und verlinken zu einem Artikel, der viele weitere solcher Ressourcen bietet, einschließlich des sehr umfassenden datatables.net. Einige möchten vielleicht jtable untersuchen, das ich gut finde (ich bemerke, dass die meisten jtable-Funktionen ohne weitere Plugins verfügbar sind).
Nochmals vielen Dank für einen großartigen Artikel.
Großartiger Leitfaden.
Ich frage mich, ob Sie oder jemand mir bei einem Tabellenproblem helfen kann – ich möchte eine 2-Spalten-Tabelle mit mehreren Zeilen haben, aber die einzige Begrenzung, die ich möchte, ist auf der rechten Seite der Spalte 1. Der Effekt wäre eine vertikale Linie zwischen den beiden Spalten.
Jede Hilfe wird sehr geschätzt.
Hallo Tony
Schau dir das folgende jsFiddle an: http://jsfiddle.net/SBp3K/
Paul
Vielen Dank Paul, genau das, was ich brauche.
Da ich nur an Webanwendungen arbeite, die hinter einer Authentifizierung sitzen, vermeide ich die Verwendung des Tabellen-Elements komplett, und das spart mir eine Menge Zeit und Kopfschmerzen. Die Tabelle und die zugehörigen Elemente sind unvorhersehbar und haben für meinen Geschmack zu viele Eigenheiten.
Sehr nützlicher Beitrag, danke.
Vielleicht hat es Ihnen schon jemand gesagt, aber darf ich eine kleine Änderung in Ihrem JavaScript-Code für die "einfache Suche" in der Tabelle vorschlagen? Um die Zeilen unter dem Header auszuwählen, verwenden Sie
var rows = $('table tr:gt(0)');Ich schlage vor zu verwenden
var rows = $('tbody tr');Ich hatte ein Problem, als ich Ihren Code mit einem Header mit zwei Zeilen verwendete.
Nichts falsch daran, Tabellen für das Layout zu verwenden. Ja, es ist ein Hack, aber das ist die Verwendung von CSS und DIVs für das Layout auch. Keines davon war für das Layout gedacht. Und Tabellen haben viel bessere inhärente Eigenschaften, die sie ideal für Layoutzwecke machen. Wenn der Inhalt innerhalb einer Zelle breiter ist als die Zellenbreite, dehnt sich die Zelle aus, um den Inhalt aufzunehmen, und alle umliegenden Zellen dehnen sich ebenfalls aus.
Ich habe umfangreiche Arbeiten mit Section 508 durchgeführt. Layouttabellen stellen keine Barrierefreiheitsprobleme dar, wenn sie korrekt verwendet werden (verwenden Sie keine THs, wenn es sich nur um eine Layouttabelle handelt, und um Himmels willen geben Sie der Tabelle überhaupt keine Beschriftung oder Zusammenfassung, wenn es sich nur um eine Layouttabelle handelt). Ich bin wirklich verblüfft über die Dämonisierung von Layouttabellen durch die moderne Webdesign-Community.
Es ist nur ein Werkzeug, Leute. Wenn es in den Browsern funktioniert, die Sie benötigen, wenn es wie beabsichtigt funktioniert und keine Barrierefreiheitsprobleme darstellt, dann verwenden Sie es auf jeden Fall. Die Verwendung von Layouttabellen, die mit Layout-DIVs vermischt sind, kann ein großartiger Ansatz sein, um das Beste aus beiden Welten zu erhalten und Ihre Website schnell fertigzustellen.
Wenn es funktioniert, benutze es.