Normes · ARIA

Rôle Widget composite

tree

Marque un élément comme conteneur hiérarchique de treeitems — explorateur de fichiers, catégories imbriquées ou organigramme. Un seul arrêt de tabulation, navigation par touches fléchées, expansion/réduction. Il n'existe pas d'équivalent HTML natif.

Quand l’utiliser

Pour un véritable navigateur hiérarchique : système de fichiers, organigramme, taxonomie profondément imbriquée. Les enfants sont role="treeitem", regroupés si nécessaire par des conteneurs intermédiaires role="group".

Si votre « arborescence » n’est en réalité qu’un menu de navigation composé de liens à deux ou trois niveaux, n’utilisez pas role="tree". Utilisez plutôt <nav> avec des <ul> imbriqués et des <a> — Tab + Entrée est ce qu’attendent les utilisateurs pour la navigation ; la navigation par touches fléchées dans un menu de site est peu familière et lente.

Un tree DOIT avoir un nom accessible. Définir aria-multiselectable="true" si plusieurs treeitems peuvent être sélectionnés simultanément.

Contrat clavier + focus

Conformément au modèle APG treeview :

  • Tab déplace le focus dans l’arborescence, vers le treeitem actif (ou le premier) ; Tab permet d’en sortir.
  • Les flèches Haut/Bas déplacent le focus entre les nœuds visibles, en ignorant les enfants réduits.
  • Flèche Droite : si réduit, développer ; si développé, aller au premier enfant.
  • Flèche Gauche : si développé, réduire ; si réduit, aller au parent.
  • Début / Fin se déplacent vers le premier / dernier nœud visible.
  • Entrée ou Espace sélectionne le treeitem courant.
  • Saisie anticipée : taper des lettres saute vers les nœuds visibles correspondants.
  • Pour les arborescences multi-sélection : Maj+Flèche étend la sélection contiguë ; Ctrl/Cmd+Clic bascule la sélection individuelle.

Utiliser un tabindex roulant : seul le treeitem actuellement actif a tabindex="0".

Erreurs courantes

  • Chaque treeitem avec tabindex="0". Le modèle impose un seul arrêt de tabulation.
  • Arborescence sans nom accessible. La navigation par repères du lecteur d’écran n’a rien à annoncer.
  • Treeitems enfants à l’intérieur du parent sans conteneur role="group". Les lecteurs d’écran ne peuvent pas annoncer le groupe comme une unité.
  • aria-expanded="false" sur des treeitems feuilles — annonce un état réductible vide.
  • Les flèches Droite/Gauche utilisées pour le passage au nœud suivant/précédent au lieu de développer/réduire.

Exemple

<ul role="tree" aria-label="Project files">
  <li role="treeitem" aria-expanded="true" tabindex="0">
    src
    <ul role="group">
      <li role="treeitem" tabindex="-1">index.ts</li>
      <li role="treeitem" aria-expanded="false" tabindex="-1">
        components
        <ul role="group">
          <li role="treeitem" tabindex="-1">Button.tsx</li>
        </ul>
      </li>
    </ul>
  </li>
  <li role="treeitem" tabindex="-1">README.md</li>
</ul>