ARIA: listbox ロール
listbox ロールは、1 つまたは複数の静的なアイテムをユーザーが選択できるリストに使用します。HTML の <select> 要素とは異なり、画像を含むことができます。
解説
listbox ロールは、HTML の <select> 要素と同様に、ユーザーが 1 つまたは複数の静的なアイテムを選択できるリストを生成する要素を識別するために使用されます。<select> とは異なり、リストボックスには画像を含めることができます。リストボックスには、ロールが option である子要素、またはロールが group であり、ロールが option の子要素を含む子要素を含むことができます。
HTML の選択要素や、1 アイテムしか選択できない場合はラジオボタンのグループ、複数アイテムを選択できる場合はチェックボックスのグループを使用することを強くお勧めします。 なぜなら、全ての子孫に対するフォーカスを管理するためには、キーボードでの操作がたくさん必要であり、ネイティブの HTML 要素はこの機能をただで提供してくれるからです。
listbox ロールを持つ要素は、暗黙的な aria-orientation の値として vertical(垂直)を持ちます。
Tab キーでリストに移動すると、他に選択されているアイテムがなければ、リストの最初のアイテムが選択されます。↑/↓ でリスト内を移動でき、Shift + ↑/↓ を押すと、移動しながら選択範囲を拡大できます。1 文字以上の文字を入力すると、リストアイテム間を移動できます(その文字と同じ文字で始まるそれぞれのアイテム内を巡回し、複数の文字を入力するとそれ全体で始まる最初のアイテムへ移動します)。現在のアイテムに関連付けられたコンテキストメニューがある場合、Shift + F10 を押すとそのメニューが表示されます。リストアイテムにチェックボックスがある場合、スペースキーを使用してチェックボックスのオン/オフを切り替えることができます。選択可能なリストアイテムについては、スペースキーで選択状態を切り替え、Shift + スペースキーで連続したアイテムを選択し、Ctrl + 矢印キーで選択せずに移動し、Ctrl + スペースキーで連続していないアイテムを選択できます。すべてのアイテムを選択するには、チェックボックスやリンクなどの方法を使用することをお勧めします。また、この操作のショートカットキーとして Ctrl + A を使用することもできます。
リストボックスロールが要素に追加されるか、そのような要素が可視になると、スクリーンリーダーは、リストボックスがフォーカスを得たときにリストボックスのラベルとロールをアナウンスします。 選択肢やアイテムがリスト内でフォーカスされると、次にそれがアナウンスされ、スクリーンリーダーがサポートしていれば、続いてリストでのアイテムの位置が示されます。 リスト内でフォーカスが移動すると、スクリーンリーダーは関連するアイテムをアナウンスします。
関連する ARIA のロール、ステート、プロパティ
関連するロール
option-
1 つ以上のネストされた選択肢が必要です。 選択された全ての選択肢では、
aria-selectedがtrueに設定されています。 選択されていない全ての選択肢では、aria-selectedがfalseに設定されています。 選択肢が選択可能でない場合は、aria-selectedを省略します。 list-
リストアイテム (
listitem) 要素を含むセクション。
ステートとプロパティ
aria-activedescendant-
リストボックス内で現在アクティブな要素の
id文字列を保持します。 それが選択肢要素である場合、その選択肢のaria-selectedの値がtrueであるかどうかに関係なく、それは最後にインタラクトされた選択肢のidになります。 複数選択可能なリストボックス内であっても、1 つのidの値のみを取ります。idがリストボックスの DOM 子孫を参照していない場合、そのidはaria-owns属性の ID の中に含まれている必要があります。 aria-owns-
これは、リストボックスの DOM 子要素ではない要素 IDs のスペース区切りのリストです。 ここにリストされている IDs は、他の要素の
aria-owns属性にもリストできません。 aria-multiselectable-
ユーザーが複数の選択肢を選択できる場合は、これを含めて
trueに設定します。trueに設定されている場合、選択可能な全ての選択肢には、aria-selected属性が含まれ、trueまたはfalseに設定されているべきです。 選択可能でない選択肢は、aria-selected属性を持つべきではありません。falseまたは省略されている場合、いずれかの選択肢が選択されているならば、現在選択されている選択肢のみがaria-selected属性を必要とし、trueに設定されている必要があります。 aria-required-
空でない文字列値を持つ選択肢を選択する必要があることを示す論理属性。
aria-readonly-
ユーザーは、選択肢が選択されているかいないかを変更することはできませんが、リストボックスはそれ以外の操作が可能です。
aria-label-
リストボックスを識別する、人間が読むことができる文字列値。 可視のラベルがある場合は、代わりに
aria-labelledbyを使用してそのラベルを参照するべきです。 aria-labelledby-
リストボックスを識別する、要素 ID のスペースで区切られたリストで、1 つ以上の可視の要素を識別します。 可視のラベルがない場合は、代わりに
aria-labelを使用してラベルを含めるべきです。(注: 2 つの L が付いた "labelled" は、アクセシビリティ API の規約に基づく正しいスペルです。) aria-roledescription-
リストボックスのロールをより明確に識別する、人間が読むことができる文字列値。 スクリーンリーダーは、ラベルを(ある場合は)読んだ後に、「リストボックス」と言う代わりに、この値をユーザーに読み上げることがよくあります。
キーボード操作
-
単一選択リストボックスがフォーカスを受け取ったとき
- リストボックスがフォーカスを受け取る前にどの選択肢も選択されていなかった場合、最初の選択肢がフォーカスを受け取ります。 任意で、最初の選択肢を自動選択することもできます。
- リストボックスがフォーカスを受け取る前に選択肢が選択されていた場合、フォーカスは選択されている選択肢に設定されます。
-
複数選択リストボックスがフォーカスを受け取ったとき
- リストボックスがフォーカスを受け取る前にどの選択肢も選択されていなかった場合、フォーカスは最初の選択肢に設定され、選択状態の自動変更は行われません。
- リストボックスがフォーカスを受け取る前に 1 つ以上の選択肢が選択されていた場合、フォーカスはリストの中で最初に選択されている選択肢に設定されます。
-
↓(下矢印)
: 次の選択肢にフォーカスを移動します。 任意で、単一選択リストボックスでは、選択もフォーカスと共に移動することがあります。
-
↑(↑矢印)
: 前の選択肢にフォーカスを移動します。 任意で、単一選択リストボックスでは、選択もフォーカスと共に移動することがあります。
-
Home
(任意): 最初の選択肢にフォーカスを移動します。 任意で、単一選択リストボックスでは、選択もフォーカスと共に移動することがあります。 5 つ以上の選択肢があるリストでは、このキーに対応することを強くお勧めします。
-
End
(任意): 最後の選択肢にフォーカスを移動します。 任意で、単一選択リストボックスでは、選択もフォーカスと共に移動することがあります。 5 つ以上の選択肢があるリストでは、このキーに対応することを強くお勧めします。
-
先行入力は、全てのリストボックス、特に 7 つ以上の選択肢があるリストボックスに対してお勧めします。
- 文字を入力: フォーカスは、入力された文字で始まる名前を持つ次のアイテムに移動します。
- 複数の文字をすばやく続けて入力: フォーカスは、入力された文字列で始まる名前を持つ次のアイテムに移動します。
-
複数選択: 作成者は、複数選択に対応するために 2 つのインタラクションモデルのいずれかを実装することができます。 ユーザーがリスト内を移動しながら Shift や Ctrl などの修飾キーを押し続けなくてもよい推奨モデルや、選択状態が失われるのを避けるために移動中に修飾キーを押し続ける必要のある代替モデルがあります。
- 推奨選択モデル — 修飾キーを押し続ける必要はありません。
- スペース: フォーカスされた選択肢の選択状態を変更します。
- Shift + ↓(任意): 次の選択肢にフォーカスを移動し、選択状態をトグルします。
- Shift + ↑(任意): 前の選択肢にフォーカスを移動し、選択状態をトグルします。
- Shift + スペース(任意): 直前に選択したアイテムからフォーカスされたアイテムまでの連続したアイテムを選択します。
- Ctrl + Shift + Home(任意): フォーカスされた選択肢から最初の選択肢までの全ての選択肢を選択します。 任意で、フォーカスを最初の選択肢に移動します。
- Ctrl + Shift + End(任意): フォーカスされた選択肢から最後の選択肢までの全ての選択肢を選択します。 任意で、フォーカスを最後の選択肢に移動します。
- Ctrl + A(任意): リスト内の全ての選択肢を選択します。 任意で、全ての選択肢が選択されている場合は、全ての選択肢の選択を解除することもできます。
- 推奨選択モデル — 修飾キーを押し続ける必要はありません。
必要な JavaScript 機能
単一選択リストボックスで選択肢を選択する
ユーザーが選択肢を選択すると、以下が起こる必要があります。
- 前に選択した選択肢の選択を解除し、
aria-selectedをfalseに設定するか、属性を完全に削除して、新しく選択を解除した選択肢の外観を選択されていないように変更します。 - 新しく選択した選択肢を選択し、選択肢に
aria-selected="true"を設定し、新しく選択した選択肢の外観を選択されているように変更します。 - リストボックスの
aria-activedescendantの値を、新しく選択した選択肢のidに更新します。 - 選択肢のぼかし、フォーカス、選択状態を視覚的に処理します。
複数選択リストボックスで選択肢の状態をトグルする
ユーザーが選択肢をクリックしたり、選択肢にフォーカスしているときにスペースを押すなどして、選択肢の状態をトグルすると、以下が起こる必要があります。
- 現在フォーカスされている選択肢の
aria-selectedステート (状態) をトグル切り替えし、aria-selectedの状態をfalseならtrueに、trueならfalseに変更します。 - 選択状態を反映するように選択肢の外観を変更します。
- 選択肢を選択の解除へトグルしている場合でも、リストボックスの
aria-activedescendantの値を、ユーザーが直前に操作した選択肢のidに更新します。
メモ:
ARIA の使用の第一のルールは、要素を転用して ARIA のロール、ステート、プロパティを追加することでアクセス可能にするのではなく、必要としている意味論と振る舞いがすでに組み込まれているネイティブな機能を使用できることです。 <option> 要素を子孫に持つ <select> 要素は、必要な全ての操作をネイティブに処理します。
例
>例 1: aria-activedescendant を使用する単一選択リストボックス
次のスニペットでは、aria-activedescendant を使用して、リストボックスロールが HTML ソースコードに直接追加される方法を示しています。
<p id="listbox1label" role="label">色を選択:</p>
<div
role="listbox"
tabindex="0"
id="listbox1"
aria-labelledby="listbox1label"
aria-activedescendant="listbox1-1">
<div role="option" id="listbox1-1" class="selected" aria-selected="true">
緑
</div>
<div role="option" id="listbox1-2">オレンジ</div>
<div role="option" id="listbox1-3">赤</div>
<div role="option" id="listbox1-4">青</div>
<div role="option" id="listbox1-5">紫</div>
<div role="option" id="listbox1-6">ペリウィンクル</div>
</div>
const listbox = document.getElementById("listbox1");
listbox.addEventListener("click", listItemClick);
listbox.addEventListener("keydown", listItemKeyEvent);
listbox.addEventListener("keypress", listItemKeyEvent);
これは、ネイティブの HTML の <select> 要素と <label> 要素でより簡単に処理できます。
<label for="listbox1">色を選択:</label>
<select id="listbox1">
<option selected>緑</option>
<option>オレンジ</option>
<option>赤</option>
<option>青</option>
<option>紫</option>
<option>ペリウィンクル</option>
</select>
それ以外の例
- スクロール可能なリストボックスの例(英語): 1 より大きい
size属性を持つ HTML の<select>と同様な、スクロールしてより多くの選択肢を表示する単一選択リストボックス。 - 折りたたみ可能なドロップダウンリストボックスの例(英語): 属性
size="1"を持つ HTML の<select>と同様な、アクティブにすると展開される単一選択の折りたたみ可能なリストボックス。 - 並べ替え可能な選択肢を持つリストボックスの例(英語): 選択肢の追加、移動、および削除が可能なツールバーが付属する、単一選択リストボックスと複数選択リストボックスの両方の例。
ベストプラクティス
- キーボードからアクセス可能にするために、作成者はこのロールの全ての子孫のフォーカスを管理(英語)すべきです。
- リストがフォーカスされていない場合、作成者は選択に異なるスタイリングを使用することをお勧めします。 例えば、アクティブでない選択は、より明るい背景色で表示されることが多いです。
- リストボックスが別のウィジェットの一部でない場合は、
aria-labelledbyプロパティを設定すべきです。 - 1 つ以上の項目が DOM 上でリストボックスの子でない場合、追加の
aria-*プロパティを設定する必要があります(ARIA のベストプラクティス(英語)を参照)。 - リストボックスを展開する正当な理由がある場合は、
comboboxロールの方がより適切かもしれません。
仕様書
| 仕様書 |
|---|
| Accessible Rich Internet Applications (WAI-ARIA)> # listbox> |
| Unknown specification> |
関連情報
- HTML
<select>要素 - HTML
<label>要素 - HTML
<option>要素 - ARIA:
comboboxロール - ARIA:
optionロール - ARIA:
listロール - ARIA:
listitemロール - ARIA のベストプラクティス — リストボックス(英語)