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

キーボードで入れず、開いても何も伝えない操作メニュー

「詳細」ボタンを押すと、クリックできるdivを並べたメニューが開きます。しかしボタンはメニューについて何も伝えず、フォーカスもボタンに残ったままです。各操作には役割がなく、Tabでも矢印キーでも移動できないため、キーボードでは操作に届かず、スクリーンリーダーには何かが開いたことが伝わりません。

WCAG 2.2
SC 2.1.1ASC 4.1.2A
必須とする規格
Section 508 · EN 301 549(EU) · JIS X 8341-3
問題あり <div class="item">領収書をダウンロード</div>
アクセシビリティの問題を示した図: 手の操作:メニューにはどう入るの?
01

問題

キーボード利用者は「詳細」のメニューを開けても中の何にも届かず、スクリーンリーダー利用者には、ボタンがメニューを開くことも、メニューが開いたことも伝わらない

02

試してみる

キーボードだけで「詳細」を開き、「領収書をダウンロード」まで移動してみましょう

  • 問題1: Tabキーで「詳細」へ移り、Enterキーを押します。メニューは開きますが、フォーカスはボタンに残り、下の欄には新しく何も読まれず、次のTabキーはメニューを飛ばします。

  • 問題2: 同じdivに、メニューのロールを足しただけです。ボタンがメニューを開くことは読まれるようになりましたが、Enterキーを押してもフォーカスは残り、Tabキーでも矢印キーでも項目に届きません。

  • 修正を適用します。 メニューボタンでは、Enterキーで最初の操作へフォーカスが移り、矢印キー、Home、End、Escapeが使えます。開閉ボタンでは、「詳細」の次のTabキーでリストの中へ入ります。

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

注文1042

10月14日にお届け済み

すべての注文を見る

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

(Tabで「詳細」へ移動)

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

03

修正方法

ボタンで何かを開くことと開閉の状態を伝え、操作はすべて、フォーカスと矢印キーを受けるメニューか、ボタンのすぐ後ろに並べた普通のボタンにして、キーボードで届くようにする

  1. 1ボタンは、メニューを開くことか、展開されているかどうかを伝え、開閉するたびに伝え直す。
  2. 2どの操作も、キーボードで届くボタン、リンク、メニュー項目にする。
  3. 3role="menu" を使うなら、そのロールが約束する動き(中へ移るフォーカス、矢印キーでの移動、Escapeで戻ること)をすべて実装する。実装しないなら、普通のボタンを使う。
修正前

ボタンと、クリックできるdivのドロップダウン

<article class="order">  <h2>注文1042</h2>  <p>10月14日にお届け済み</p>  <div class="actions">    <button type="button" class="actions-button">詳細</button>    <div class="actions-menu" hidden>      <div class="item" data-action="buy-again">もう一度購入</div>      <div class="item" data-action="return">返品する</div>      <div class="item" data-action="invoice">領収書をダウンロード</div>      <div class="item" data-action="report">問題を報告</div>    </div>  </div></article>
修正後

メニューボタン

<article class="order">  <h2>注文1042</h2>  <p>10月14日にお届け済み</p>  <div class="actions">    <button type="button" class="actions-button" id="order-1042-actions" aria-haspopup="menu" aria-expanded="false" aria-controls="order-1042-menu">詳細</button>    <div class="actions-menu" id="order-1042-menu" role="menu" aria-labelledby="order-1042-actions" hidden>      <button type="button" role="menuitem" tabindex="-1" data-action="buy-again">もう一度購入</button>      <button type="button" role="menuitem" tabindex="-1" data-action="return">返品する</button>      <button type="button" role="menuitem" tabindex="-1" data-action="invoice">領収書をダウンロード</button>      <button type="button" role="menuitem" tabindex="-1" data-action="report">問題を報告</button>    </div>  </div></article>

04

修正の確認

5項目、マウス不要

確認方法: キーボード、スクリーンリーダー、強制配色、拡大表示

5件中0件を確認済み

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

スクリーンリーダーでの aria-expanded、aria-haspopup="menu"の読まれ方

制限

このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。スクリプトは最小限の例で、ページにメニューが1つだけの場合を想定し、先頭文字での移動、使えない項目、サブメニューはありません。サイト上部に並ぶリンクのドロップダウンはナビゲーションで、別のパターンです。マウスでしか開かないか、開閉が伝わらないドロップダウンメニューで扱っています。サイズのように値を選ぶドロップダウンはセレクトで、キーボードで開けず、読み上げられないカスタムのドロップダウンで扱っています。右クリックや長押しでしか開かないメニューは右クリックや長押し、スワイプでしか出ない操作メニューで扱っています。3つの点のようにアイコンだけのボタンには名前も必要で、名前がないアイコンだけのボタンで説明しています。対象とする支援技術で、一連の操作全体をテストしてください。

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

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

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

再テストの進め方