coding script
Photo by Markus Spiske on Pexels.com
目次

テーブルとデータ表のアクセシビリティ完全ガイド:見出しセル・関連付け・複雑表の分割・レスポンシブ対応・スクリーンリーダーでの理解を実現する実務設計

概要サマリー(先に要点)

  • テーブルは“見た目の並び”ではなく 「セル同士の関係」 を正しく伝えることが最重要ですの。
  • 基本は <th>scope、複雑表は headers 属性でID参照
  • レスポンシブでは 表の構造を壊さず にスクロール、折り畳み、カード化のいずれかで実装。
  • 行列見出しの二重化・多段ヘッダー・総計列など、実務でよくある“複雑表”の安全な扱い方を徹底解説。
  • WCAG 2.1 AA の 1.3.1 情報と関係1.3.2 意味の順序1.3.4 リフロー を中心に設計。

対象読者(具体):業務システム開発者、EC担当者、自治体職員、研究/統計データ作成者、CMS運用者、フロントエンドエンジニア、UI/UXデザイナー
アクセシビリティレベルWCAG 2.1 AA 準拠


1. はじめに:テーブルは“構造の言語化”がすべて

テーブルは視覚的には簡単に理解できますが、スクリーンリーダーでは 各セルが「どの行見出し」「どの列見出し」に属しているか を明示しない限り、まったく意味を持たない単なる数字の羅列になってしまいます。
そのため、テーブルのアクセシビリティは デザイン装飾よりも「情報の構造化」 が最大のテーマ。
とくに業務システム・統計資料・ECの比較表などは、日常的に使う方にとって 読みやすさ=仕事の効率 に直結しますわ。
本記事では、テーブルを“誰にとっても理解しやすい情報”に変えるための、現場で使える設計を丁寧にご紹介しますね。


2. 基本のテーブル構造:<th>scope が命

2.1 “表の見出し”は必ず <th>

  • 列見出し:<th scope="col">
  • 行見出し:<th scope="row">
<table>
  <thead>
    <tr>
      <th scope="col">月</th>
      <th scope="col">売上</th>
      <th scope="col">前年比</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">1月</th>
      <td>120</td>
      <td>105%</td>
    </tr>
  </tbody>
</table>

これはスクリーンリーダーに

「このセルは“売上”列の“1月”の値」
と理解させるための最低限の仕組みなのです。


3. 複雑な表(多段ヘッダー・グループ化)の扱い方

3.1 多段ヘッダーの場合:scope の代わりに idheaders

例:
月別の売上を、オンライン/店舗の2分類でまとめた複雑表。

<table>
  <thead>
    <tr>
      <th id="h-month">月</th>
      <th id="h-online" colspan="2">オンライン</th>
      <th id="h-store" colspan="2">店舗</th>
    </tr>
    <tr>
      <th id="h-empty"></th>
      <th id="h-online-a">A 商品</th>
      <th id="h-online-b">B 商品</th>
      <th id="h-store-a">A 商品</th>
      <th id="h-store-b">B 商品</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <th id="jan">1月</th>
      <td headers="h-online h-online-a jan">30</td>
      <td headers="h-online h-online-b jan">40</td>
      <td headers="h-store h-store-a jan">20</td>
      <td headers="h-store h-store-b jan">35</td>
    </tr>
  </tbody>
</table>

スクリーンリーダーが次のように読めます:

「1月、オンライン A 商品、30」
「1月、店舗 B 商品、35」

行と列の両方の見出しが明確に伝わります。


4. テーブルをレスポンシブにする:構造を壊さず可読性を維持

4.1 横スクロール方式(もっとも安全)

テーブル構造を変えず、親要素に横スクロールを付けます。

.table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}

4.2 カード型は“構造破壊”に注意

行をカード表示にする場合、行見出し・列見出し情報が失われがちです。
WCAGでは「構造の保持」が大前提のため、以下を守ります:

  • 各値の横に “列名” を表示
  • 見出しはカード先頭で 必ず表示
  • スクリーンリーダー向けに aria-label で補完

例:

<div role="table">
  <div role="rowgroup">
    <div role="row">
      <div role="rowheader">1月</div>
      <div role="cell" aria-label="売上">120</div>
      <div role="cell" aria-label="前年比">105%</div>
    </div>
  </div>
</div>

4.3 カラム折り畳み

不要列を隠す場合、

  • ユーザー選択でON/OFFできるようにし、
  • スクリーンリーダーには 隠れた列の情報を提供しない(混乱するため)。

5. 視覚的アクセシビリティ:色・太さ・間隔

5.1 行間のゆとり

行間・セル間を少し広げると、視認性が大きく向上しますわ。

td, th {
  padding: .75rem .5rem;
  border-bottom: 1px solid #ddd;
}

5.2 色覚多様性への配慮

  • 色だけで意味を伝えない
  • 赤=マイナス、青=プラスなどの“色意味依存”は避ける
  • 矢印(↑/↓)プラス/マイナス記号 を併用
  • コントラスト比(4.5:1以上)

5.3 行の背景交互は有効

ただし、コントラスト不足に注意し、淡すぎない色に。


6. スクリーンリーダーでの読み上げ最適化

6.1 caption は“表タイトル”

<table>
  <caption>2024年 第1四半期の売上比較</caption>
  …
</table>

6.2 テーブルとリストの使い分け

  • テーブル:行×列で関係がある情報
  • リスト:階層構造・箇条書きで十分なもの
    誤用すると認知混乱が起きるため、用途を明確に。

6.3 罫線なしデザインでも <table> を使う

見た目に関係なく、“意味として表である”なら <table> が正解。


7. よくある失敗例と修正ポイント

失敗例 問題点 正しい形
<td> だけで表を作る 見出し情報が伝わらない <th>scope の活用
レイアウト表としてテーブル使用 SRに誤った構造として伝わる CSSレイアウトで対応
多段ヘッダーを colspan だけで表現 関係が壊れる ID + headers
カード型で見出しが消える SRに意味が届かない 列名を明示的に表示
色だけで増減を表現 色覚多様性に非対応 記号・テキストで補強

8. データ表の文章化:表の要旨を必ず文章で

WCAG 1.3.1 の観点では、表の内容は文章でも理解できる状態が望ましいですわ。

例:

「1月〜3月の売上はすべて前年を上回り、特に2月は前年比110%で最も高い伸びを示しました。」

表の情報を“一言要約”するだけで、認知特性のある方も理解しやすくなります。


9. CMS・自治体サイト・業務システムでの運用

9.1 CMS(WordPress / Drupal 等)

  • エディタが <th> を自動生成しない場合、編集ガイドラインで明示
  • 表装飾プラグインは 構造破壊をしないものを選定

9.2 自治体・公共機関

  • 統計表が複雑になりがち
  • PDF公開より、HTML表への変換が利用者に優しい

9.3 業務システム

  • 動的表(ページング・フィルタ)は、ARIAの role="table" を乱用しない
  • DOM構造が簡潔に保てるなら、ネイティブ <table> が最強

10. 組織でのテーブル設計ルール化

10.1 “表テンプレート”を作る

  • 基本表(1段ヘッダー)
  • グループ化表(多段ヘッダー)
  • 合計・小計付き表
  • カード型表示版(SR補完あり)

10.2 フォーマット統一

  • シリーズ表の列順を統一
  • 数字の桁区切り・単位・注釈の統一
  • 凡例(↑、↓、色)の意味を明確化

10.3 チェック項目(5分)

  1. <th>scope が正しく設定されている
  2. 多段ヘッダーは idheaders
  3. レスポンシブでも構造が壊れていない
  4. 表の要約文がある
  5. 色だけで意味を伝えていない

11. 対象読者にとっての価値(具体)

  • 視覚障害のある方:セル間の関係が読み上げで理解でき、誤解がなくなる。
  • 認知特性のある方:列名・行名が明確で、数字の意味が掴みやすい。
  • 高齢者:行間が適切で見やすく、揺れのないレスポンシブ表示で安心。
  • 業務担当者:テーブルの“構造設計”が標準化され、資料作成の品質が安定。
  • 利用者全般:スマホでも読みやすく、必要な情報がすぐ理解できる。

12. アクセシビリティレベルの評価(本記事の到達点)

  • WCAG 2.1 AA
    • 1.1.1 非テキストコンテンツ(表内画像・記号の代替)
    • 1.3.1 情報と関係<th> scope headers
    • 1.3.2 意味の順序(DOM順の適正)
    • 1.4.1 色の使用
    • 1.4.10 リフロー(レスポンシブ対応)
    • 2.4.6 見出しとラベル
    • 4.1.2 名前・役割・値

13. まとめ:テーブルは“関係のデザイン”

  1. <th>scope で、行と列の関係を伝える。
  2. 複雑表は idheaders で、セルの文脈を明示。
  3. レスポンシブでは、構造を壊さずにスクロール or 補助表示
  4. 見出し・凡例・要約説明で、誰でも意味をつかみやすく
  5. 組織ルール化で、テーブル品質を継続的に安定させる。

表は、数字や情報を美しく整えるための“知の器”。
その器を誰もが平等に使えるように、アクセシブルなテーブル設計を一緒に育てていきましょうね。


投稿者 greeden

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)