トピックを検索
候補を読み上げず、キーボードで選べないオートコンプリート
入力欄の下に出る候補が、クリック処理やCSSの強調表示だけの普通のリストのため、キーボードで選べず、スクリーンリーダーは候補が出たことも伝えません。
li.classList.toggle('active', i === active) 問題
キーボード利用者は候補を選べず、スクリーンリーダーの利用者は、候補が出たことも、どれが強調されているかも、一致しなかったことも分かりません。
旅行サイトの予約フォームに「行き先」の欄があります。「por」と入力すると、欄の下にPorto、Portland、Portsmouthのリストが開き、その上に「候補3件」と表示されます。マウスならPortlandをクリックすれば欄に入ります。キーボードでは、作り方によって結果が違います。ある作りでは矢印キーが何もせず、Tabキーで欄から「検索」ボタンへ移ってしまい、リストはまったく使えません。別の作りでは、下矢印キーで青い強調が都市を移動し、Enterキーで選べますが、スクリーンリーダーは移動しても何も言わないか、「por」を読み返すだけです。「pxq」と入力すると行が「行き先が見つかりません」に変わりますが、これも読み上げられません。
達成基準2.1.1は、マウスでできることをキーボードでもできるよう求めています。一つ目の作りでは、候補はクリック処理を付けた li 要素で、フォーカスを受け取れず、どのキーも届きません。達成基準4.1.2は、操作部品の役割と状態、利用者が変えられる値を支援技術が取得できるよう求めています。二つ目の作りでは、入力欄は普通のテキスト欄のまま、リストには役割がなく、強調はCSSのクラスです。キーボードでは動きますが、どの候補が強調されているか、リストが開いているかを、ブラウザーはスクリーンリーダーに伝えられません。件数の行はステータスメッセージで、達成基準4.1.3はフォーカスを動かさずに伝えることを求めていますが、普通の p 要素です。
入力候補の付いた欄は、行き先、住所、商品など、フォームのいちばん大事な手順の入り口であることがよくあります。スマートフォンでは画面キーボードの下にリストが開くことがあり、画面が見える人も、選べるものがあるかを件数の行で知ることになります。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 手の操作が限られる キーボードやスイッチの利用者は候補に届かないため、名前を最後まで正確に入力するしかなく、つづりを一文字間違えると何も一致しません。
- 視覚を使わない スクリーンリーダーの利用者には、候補が出たことも、どれが強調されているかも、何も一致しなかったことも伝わらず、途中までの語をそのまま送信してしまうことがあります。
- 視覚が限られる 入力欄を拡大している画面拡大ソフトの利用者には、その下でリストが開いたことが見えないことがあります。薄い背景色だけの強調は、強制配色で消えることがあります。
- 言語・認知・学習の能力が限られる 地名や商品名のつづりを候補に頼っている人は、リストから選べないと、その助けを失います。
スキャンはページを読み込み、ラベル付きのテキスト欄を見つけます。リストは誰かが入力するまで存在しないため、確認するものがありません。リストがあっても、ARIAのないマークアップには間違えようのある属性がありません。AIにオートコンプリートを頼むと、二つ目の作りそのもの、つまりkeydownの処理と active クラスを書くことがよくあります。リストに role="listbox" を付けても、入力欄に aria-activedescendant がなければ、強調は読み上げられないままです。下矢印キーでリストへフォーカスを移す例もあり、その場合は次の文字を入力しても入りません。リストが使えるかは、入力し、矢印キーを押し、読み上げを聞いて初めて分かります。
試してみる
「行き先」に「por」と入力し、下矢印キーを押してから、Enterを押してください。
マウスを使わずにPortlandを選べますか?入力や移動のたびのスクリーンリーダーの読み上げが下の欄に出ます。何も一致しない「pxq」も試してください。
問題あり 修正できますか?
スクリーンリーダーの読み上げ:
(Tabで「行き先」へ移動)
修正方法
入力欄をコンボボックスにし、矢印キーでoptionとして伝わる候補を移動できるようにして、リストが示す内容を読み上げます。
- 1フォーカスは入力欄に残し、矢印キーで支援技術にも分かる強調を動かす。
- 2リストが開いているかを伝え、件数や一致なしの行を読み上げる。
- 3Enterで選び、Escapeで閉じる。クリックやタップでも同じように選べる。
クリックでしか選べない候補
<label for="dest">行き先</label><input id="dest" type="text" autocomplete="off"><p id="dest-count"></p><ul id="dest-list" class="suggestions" hidden></ul>ARIAのコンボボックス
<label for="dest">行き先</label><input id="dest" type="text" role="combobox" autocomplete="off" aria-autocomplete="list" aria-expanded="false" aria-controls="dest-list"><p id="dest-count" role="status"></p><ul id="dest-list" role="listbox" aria-label="行き先の候補" hidden></ul>この方法を選ぶ理由:クラスではなく状態から見た目を決める
候補はクリック処理を付けたリスト項目です。フォーカスを受け取れず、どのキーも届かず、候補が出たこともスクリーンリーダーに伝わりません。
フォーカスは入力欄から離れないため、続けて文字を入力できます。入力欄はリストが開いているかを伝えるコンボボックスとして読まれ、aria-activedescendant が強調中の候補を指すので、矢印キーを押すたびにその都市が読み上げられます。Enterキーでもクリックでも欄に入り、Escapeキーや欄を離れる操作でリストが閉じます。件数の行は最初からページにあるステータス領域なので、入力が止まると「候補3件」や「行き先が見つかりません」が読み上げられます。強制配色では背景色が消えますが、透明の輪郭線が見える線になります。
どちらも2.1.1と4.1.2を満たします。ARIAのコンボボックスを使ってください。どのブラウザーでも同じように動き、一覧は拡大に合わせて大きくなり、強制配色向けにも描け、件数を表示して読み上げられます。datalistの不足はブラウザー側にあり、自分のコードでは埋められません。代わりに、上のスクリプトを自分で確認し、保守する必要があります。datalistは、利用するブラウザーとスクリーンリーダーが分かっている社内ツールなど、上の不足が利用者に届かない場面での、単純な語の一覧の近道としてなら使えます。
一覧が短く、答えが必ずその中のどれかになる場合、たとえば国の選択では、コンボボックスより標準の select のほうが合うことがあります。オートコンプリートは、一覧が長い場合や、一覧にない語を入力することがある場合に向いています。
DOMのフォーカスをリストへ移さないでください。フォーカスが候補にあると、次に入力した文字はどこにも入らず、スクリーンリーダーも編集のモードを離れます。フォーカスは入力欄に残し、aria-activedescendant を動かします。リストに aria-live も付けないでください。入力のたびに都市がすべて読み上げられます。
件数の行は、最初の入力より前からページにあり、フレームワークがリストと一緒に作り直す部分の外に置きます。そうでないと、最初の変化が読み上げられません。同じ文言を二度書き込むと何も読まないスクリーンリーダーもあります。「候補3件」のあとに再び「候補3件」が続く可能性があるなら、書き込む前にいったん空にしてください。
UIライブラリーのコンボボックスには、このパターンを実装したものもあれば、二つ目の修正前の作りにアクセシブルな名前を付けただけのものもあります。ドキュメントを信用する前に、下の手順のとおり、入力し、矢印キーを押し、読み上げを聞いて確認してください。ほかのドロップダウンの問題は、「Tabで閉じてフォーカスを見失う検索パネル」と「件数が読み上げられない検索・絞り込み結果」で扱っています。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない5つの確認
確認方法: キーボード、スクリーンリーダー、ズーム、強制配色
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通の入力欄やオートコンプリートのコンポーネントを変更した際は、再度確認します。
制限
これはリスト型のオートコンプリートの出発点となる実装例で、文字を欄の中で補完するもの、グリッドやツリーを開くもの、複数を選べるものには当てはまりません。候補の取得と照合の処理は省略しています。実際のデータを使い、対応するブラウザーと支援技術で操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
参考資料
- ARIA APG: combobox(新しいタブで開きます)
- ARIA APG: combobox-autocomplete-list(新しいタブで開きます)
- WCAG Understanding: keyboard(新しいタブで開きます)
- WCAG Understanding: name-role-value(新しいタブで開きます)
- WCAG Understanding: status-messages(新しいタブで開きます)
- developer.mozilla.org: combobox_role(新しいタブで開きます)
- developer.mozilla.org: datalist(新しいタブで開きます)
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。