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

キーボードでセルを移動・編集できないデータグリッド

値を並べた表のセルが、クリックしたときだけ入力欄に変わります。role="grid" があってもなくても、キーボードではセルに届かず、クリックで開く入力欄にも名前がありません。

WCAG 2.2
SC 2.1.1ASC 4.1.2A
必須とする規格
Section 508 · EN 301 549(EU) · JIS X 8341-3
問題あり cell.onclick = () => edit(cell);
アクセシビリティの問題を示した図: 手の操作:価格はどう変えるの?
01

問題

キーボード利用者は表のセルに届かず値を変えられず、スクリーンリーダー利用者には、値を変えられることも、開いた入力欄が何のためのものかも伝わりません。

02

試してみる

キーボードだけで、紙コップの価格を0.15に変えてください。

  1. 問題1:Tabキーを押します。フォーカスは表を素通りして「変更を保存」へ進むため、どの価格にも届きません。価格をクリックすると入力欄が開きますが、品目も列も読まれません。
  2. 問題2:同じ表に role="grid" を足しただけです。Tabキーは今もすべてのセルを飛ばし、矢印キーを押そうにもフォーカスの置き場所がありません。クリックで開く入力欄も、品目と列は読まれないままです。
  3. 修正を適用します。グリッドでは、Tabキーを1回押して矢印キーで移動し、EnterキーかF2キーで編集、Enterキーで確定、Escapeキーで取り消します。

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

在庫表

品目価格在庫数
オーツミルク2.4036
紙コップ0.12500
エスプレッソ豆14.008

スクリーンリーダーの読み上げ:

(Tabで表へ移動するか、価格をクリック)

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

03

修正方法

編集できるセルはすべてキーボードで届いて開けるようにし、セルを編集する入力欄に行と列から名前を付けます。

  1. 1編集できるセルはすべて、キーボードで届いて編集できる。
  2. 2セルを編集する入力欄には、行と列から名前を付ける。
  3. 3role="grid" を使うなら、ロールが示すとおり、Tabの移動先1つ、矢印キー、各セルに入るキーをすべてそろえる。そろえないなら、セルごとに入力欄を置く。
修正前

クリックでしか開かないセルの表

<h2 id="stock-title">在庫表</h2><table class="sheet"  aria-labelledby="stock-title">  <thead>    <tr>      <th scope="col">品目</th>      <th scope="col">価格</th>      <th scope="col">在庫数</th>    </tr>  </thead>  <tbody>    <tr>      <th scope="row">オーツミルク</th>      <td>2.40</td>      <td>36</td>    </tr>    <tr>      <th scope="row">紙コップ</th>      <td>0.12</td>      <td>500</td>    </tr>    <tr>      <th scope="row">エスプレッソ豆</th>      <td>14.00</td>      <td>8</td>    </tr>  </tbody></table><button type="button">変更を保存</button>
修正後

セルごとに入力欄を置く

<h2 id="stock-title">在庫表</h2><table class="sheet"  aria-labelledby="stock-title">  <thead>    <tr>      <th scope="col" id="col-item">品目</th>      <th scope="col" id="col-price">価格</th>      <th scope="col" id="col-stock">在庫数</th>    </tr>  </thead>  <tbody>    <tr>      <th scope="row" id="row-oat">オーツミルク</th>      <td>        <input value="2.40"          aria-labelledby="row-oat col-price">      </td>      <td>        <input value="36"          aria-labelledby="row-oat col-stock">      </td>    </tr>    <tr>      <th scope="row" id="row-cups">紙コップ</th>      <td>        <input value="0.12"          aria-labelledby="row-cups col-price">      </td>      <td>        <input value="500"          aria-labelledby="row-cups col-stock">      </td>    </tr>    <tr>      <th scope="row" id="row-beans">エスプレッソ豆</th>      <td>        <input value="14.00"          aria-labelledby="row-beans col-price">      </td>      <td>        <input value="8"          aria-labelledby="row-beans col-stock">      </td>    </tr>  </tbody></table><button type="button">変更を保存</button>

この方法を選ぶ理由:まずHTMLの要素を使う

AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。

04

修正の確認

マウスを使わない4つの確認

確認方法: キーボード、スクリーンリーダー、強制配色、ズーム

4件中0件を確認済み

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

制限

このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。グリッドのスクリプトは最小限の例で、入力で始まる編集、Page UpとPage Down、選択、コピーと貼り付け、必要なときの行の読み込みがありません。列での並べ替えは別の問題で、並べ替えた列とその向きを伝えるトピックで扱います。同じTabの移動先1つのパターンをサイドバーで使う例は、キーボードで開けず、階層も伝わらないツリービューにあります。データグリッドの部品は、ライブラリーによって作りがさまざまです。使う前に、すべてのセルに届き、すべてのキーを扱っているかを確かめます。対象とする支援技術で、一連の操作全体をテストしてください。

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

コードを更新しても、使いやすさを保つために

ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。

再テストの進め方