listbox
Markeert een element als een lijst met selecteerbare opties. Gebruik <select> voor het eenvoudige enkelvoudige geval — dat biedt een mobiel-vriendelijke kiezer met volledige toetsenbordondersteuning. Gebruik role="listbox" voor aangepaste opmaak, meervoudige selectie of koppeling met een combobox.
Wanneer te gebruiken
Gebruik waar mogelijk <select> (enkelvoudige selectie) of <select multiple>. Het native element levert het volledige interactiemodel, inclusief platformcorrecte toetsenbordafhandeling.
role="listbox" is geschikt wanneer:
- De listbox de popup is van een aangepaste combobox.
- Rijke optie-inhoud nodig is (pictogrammen, secundaire tekst) die
<select>niet kan weergeven. - Meervoudige selectie met aangepaste vinkstijl nodig is.
- Een transferlijst of filterbare kiezer wordt gebouwd.
Kinderen moeten role="option" zijn (met role="group" als tussenliggende wrapper voor secties). Stel aria-multiselectable="true" in voor listboxen met meervoudige selectie.
Toetsenbord- en focuscontract
Volgens het APG listbox-patroon:
- Tab verplaatst de focus naar de listbox; Tab verplaatst de focus eruit. Binnen de listbox blijft de focus op de container en wordt de “actieve” optie bijgehouden via
aria-activedescendant. - Pijl omhoog/omlaag verplaatst de actieve optie.
- Home / End springt naar de eerste / laatste optie.
- Enkelvoudige selectie: elke pijldruk selecteert ook de actieve optie.
- Meervoudige selectie: Spatie schakelt selectie op de actieve optie; Shift+Pijl breidt een aaneengesloten bereik uit; Ctrl/Cmd+A selecteert alles.
- Typeahead: het typen van een letter springt naar de volgende optie die met die letter begint.
Veelvoorkomende fouten
- DOM-focus verplaatsen naar elke optie in plaats van
aria-activedescendantte gebruiken. Verstoort typeahead en combobox-integratie. role="option"-kinderen zonderid-attributen —aria-activedescendantkan er niet naar verwijzen.- Listbox met meervoudige selectie zonder
aria-multiselectable="true". Schermlezers kondigen het aan als enkelvoudige selectie. - Listbox bevat opties die elders in de DOM staan zonder
aria-ownsom de relatie expliciet te maken. role="listbox"gebruiken voor een statische lijst van alleen-lezen items. Dat isrole="list", niet listbox — listbox impliceert interactiviteit.
Voorbeeld
<label id="topicsLabel">Kies uw onderwerpen</label>
<ul
role="listbox"
aria-labelledby="topicsLabel"
aria-multiselectable="true"
tabindex="0"
aria-activedescendant="topic-1"
>
<li id="topic-1" role="option" aria-selected="true">Toegankelijkheid</li>
<li id="topic-2" role="option" aria-selected="false">Hulptechnologie</li>
<li id="topic-3" role="option" aria-selected="true">Standaarden</li>
</ul>