A semantic HTML element for presenting real “data tables” in rows and columns with clear headings, so people and screen readers can understand which values belong to which labels, with practical tips for captions, header cells, and mobile-friendly display.
料金表・比較表・集計結果のように「行」と「列」で揃ったデータを、読み手にもスクリーンリーダーにも迷いにくい形で伝えるための table 要素の使いどころを、基本から実務のコツまでまとめたページです。見た目だけのレイアウト目的で使うのではなく、「対応関係があるデータ」を正しく表すために使う、という感覚がつかめるように構成しています。
table は、数字や項目が「どの見出しに属するか」という対応関係が大事な情報を、構造として表すための要素です。見た目がそれっぽいだけではなく、「この値はこの項目のこと」と分かる形を作れます。th(見出しセル)と scope(効く範囲)を使うと、「どこを見れば何が分かるか」がはっきりします。div で表っぽく作ると、見た目は整っても読み上げが崩れやすいです。「レイアウト目的の表もどき」との違い
table は「対応関係があるデータ」を扱うための要素なので、レイアウトの都合だけで使うと、意味がズレてページ全体が読みづらくなることがあります。リスト(ul / ol / dl)との違い
dl の方がシンプルで読みやすいことも多く、無理に表にしない判断も重要です。table を使うこともありましたが、今は推奨されません。レイアウトはCSS、データ表は table と役割分担すると、後からの修正も安全です。th を使い、必要なら scope を付けるth、という使い方ではなく、「ここは見出しセル」という意味で th にします。scope="col"(列見出し)や scope="row"(行見出し)を付けると対応関係がさらに明確になります。| プラン | 月額 | 容量 | サポート |
|---|---|---|---|
| ライト | 500円 | 5GB | メール |
| スタンダード | 980円 | 20GB | メール / チャット |
| プロ | 1980円 | 100GB | 優先対応 |
HTML
<div class="tableScroll">
<table>
<caption>料金プラン一覧(例)</caption>
<thead>
<tr>
<th scope="col">プラン</th>
<th scope="col">月額</th>
<th scope="col">容量</th>
<th scope="col">サポート</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">ライト</th>
<td class="num">500円</td>
<td>5GB</td>
<td>メール</td>
</tr>
</tbody>
</table>
</div>
CSS
.tableScroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
table {
border-collapse: collapse;
width: 100%;
}
caption {
text-align: left;
font-weight: 700;
margin-bottom: 8px;
}
th,
td {
border: 1px solid #ddd;
padding: 8px 10px;
vertical-align: top;
}
td.num {
text-align: right;
white-space: nowrap;
}
このサンプルのポイントは、caption で表の意味を一言で示し、列の見出しは scope="col"、行の見出しは scope="row" にして、どの値がどの見出しに属するかを構造として確定させているところです。スマホでは横幅が足りないことが多いので、外側を overflow-x: auto; の容器で包み、横スクロールできる逃げ道も用意しています。
表が読みづらくなる原因の多くは、「どの値が、何の値なのか」が追いにくいことです。そこで効くのが th(見出しセル)と scope(見出しの効く範囲)です。
th は「太字セル」ではなく「見出しセル」scope="col"(列の見出し)scope="row"(行の見出し)colspan/rowspan で見出しが複雑になるほど、保守と読み上げ対応が難しくなりがちです。表を2つに分ける、段階表示にするなど、設計で助ける方が安全なことも多いです。表は情報密度が高く、スマホでは横幅が足りないことがよくあります。よく使われる現実解を、使いどころの感覚と一緒にまとめます。
table を使うべきですか?table は、行と列で「対応関係があるデータ」を扱うときに使います。thead / tbody / tfoot は必須ですか?caption は付けた方がいいですか?caption を検討すると筋がいいです。scope を付けないとダメですか?table を使ってしまうtable で役割分担します。td を使っているth にします。必要なら scope="col"/scope="row" で効く範囲も明確にします。caption がなく、表の意味が一瞬で分からないcaption で短く示すと迷子が減ります。表の前後に文章がある場合でも、まずは caption を検討します。colspan/rowspan を増やしすぎて保守が難しい