本文へ移動
easeweb
ご相談
トピックを検索

データの表として読まれたり、順番が崩れたりするレイアウト用の表

メールマガジンが商品の並びを表で組んでいるため、スクリーンリーダーには各商品が列見出しとして読まれたり、商品名がすべて読まれてから価格が読まれたりしてしまう

WCAG 2.2
SC 1.3.1ASC 1.3.2A
必須とする規格
Section 508 · EN 301 549(EU) · JIS X 8341-3
問題あり <tr><td>$18</td><td>$32</td>…</tr>
アクセシビリティの問題を示した図: 全盲:トートはいくら?
01

問題

スクリーンリーダー利用者には、メールマガジンの商品がデータの表として読まれたり、商品名がすべて読まれてから価格が読まれたりするため、どの価格がどの商品のものか分からない

02

試してみる

メールを見ずに、読み上げだけでリネントートの価格を探してみましょう

  • 問題1: 下の欄に、商品の欄の先頭からスクリーンリーダーが読む内容が並びます。商品は何として読まれていますか?

  • 問題2: メールの見た目は同じです。下の欄を読んで、トートの価格はどれか分かりますか?

  • 修正を適用します。 もう一度下の欄を読むと、各商品がまとめて読まれてから、次の商品に移ります。

問題あり 修正できますか?

先頭から読むと、スクリーンリーダーの読み上げ:

  1. 表、3列、1行
  2. 列見出し、ホーローマグ、$18
  3. 列見出し、リネントート、$32
  4. 列見出し、斑点マグ、$24
  5. 表の外

再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。

03

修正方法

表を意識させず、商品を一つずつまとめて読ませる

修正前

各列が見出しのセル

<table class="row">  <tr>    <th class="columns">      <table>        <tr>          <th>            <img src="enamel-mug.jpg" alt="">            <p>Enamel mug</p>            <p>$18</p>          </th>        </tr>      </table>    </th>    <th class="columns">      <table>        <tr>          <th>            <img src="linen-tote.jpg" alt="">            <p>Linen tote</p>            <p>$32</p>          </th>        </tr>      </table>    </th>    …  </tr></table>
問題点3点

順序は正しく、各商品は一つのセルにまとまって読まれます。問題はセルの種類です。

  • 各列が th のため、ブラウザーは外側の表をデータ表として扱い、スクリーンリーダーは商品の前に、行数と列数とともに表を読み上げる。
  • 各商品は、何の見出しでもないのに列見出しとして読まれる。
  • 内容を配置するだけの表であることを示す role="presentation" が、どの表にもない。
修正後

表をpresentationにし、一つのセルに一つの商品

<table class="row" role="presentation">  <tr>    <td class="columns">      <table role="presentation">        <tr>          <td>            <img src="enamel-mug.jpg" alt="">            <p>Enamel mug</p>            <p>$18</p>          </td>        </tr>      </table>    </td>    <td class="columns">      <table role="presentation">        <tr>          <td>            <img src="linen-tote.jpg" alt="">            <p>Linen tote</p>            <p>$32</p>          </td>        </tr>      </table>    </td>    …  </tr></table>
修正の手順3ステップ
  1. セルはすべて td にする。格子の中に見出しになるものはないため、th は使わない。
  2. 各商品の写真、名前、価格を一つのセルに入れる。商品はまとめて読まれ、読み終わってから次の商品に移る。
  3. 入れ子の表も含めて、すべての表に role="presentation" を付ける。この役割は表自身の行とセルには及ぶが、その中に入れた表には及ばない。スクリーンリーダーは三つの商品をただの内容として読み、表は読み上げない。

これで二つの修正前の例はどちらも直り、1.3.1と1.3.2を満たします。ただし、外枠、余白、ボタンなど、メールが表で描くものも含め、テンプレートがレイアウトのために書き出す表すべてにこの役割が必要です。

この方法を選ぶ理由:ソースは読む順に書く

混同しやすいもの
04

修正の確認

5項目、マウス不要

確認方法: スクリーンリーダー、スタイルを無効化、拡大表示

5件中0件を確認済み

OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。テンプレートを変更した際は、再度確認します。

制限

このサンプルは、どのメールでも同じ結果になることを保証するものではありません。メールソフトによって表示は異なり、Webメールはメールを自分のページの中に表示するため、顧客が使うメールソフトで確認してください。役割のない表が表として読まれるかどうかは、ブラウザーとスクリーンリーダーそれぞれの推測しだいです。表ではなくCSSのレイアウトによって画面の順序が変わるページの読み上げ順序は、見た目と食い違う読み上げ順序で扱っています。

よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。

EaseWebのサービス

修正した問題を、次のリリースで再発させない

このガイドのような修正方法を、コーディングエージェントが従うルールと、CIのチェックに組み込みます。あわせて定期的に、キーボードとスクリーンリーダーで手動の再テストを行います。

サービス内容を見る