0Pricing
React Academy · レッスン

オートコンプリートウィジェットのアクセシビリティ

aria-autocomplete、aria-expanded、role=listbox、role=optionを適用し、スクリーンリーダーに対応したウィジェットにします

「オートコンプリートウィジェットのアクセシビリティ」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

WAI-ARIAコンボボックスパターン

WAI-ARIAのコンボボックスパターンでは、オートコンプリートウィジェット用のロールとプロパティの組み合わせが定義されています。コンボボックスは、リストボックスのポップアップと組み合わせた入力要素です。このパターンにより、視覚的なUIを見られないユーザーにも、スクリーンリーダーがインタラクティブな動作、利用可能なオプション、現在の選択項目を正しく読み上げられるようになります。

ラッパーのrole=combobox

入力欄をdivでラップし、role="combobox"を設定します。これにより、支援技術に対して、入力欄に関連付けられたポップアップリストがあることを伝えられます。このラッパーにaria-expanded={isOpen}を設定し、候補リストが現在表示されているか非表示かをスクリーンリーダーに伝えます。

入力欄のARIA属性

入力要素自体には、aria-autocomplete="list"(ポップアップに候補のリストが含まれる)、aria-haspopup="listbox"(クリックまたは入力によってリストボックスが開く)、aria-expanded={isOpen}、およびドロップダウンリスト要素のidを指すaria-controls="suggestion-list-id"を設定します。

aria-activedescendant

入力欄のaria-activedescendantは、現在ハイライトされているオプションのidを指します。selectedIndexが0の場合は、aria-activedescendant="option-0"を設定します。スクリーンリーダーはこれを使って、実際のフォーカスを入力欄から移動させずに、どの項目がアクティブかを読み上げます。項目が選択されていない場合は、属性を削除するか空文字列に設定します。

候補リスト:role=listbox

ドロップダウンのコンテナ要素にはrole="listbox"と、入力欄のaria-controlsに一致する一意のidを設定します。このロールにより、アクセシビリティツリーはこの要素を選択可能なオプションのリストとして認識します。リストボックスには、入力欄のaria-activedescendantを介して間接的にフォーカスが当たります。

各候補:role=option

すべての候補項目にはrole="option"と、option-0、option-1などの一意のidを設定します。現在ハイライトされている項目を示すため、aria-selected={index === selectedIndex}を追加します。ユーザーが矢印キーで移動すると、スクリーンリーダーはオプションの内容と、それが選択されているかどうかの両方を読み上げます。

スクリーンリーダーによる読み上げ

ユーザーがArrowDownを押してaria-activedescendantがoption-1に更新されると、VoiceOverは「React hooks、5件中2件」のように読み上げます。スクリーンリーダーは、ARIAマークアップからオプションのテキストとリスト内の位置を自動的に読み取ります。キーボード操作に追加のライブリージョンは必要ありません。

VoiceOverとNVDAを使ったテスト

macOSではVoiceOver(Cmd+F5で切り替え)を、WindowsではNVDA(無料でダウンロード可能)を使ってテストします。入力欄に移動して入力を始めます。スクリーンリーダーがコンボボックスのロール、見つかった結果の件数、矢印キーで移動した各オプションを読み上げることを確認します。WAI-ARIA Authoring Practices Guideの例と動作を比較します。

非同期ローディング用のライブリージョン

候補が非同期で読み込まれる場合は、aria-live="polite"とaria-atomic="true"を設定した、視覚的には非表示のdivを追加します。読み込みが完了したら、そのテキスト内容を「5件の結果が見つかりました」や「結果が見つかりませんでした」のように更新します。スクリーンリーダーは現在の読み上げが終わった後にこのメッセージを読み上げるため、ユーザーの操作を中断せずに情報を伝えられます。

WAI-ARIA Authoring Practices Guide

w3.org/WAI/ARIA/apgにあるWAI-ARIA Authoring Practices Guide(APG)には、動作するコード例とキーボード操作の詳細な仕様を含む、コンボボックスパターン専用のページがあります。オートコンプリート、ダイアログ、タブなどのインタラクティブなウィジェットを実装する際は、完全なアクセシビリティ対応を確実にするため、必ずAPGを参照してください。

aria-labelとプレースホルダー

表示されるラベル要素がない場合は、入力欄にaria-labelを設定します:aria-label="Search suggestions"。ラベルとしてplaceholderだけに頼らないでください。placeholderはユーザーが入力すると消え、すべてのスクリーンリーダーで一貫して読み上げられるわけではありません。htmlForを設定した表示用のlabel要素が、常に最適な選択肢です。

aria-activedescendantの目的

オートコンプリートの入力欄に設定するaria-activedescendant属性には、どのような目的がありますか?

レッスンのまとめ:オートコンプリートのアクセシビリティ

ラッパーにrole="combobox"を、入力欄にaria-autocomplete="list"を設定し、aria-expanded、aria-controls、aria-activedescendantで入力欄と候補リストを関連付けます。各オプションにはrole="option"、一意のid、aria-selectedが必要です。非同期の結果件数を伝えるため、aria-liveリージョンを追加します。

よくある質問

「オートコンプリートウィジェットのアクセシビリティ」レッスンは無料ですか?

はい。「オートコンプリートウィジェットのアクセシビリティ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「オートコンプリートウィジェットのアクセシビリティ」で何を学びますか?

aria-autocomplete、aria-expanded、role=listbox、role=optionを適用し、スクリーンリーダーに対応したウィジェットにします ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「オートコンプリートウィジェットのアクセシビリティ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 候補リスト付きの制御入力
  2. 候補リストのキーボードナビゲーション
  3. デバウンス付き非同期候補
  4. オートコンプリートウィジェットのアクセシビリティ
← React Academyに戻る