この記事の目次
HTMLのtableの書き方とは
<table> は、行と列でデータを整理する「表」のための要素です。MDN は、tableはレイアウトのために使うものではないと明記しています。レイアウトは Flexbox や Grid に任せ、データの表だけに使います。
表をきちんと組むと、スクリーンリーダーの利用者が「どの見出しに対する値か」を把握でき、CSSで見た目を変えるときにも扱いやすくなります。この記事では、基本の構造、見出しセルの関連付け、複雑な表への対処を扱います。
基本(構文・仕組み)
表を構成する主な要素です。
| 要素 | 役割 |
|---|---|
| caption | 表のタイトル・要約。table の最初の子に置く |
| thead / tbody / tfoot | 見出し行 / 本体 / 集計行 |
| tr | 行 |
| th | 見出しセル |
| td | データセル |
| colgroup / col | 列のグループ・スタイル指定 |
th には scope 属性で「何の見出しか」を示します。col は列の見出し、row は行の見出しです。結合した見出しには colgroup・rowgroup も使えます。W3C WAI のチュートリアルは、見出しセルを th、データセルを td で区別し、必要なら scope で方向を明示するよう勧めています。
colspan と rowspan でセルを結合できますが、複雑になるほど支援技術で読みにくくなります。MDN と W3C WAI はどちらも、可能なら複雑な表を単純な複数の表に分けること、どうしても難しい場合は id と headers 属性で見出しとデータを関連付けることを案内しています。
サンプルコード(実行結果つき)
<table>
<caption>月別売上(万円)</caption>
<thead>
<tr><th scope="col">商品</th><th scope="col">1月</th><th scope="col">2月</th></tr>
</thead>
<tbody>
<tr><th scope="row">A</th><td>120</td><td>150</td></tr>
<tr><th scope="row">B</th><td>80</td><td>95</td></tr>
</tbody>
<tfoot>
<tr><th scope="row">合計</th><td>200</td><td>245</td></tr>
</tfoot>
</table>
合計値は 120 + 80 = 200、150 + 95 = 245 で検算できます。見た目はCSSで整えます。
table { border-collapse: collapse; }
th, td { border: 1px solid #888; padding: 6px 10px; }
caption { font-weight: bold; text-align: left; }
スマホで表が横にはみ出す場合は、div で包んで横スクロールさせる方法が一般的です。
<div class="table-wrap" style="overflow-x:auto" tabindex="0" role="region" aria-label="月別売上の表">
<table>...</table>
</div>
動作確認(検証環境と結果)
- 環境: Windows 11、headless Microsoft Edge 154.0.4258.53(Chromium系、
render.ps1、幅500px)。 - 結果(DOM):
table.rows.lengthは 4、captionは「月別売上(万円)」、th[scope=col]は 3、tHead・tBodies・tFootはすべて存在しました。 - 結果(画面): 罫線付きの4行の表として表示され、キャプションが上部に太字で、
thは太字・中央揃えで描画されました。 - 未検証: 横スクロール用ラッパー(
overflow-x:auto)の実機動作、およびスクリーンリーダーの読み上げ。 - ログ:
C:Tempks2techtestshtml-table.md、画面はC:Tempks2techtestst1table.png。
HTMLのtableの書き方の注意点
captionは表の直前に別の見出しを置く代わりにもなります。見出し(h2など)と併用するなら、重複しない内容にします。- 現在のHTML仕様では、
tfootはtbody(またはtr)の後に書きます。古い書き方でtbodyの前に置いても、ブラウザ既定のCSS(display: table-footer-group)により表の最後に表示されます(headless Edge で確認)。 - 数値の列は右揃えにすると比較しやすくなります(
text-align: right)。 - 空のセルを残すより、「なし」や「−」など意味のある文字を入れるほうが伝わります。
HTMLのtableの書き方でよくあるミス
- レイアウト目的で
tableを使う(古いHTMLメールなどを除き避けます)。 - 見出しセルを
td+strongで作り、thにしていない。 captionを省略して、表の主題が分からない。- 結合セルを多用して、列数が行ごとに合わなくなる。
border="1"やcellspacingなど、古い表示属性に頼る。装飾はCSSで行います。
ブラウザ対応・バージョン
table と関連要素は MDN で長期にわたり広く使えるとされ、全ブラウザで利用できます。scope や headers による見出しの関連付けは、スクリーンリーダーなど支援技術の実装に依存するため、実際の読み上げは対象環境で確認します。
HTMLのtableの書き方のチェックリスト
- [ ] 表はデータの整理にだけ使っている。
- [ ]
captionを付けている。 - [ ] 見出しセルに
thとscopeを使っている。 - [ ] 複雑な結合は避けるか、
headersで関連付けている。 - [ ] 狭い画面での見え方(横スクロールなど)を確認した。
HTMLのtableの書き方のFAQ(よくある質問)
Q. 比較表を作るとき、どこを th にしますか。
A. 項目名が横に並ぶなら列見出し(scope="col")、行の先頭に名前が来るなら行見出し(scope="row")です。
Q. thead は必須ですか。
A. 必須ではありませんが、見出し行を明確にでき、印刷で複数ページにまたがるときも便利です。
Q. div と CSS Grid で表を作るのは良くないですか。
A. 本当に表形式のデータなら table を使うほうが、意味が伝わります。
筆者の見解(HTMLのtableの書き方)
私見では、表の品質は「見出しセルを th にして scope を付ける」だけで大きく変わると考えます。複雑な結合表を完璧にマークアップするより、情報の持ち方を見直して表を分けるほうが、閲覧者にも保守にも優しいことが多いです。スマホ対応は表を無理に縮めず、横スクロール可能な領域にして、スクロールできることが分かるようにする方法が現実的だと考えます。
HTMLのtableの書き方の関連項目
- セマンティックHTML
- 見出し構造(h1〜h6)
- 初心者必見!必要なタグはたったこれだけ!HTML超入門!
- details と summary
- HTMLコーダー(マークアップエンジニア)になる為に必要なスキルとは
