table, caption, thead, tbody, tfoot, tr, th, td, colgroup — tabulky pro tabulková data. NIKDY pro layout stránek!
| Produkt | Cena | Sklad |
|---|---|---|
| Victorinox Classic | 299 Kč | ✅ |
| Gerber Paraframe | 549 Kč | ✅ |
| Spyderco Delica | 1 290 Kč | ❌ |
| Celkem položek: 3 | 2 skladem | |
Kontejner pro tabulková data. Vždy s thead, th a scope pro přístupnost. NIKDY pro layout!
table je pro tabulková data — obsah který přirozeně tvoří mřížku řádků a sloupců. Screen readery čtou tabulky speciálně — oznamují záhlaví sloupce při každé buňce. Bez thead/th/scope je tabulka matoucí pro screen readery.
| border | Zastaralé — použijte CSS border-collapse | deprecated |
<caption> — název tabulky<thead> se záhlavními buňkami<th scope="col"> pro záhlaví sloupce<th scope="row">overflow-x: auto na obalovací div<!-- Obalovací div pro responsivitu -->
<div style="overflow-x: auto">
<table>
<caption>Ceník produktů 2024</caption>
<thead>
<tr>
<th scope="col">Produkt</th>
<th scope="col">Cena</th>
<th scope="col">Dostupnost</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Victorinox Classic</th>
<td>299 Kč</td>
<td>Skladem</td>
</tr>
<tr>
<th scope="row">Gerber Paraframe</th>
<td>549 Kč</td>
<td>Skladem</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="3">
Ceny jsou včetně DPH.
</td>
</tr>
</tfoot>
</table>
</div>
<!-- CSS pro tabulku -->
<style>
table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
}
th, td {
padding: 0.6rem 1rem;
text-align: left;
border-bottom: 1px solid #eee;
}
thead th {
background: #f5f0ff;
font-weight: 700;
border-bottom: 2px solid #a78bfa;
}
tbody tr:hover { background: #fafafa; }
tbody tr:nth-child(even) {
background: #f9f9f9;
}
tfoot td {
font-size: 0.8rem;
color: #666;
border-top: 2px solid #eee;
}
caption {
text-align: left;
padding: 0.5rem 0;
font-weight: 600;
margin-bottom: 0.5rem;
}
</style>
Viditelný název tabulky — jako label. Musí být první child elementem uvnitř table.
caption je viditelný název tabulky — jako <label> pro formuláře. Screen readery ho přečtou jako první, ještě před samotnou tabulkou. Musí být první child element uvnitř table — před thead, tbody, tfoot.
| — | Žádné speciální atributy (jen globální) | — |
| caption-side: top | Nad tabulkou (výchozí) | default |
| caption-side: bottom | Pod tabulkou | CSS |
<table>
<!-- caption PRVNÍ, před thead! -->
<caption>
Měsíční tržby za Q1 2024
</caption>
<thead>...</thead>
<tbody>...</tbody>
</table>
<!-- caption pod tabulkou -->
<table>
<caption style="caption-side: bottom">
Tabulka 1: Srovnání produktů
</caption>
...
</table>
<!-- Alternativa bez caption -->
<table aria-label="Ceník produktů 2024">
...
</table>
<!-- CSS -->
<style>
caption {
font-size: 0.875rem;
font-weight: 700;
text-align: left;
padding: 0 0 0.5rem;
color: #333;
}
</style>
thead = záhlaví, tbody = data, tfoot = zápatí. Sémantické rozdělení pro přístupnost, tisk a výkon.
thead označuje záhlavní řádky (obsahuje th elementy). tbody obsahuje datové řádky. tfoot je zápatí — souhrnné řádky, poznámky. Prohlížeče mohou při tisku opakovat thead na každé stránce. tbody je povinný pro validní HTML5 — prohlížeč ho přidá automaticky, ale pište ho vždy explicitně.
| thead | Záhlavní řádky — záhlaví sloupců |
| tbody | Datové řádky — samotná data |
| tfoot | Souhrnný řádek, celkem, poznámky, legenda |
<table>
<caption>Produkty podle kategorie</caption>
<thead>
<tr>
<th scope="col">Název</th>
<th scope="col">Cena</th>
</tr>
</thead>
<!-- První skupina -->
<tbody>
<tr>
<th scope="rowgroup"
colspan="2">
Victorinox
</th>
</tr>
<tr>
<th scope="row">Classic</th>
<td>299 Kč</td>
</tr>
<tr>
<th scope="row">Spartan</th>
<td>499 Kč</td>
</tr>
</tbody>
<!-- Druhá skupina -->
<tbody>
<tr>
<th scope="rowgroup"
colspan="2">
Gerber
</th>
</tr>
<tr>
<th scope="row">Paraframe</th>
<td>549 Kč</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>Celkem: 3 produkty</td>
<td>od 299 Kč</td>
</tr>
</tfoot>
</table>
Obaluje buňky jednoho řádku. Přímí potomci mohou být jen th nebo td.
tr (table row) je řádek tabulky. Přímí potomci mohou být pouze <th> nebo <td> — nic jiného. tr patří do thead, tbody nebo tfoot.
| — | Žádné speciální (dříve bgcolor, align — dnes CSS) | — |
tr:nth-child(even) { background: #f9f9f9; }tr:hover { background: #f0f0f0; }onclick na tr/* Zebra pruhy */
tbody tr:nth-child(even) {
background: #f9f9f9;
}
/* Hover zvýraznění */
tbody tr:hover {
background: #f0ebff;
cursor: pointer;
}
/* Aktivní / vybraný řádek */
tbody tr.selected {
background: #ede9fe;
outline: 2px solid #a78bfa;
}
/* Klikatelný řádek */
tbody tr[onclick] {
cursor: pointer;
}
tbody tr[onclick]:hover {
background: #f5f0ff;
}
Záhlaví sloupce nebo řádku. scope="col/row" povinné pro přístupnost. Tučný a centrovaný by default.
th (table header) je záhlavní buňka. scope="col" označí záhlaví sloupce, scope="row" záhlaví řádku. Screen reader řekne "Cena: 299 Kč" — díky th + scope. Bez scope je tabulka matoucí pro screen readery.
| scope | col = záhlaví sloupce, row = záhlaví řádku, colgroup, rowgroup | col / row |
| colspan | Sloučit přes N sloupců | číslo |
| rowspan | Sloučit přes N řádků | číslo |
| abbr | Zkrácená verze záhlaví pro screen readery | string |
| id | Pro headers atribut na td | string |
<!-- Záhlaví sloupců -->
<thead>
<tr>
<th scope="col">Produkt</th>
<th scope="col">Cena</th>
<th scope="col"
abbr="Dostupnost">
Dostupnost na skladě
</th>
</tr>
</thead>
<!-- Záhlaví řádků -->
<tbody>
<tr>
<th scope="row">
Victorinox Classic
</th>
<td>299 Kč</td>
<td>✅</td>
</tr>
</tbody>
<!-- Komplexní: headers -->
<thead>
<tr>
<th id="produkt">Produkt</th>
<th id="cena">Cena</th>
</tr>
</thead>
<tbody>
<tr>
<td headers="produkt">
Victorinox
</td>
<td headers="cena">
299 Kč
</td>
</tr>
</tbody>
Buňka s daty. colspan = přes sloupce, rowspan = přes řádky. Jen v tbody nebo tfoot.
td (table data) obsahuje data. colspan sloučí buňku přes více sloupců. rowspan přes více řádků. Součty colspan a rowspan musí matematicky sedět — jinak tabulka vizuálně "praskne".
| colspan | Sloučit přes N sloupců (horizontálně) | číslo |
| rowspan | Sloučit přes N řádků (vertikálně) | číslo |
| headers | ID záhlavních buněk pro komplexní tabulky | id id2 |
<td> </td> nebo <td></td>| A | B | C | D |
|---|---|---|---|
| colspan="2" (A+B) | rowspan="2" (C řádky 1+2) | D1 | |
| A2 | B2 | D2 | |
| A3 | B3 | C3 | D3 |
<!-- colspan: sloučení sloupců -->
<tr>
<td colspan="3">
Sloučeno přes 3 sloupce
</td>
<!-- tady jsou jen 1 td místo 3 -->
</tr>
<!-- rowspan: sloučení řádků -->
<tr>
<td rowspan="2">Přes 2 řádky</td>
<td>Normální buňka</td>
</tr>
<tr>
<!-- první td chybí = sloučeno výše -->
<td>Normální buňka</td>
</tr>
<!-- Prázdná buňka -->
<td></td>
<!-- nebo -->
<td> </td>
Stylování celých sloupců najednou pomocí CSS. colgroup obaluje col elementy.
colgroup a col umožňují aplikovat CSS styly na celé sloupce najednou — bez nutnosti přidávat třídu na každou buňku. Musí být hned za caption a před thead. col je void element.
| span | Počet sloupců, na které se col vztahuje | číslo |
<table>
<caption>Ceník plánů</caption>
<!-- colgroup PŘED thead -->
<colgroup>
<col> <!-- 1. sloupec: název -->
<col> <!-- 2. sloupec: Basic -->
<col class="highlighted">
<!-- 3. sloupec: Pro (zvýrazněn) -->
<col> <!-- 4. sloupec: Enterprise -->
</colgroup>
<thead>
<tr>
<th scope="col">Funkce</th>
<th scope="col">Basic</th>
<th scope="col">Pro ⭐</th>
<th scope="col">Enterprise</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Uživatelé</th>
<td>1</td>
<td>5</td>
<td>Neomezeno</td>
</tr>
</tbody>
</table>
<!-- CSS -->
<style>
col.highlighted {
background: #faf5ff;
}
/* Šířky sloupců */
col:first-child { width: 40%; }
col:not(:first-child) { width: 20%; }
</style>