Normes · ARIA

Rôle Widget

menuitem

Marque un élément comme un item actionnable dans un menu ou une menubar. Il n'existe pas d'équivalent HTML — les menus sont une construction ARIA uniquement. Utilisez ce rôle uniquement pour un vrai menu applicatif ; une liste de navigation ordinaire ne doit PAS utiliser menu/menuitem.

Quand l’utiliser

Uniquement à l’intérieur d’un role="menu" ou role="menubar", et uniquement lorsque le menu est un menu applicatif — le type qui reproduit la barre Fichier/Édition/Affichage d’une application de bureau, avec point d’arrêt tabulation unique, navigation par flèches et Échap pour fermer.

La navigation principale d’un site n’est PAS un menu. Utilisez <nav> avec un <ul> de liens <a>. La confusion entre les deux est la plus fréquente erreur ARIA sur le web — elle piège les utilisateurs clavier dans une navigation par flèches quand Tab serait plus naturel, et indique aux lecteurs d’écran « menu applicatif » quand le contenu n’est que des liens.

Rôles connexes : menuitemcheckbox (pour les éléments de menu qui basculent) et menuitemradio (pour les choix exclusifs dans un menu).

Contrat clavier + focus

Conformément au modèle APG menu :

  • Tab entre dans le menu et en sort — le focus se pose sur le premier menuitem à l’entrée. Tab ne parcourt PAS les éléments.
  • Les flèches Haut/Bas déplacent le focus entre les éléments (avec retour à la ligne).
  • Droite/Gauche ouvrent les sous-menus / reviennent au parent.
  • Entrée ou Espace active l’élément ciblé.
  • Échap ferme le menu et renvoie le focus vers le déclencheur.
  • Taper une lettre saute au prochain élément commençant par cette lettre (anticipation de frappe).

Utilisez un tabindex rotatif : seul le menuitem actuellement ciblé a tabindex="0" ; les autres ont tabindex="-1".

Erreurs courantes

  • Utiliser role="menuitem" pour un lien ordinaire dans la navigation du site. Provoque des pièges clavier et une annonce incorrecte par le lecteur d’écran.
  • Chaque menuitem a tabindex="0", Tab parcourt donc chacun d’eux. Le modèle est à point d’arrêt unique.
  • Sous-menus qui s’ouvrent au survol mais pas avec la flèche Droite.
  • Échap ferme le sous-menu mais perd le focus, laissant l’utilisateur sans repère hors du menu.
  • Éléments sans nom accessible parce que l’icône est le seul contenu — ajoutez aria-label.

Exemple

<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>