トピックを検索
キーボードで開けず、読み上げられないカスタムのドロップダウン
デザインに合わせてdivとリスト項目で作り直したドロップダウンが、クリックしか受け付けないか、クラスで描いた強調を動かすだけのため、キーボードでは選べず、スクリーンリーダーには役割も値も選択肢も伝わりません。
<div class="select" tabindex="0"> 問題
キーボード利用者はドロップダウンを開くことも選ぶこともできず、スクリーンリーダーの利用者には役割も今の値も選択肢も伝わらないため、何を選んでいるのか分かりません。
あるショップの商品ページで、「カートに入れる」ボタンの上に「サイズ」のドロップダウンがあります。角の丸い枠に山形の印と「サイズを選択」が表示され、クリックするとS、M、L、XLの一覧が開きます。キーボードで操作する人は、作り方によって二つのどちらかに出会います。一つ目では、Tabキーを押すと商品名から「カートに入れる」へ飛び、ドロップダウンにはフォーカスが当たりません。サイズを選べないため、カートに入れることもできません。二つ目では、フォーカスは当たり、Enterキーで開き、矢印キーで強調がサイズを移動します。しかしスクリーンリーダーは「サイズを選択」と読むだけで、役割も開けることも伝えず、強調が動いても何も言わず、Enterキーを押したあともどのサイズを選んだか伝えません。
達成基準2.1.1は、マウスでできることをキーボードでもできるよう求めています。一つ目の作りでは、開くための部品はクリック処理を付けた div で、フォーカスを受け取れず、それにも選択肢にもどのキーも届きません。達成基準4.1.2は、操作部品の名前、役割、値と、利用者が変えられる状態を支援技術が取得できるよう求めています。二つ目の作りではキーボードで動きますが、要素に役割がなく、名前は表示中の文字そのもので、一覧が開いていることも伝わらず、強調はCSSのクラスです。ブラウザーには伝えるものがなく、スクリーンリーダーの利用者は推測で操作するしかありません。
ドロップダウンは、サイズ、配送先の国、受け取りの時間帯など、ほかの操作より先に済ませる必要がある手順であることがよくあります。使えないドロップダウンは、その作業全体を止めます。スマートフォンでは標準のselectが大きな行のシステムの選択画面を開きますが、作り直したものはその画面も使えなくなります。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる キーボードやスイッチの利用者は一覧を開けないか、Enterキーで何が選ばれるか分からないまま移動することになり、サイズのような必須の選択でフォーム全体が止まります。
- 視覚を使わない スクリーンリーダーの利用者には、役割も値もないまま表示中の文字だけが読まれ、強調が動いても何も聞こえないため、選ぶ部品であることも、何が選ばれているかも、ほかに何があるかも分かりません。
- 視覚が限られる 薄い背景色だけの強調は強制配色で消えることがあり、背景色だけで描いた閉じたドロップダウンは操作部品に見えなくなることがあります。
- 言語・認知・学習の能力が限られる ドロップダウンに見えるのにそのキーで動かない部品は分かりにくく、サイズが選ばれていないことに気づかないことがあります。
スキャンが見るのは、文字の入った div と、li 要素の並ぶ ul です。役割もARIAもないため、スキャナーが知っている規則に反するところがなく、一覧はクリックするまで隠れています。tabindex の有無だけを見るスキャンは、二つ目の作りを合格にします。AIに「デザインしたドロップダウン」を頼むと、まさにこの二つの作りを書くことがよくあります。一覧に role="listbox" を付けても、開く部品に役割、値、aria-activedescendant がなければ、強調は読み上げられないままです。使えるかどうかは、Tabキーで移動し、開き、矢印キーを押し、読み上げを聞いて初めて分かります。
試してみる
キーボードだけでサイズを選んでみてください。Tabで「サイズ」へ移動し、Enterで開き、下矢印キー、Enterの順に押します。
マウスを使わずにサイズを選べますか?問題1では「サイズ」にたどり着くこともできません。Tabキーが飛ばしてしまうことが、この問題です。代わりにクリックしてみてから、問題2に切り替えてください。移動や選択のたびのスクリーンリーダーの読み上げが下の欄に出ます。
問題あり 修正できますか?
コットンの定番Tシャツ
- S
- M
- L
- XL
スクリーンリーダーの読み上げ:
(Tabで「サイズ」へ移動)
修正方法
ドロップダウンを標準のselectにするか、役割、値、強調中の選択肢が支援技術に伝わり、selectと同じキーで動くコンボボックスにします。
- 1閉じたドロップダウンにTabキーで届き、名前、役割、値が読まれる。
- 2selectと同じキーで開き、選択肢を移動し、選べる。
- 3強調中の選択肢は、見た目だけでなくコードでも伝える。
クリックでしか開けないドロップダウン
<span id="size-label">サイズ</span><div class="select"> <div class="select-trigger">サイズを選択</div> <ul class="select-options" hidden> <li>S</li> <li>M</li> <li>L</li> <li>XL</li> </ul></div>見た目を整えた標準のselect
<label for="size">サイズ</label><span class="select-box"> <select id="size" name="size"> <option value="">サイズを選択</option> <option value="s">S</option> <option value="m">M</option> <option value="l">L</option> <option value="xl">XL</option> </select></span>この方法を選ぶ理由:まずHTMLの要素を使う
開く部品も選択肢も、クリック処理を付けた div とリスト項目です。どれもフォーカスを受け取れないため、Tabキーはドロップダウンを飛ばし、どのキーでも開きません。
selectはブラウザーがTabキーの移動先にし、各環境で決まったキーで開き、矢印キーや頭文字の入力で選択肢を移動し、名前、役割、値、各選択肢をスクリーンリーダーに伝えます。スマートフォンではシステムの選択画面が開きます。見た目を変えるのは閉じた枠だけで、枠線、山形の印、フォーカスの輪は自分で描き、どれも強制配色で残ります。
どちらも2.1.1と4.1.2を満たします。標準のselectを使ってください。スクリプトなしで同じ役目を果たし、端末ごとのキー操作、選択画面、読み上げをブラウザーが用意します。作り直したものでは、これに並べません。ARIAのコンボボックスは、色見本やサイズ横の在庫表示など、selectに入らないものを選択肢に出す必要がある場合だけ作り、キー操作、状態、タッチ操作の確認と保守を自分で引き受けてください。
多くのデザインは、閉じた枠の見た目を整えるだけで足ります。開いた一覧はシステムが描くため、スマートフォンや画面拡大ソフトにも合います。新しいChromium系のブラウザーでは appearance: base-select で開いた一覧の見た目も変えられ、ほかのブラウザーでは通常のselectに戻ります。これは追加の改善として扱い、戻った場合の表示も確認してください。
ドロップダウンの横には、見えるラベルを置きます。「サイズを選択」のような最初の選択肢は、何かを選ぶまでの値であり、名前ではありません。selectでは value="" を付け、サイズが必須なら欄を required にします。
古いjQueryのプラグインの一部のように、標準のselectを隠して作り直したものを重ねると、両方の問題を抱えます。本物のselectには届かず、描いたほうは修正前のどちらかです。UIライブラリーのドキュメントを信用する前に、下の手順のとおり、Tabキーで移動し、開き、矢印キーを押し、読み上げを聞いて確認してください。選択肢を選んだだけでフォームを送信したり別のページを開いたりしてはいけません。「操作するだけでページが変わるドロップダウンと入力欄」を参照してください。長い一覧を入力で絞り込む場合は、「候補を読み上げず、キーボードで選べないオートコンプリート」で扱っています。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない5つの確認
確認方法: キーボード、スクリーンリーダー、ズーム、強制配色
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のドロップダウンのコンポーネントを変更した際は、再度確認します。
制限
これは一つだけを選ぶドロップダウンの出発点となる実装例で、複数の選択、グループ分けした選択肢、スクロールに合わせてサーバーから読み込む一覧には当てはまりません。実際の選択肢を使い、対応するブラウザーと支援技術で操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。