Standarder · ARIA

Rolle Widget

menuitem

Markerer et element som et handlingspunkt inde i en menu eller menubar. Der er ingen HTML-ækvivalent — menuer er en ARIA-eksklusiv konstruktion. Brug kun denne rolle, når man bygger en egentlig applikationsmenu; en simpel navigationsliste bør IKKE bruge menu/menuitem.

Hvornår brug det

Kun inde i en role="menu" eller role="menubar", og kun når menuen er en applikationsmenu — den slags, der efterligner en skrivebordsapplikations Filer/Rediger/Vis-bjælke, med enkelt tab-stop, pilnavigation og Escape-til-luk.

En sides topnavigation er IKKE en menu. Brug <nav> med en <ul> af <a>-links. Forvekslingen er den hyppigste ARIA-fejl på nettet — den fanger tastaturbrugere i pilnavigation, når Tab ville være mere naturligt, og den fortæller skærmlæsere “applikationsmenu”, når indholdet blot er links.

Søskenderollen: menuitemcheckbox (til menupunkter, der skifter tilstand) og menuitemradio (til eksklusive valg inde i en menu).

Tastatur- og fokuskontrakt

Jf. APG menu-mønsteret:

  • Tab åbner og lukker menuen — fokus lander på det første menuitem ved åbning. Tab cykler IKKE igennem elementer.
  • Pile op/ned flytter fokus mellem elementer (med ombrydning).
  • Højre/Venstre åbner undermenuer / returnerer til forælder.
  • Enter eller mellemrum aktiverer det fokuserede element.
  • Escape lukker menuen og returnerer fokus til triggeren.
  • At skrive et bogstav hopper til næste element, der begynder med det bogstav (forudindtastning).

Brug et rullende tabindex: kun det aktuelt fokuserede menuitem har tabindex="0"; resten har tabindex="-1".

Typiske fejl

  • Brug af role="menuitem" til et almindeligt link i en sitenavigation. Medfører tastaturfælder og forkert skærmlæserannoncering.
  • Hvert menuitem har tabindex="0", så Tab trin igennem hvert element. Mønsteret er enkelt tab-stop.
  • Undermenuer, der åbnes ved hover men ikke ved Højrepil.
  • Escape lukker undermenuen, men mister fokus og efterlader brugeren uden for menuen.
  • Elementer mangler tilgængeligt navn, fordi ikonet er det eneste indhold — tilføj aria-label.

Eksempel

<button id="fileBtn" aria-haspopup="menu" aria-expanded="false" aria-controls="fileMenu">
  File
</button>
<ul id="fileMenu" role="menu" aria-labelledby="fileBtn" hidden>
  <li role="menuitem" tabindex="0">New</li>
  <li role="menuitem" tabindex="-1">Open</li>
  <li role="menuitem" tabindex="-1" aria-haspopup="menu" aria-expanded="false">
    Open recent
  </li>
  <li role="separator"></li>
  <li role="menuitem" tabindex="-1">Save</li>
</ul>