Français

Créez des interfaces à onglets accessibles et conviviales. Découvrez les meilleures pratiques pour la navigation au clavier, les rôles ARIA et la gestion du focus pour un public mondial.

Maîtriser les interfaces à onglets : Une exploration approfondie de la navigation au clavier et de la gestion du focus

Les interfaces à onglets sont une pierre angulaire du design web moderne. Des pages de produits aux tableaux de bord utilisateur en passant par les applications web complexes, elles offrent une solution élégante pour organiser le contenu et désencombrer l'interface utilisateur. Bien qu'elles puissent paraître simples en surface, la création d'un composant d'onglets véritablement efficace et accessible nécessite une compréhension approfondie de la navigation au clavier et une gestion méticuleuse du focus. Une interface à onglets mal implémentée peut devenir une barrière insurmontable pour les utilisateurs qui dépendent du clavier ou des technologies d'assistance, les excluant de fait de votre contenu.

Ce guide complet s'adresse aux développeurs web, aux concepteurs UI/UX et aux défenseurs de l'accessibilité qui souhaitent aller au-delà des bases. Nous explorerons les modèles internationalement reconnus pour l'interaction au clavier, le rôle essentiel d'ARIA (Accessible Rich Internet Applications) dans la fourniture d'un contexte sémantique, et les techniques nuancées de gestion du focus qui créent une expérience utilisateur fluide et intuitive pour tous, quel que soit leur lieu de résidence ou leur manière d'interagir avec le web.

L'anatomie d'une interface à onglets : Composants principaux

Avant de plonger dans la mécanique, il est essentiel d'établir un vocabulaire commun basé sur les pratiques de création WAI-ARIA. Un composant d'onglets standard se compose de trois éléments principaux :

Comprendre cette structure est la première étape pour construire un composant qui est non seulement visuellement cohérent, mais aussi sémantiquement compréhensible pour les technologies d'assistance comme les lecteurs d'écran.

Les principes d'une navigation au clavier parfaite

Pour un utilisateur voyant de la souris, interagir avec des onglets est simple : on clique sur l'onglet que l'on veut voir. Pour les utilisateurs naviguant uniquement au clavier, l'expérience doit être tout aussi intuitive. Les pratiques de création WAI-ARIA fournissent un modèle robuste et standardisé pour l'interaction au clavier, que les utilisateurs de technologies d'assistance s'attendent à retrouver.

Naviguer dans la liste d'onglets (`role="tablist"`)

L'interaction principale se produit au sein de la liste d'onglets. L'objectif est de permettre aux utilisateurs de parcourir et de sélectionner efficacement les onglets sans avoir à naviguer à travers chaque élément interactif de la page.

Modèles d'activation : Automatique ou Manuel

Lorsqu'un utilisateur navigue entre les onglets avec les touches fléchées, quand le panneau correspondant doit-il être affiché ? Il existe deux modèles standards :

Votre choix de modèle d'activation doit être basé sur le contenu et le contexte de votre interface. Quel que soit votre choix, soyez cohérent dans toute votre application.

Maîtriser la gestion du focus : le héros méconnu de l'utilisabilité

Une gestion efficace du focus est ce qui sépare une interface maladroite d'une interface fluide. Il s'agit de contrôler par programmation où se trouve le focus de l'utilisateur, en assurant un parcours logique et prévisible à travers le composant.

La technique du `tabindex` itinérant

Le `tabindex` itinérant est la pierre angulaire de la navigation au clavier au sein de composants comme les listes d'onglets. L'objectif est de faire en sorte que l'ensemble du widget agisse comme un seul arrêt de tabulation (`Tab`).

Voici comment cela fonctionne :

  1. L'élément d'onglet actuellement actif reçoit `tabindex="0"`. Cela le rend partie intégrante de l'ordre de tabulation naturel et lui permet de recevoir le focus lorsque l'utilisateur tabule dans le composant.
  2. Tous les autres éléments d'onglets inactifs reçoivent `tabindex="-1"`. Cela les retire de l'ordre de tabulation naturel, de sorte que l'utilisateur n'a pas à appuyer sur `Tab` pour chacun d'entre eux. Ils peuvent toujours être focalisés par programmation, ce que nous faisons avec la navigation par touches fléchées.

Lorsque l'utilisateur appuie sur une touche fléchée pour passer de l'onglet A à l'onglet B :

Cette technique garantit que, quel que soit le nombre d'onglets dans la liste, le composant n'occupe jamais qu'une seule position dans la séquence globale de `Tab` de la page.

Le focus à l'intérieur des panneaux d'onglets

Une fois qu'un onglet est actif, où va le focus ensuite ? Le comportement attendu est que l'appui sur `Tab` depuis un élément d'onglet actif déplace le focus vers le premier élément focusable *à l'intérieur* de son panneau d'onglet correspondant. Si le panneau d'onglet n'a pas d'éléments focusables, l'appui sur `Tab` devrait déplacer le focus vers le prochain élément focusable de la page *après* la liste d'onglets.

De même, lorsqu'un utilisateur est focalisé sur le dernier élément focusable à l'intérieur d'un panneau d'onglet, appuyer sur `Tab` devrait déplacer le focus hors du panneau vers le prochain élément focusable de la page. Appuyer sur `Maj + Tab` depuis le premier élément focusable à l'intérieur du panneau devrait ramener le focus sur l'élément d'onglet actif.

Évitez le piège de focus : Une interface à onglets n'est pas une boîte de dialogue modale. Les utilisateurs doivent toujours pouvoir entrer et sortir du composant d'onglets et de ses panneaux en utilisant la touche `Tab`. Ne piégez pas le focus à l'intérieur du composant, car cela peut être désorientant et frustrant.

Le rôle d'ARIA : Communiquer la sémantique aux technologies d'assistance

Sans ARIA, une interface à onglets construite avec des éléments `

` n'est qu'une collection de conteneurs génériques pour un lecteur d'écran. ARIA fournit les informations sémantiques essentielles qui permettent aux technologies d'assistance de comprendre le but et l'état du composant.

Rôles et attributs ARIA essentiels

  • `role="tablist"` : Placé sur l'élément contenant les onglets. Il annonce : "Ceci est une liste d'onglets."
  • `aria-label` ou `aria-labelledby` : Utilisé sur l'élément `tablist` pour fournir un nom accessible, tel que `aria-label="Catégories de contenu"`.
  • `role="tab"` : Placé sur chaque contrôle d'onglet individuel (souvent un élément `
  • `aria-selected="true"` ou `"false"` : Un attribut d'état essentiel sur chaque `role="tab"`. `"true"` indique l'onglet actuellement actif, tandis que `"false"` marque les inactifs. Cet état doit être mis à jour dynamiquement avec JavaScript.
  • `aria-controls="panel-id"` : Placé sur chaque `role="tab"`, sa valeur doit être l' `id` de l'élément `tabpanel` qu'il contrôle. Cela crée un lien programmatique entre le contrôle et son contenu.
  • `role="tabpanel"` : Placé sur chaque élément de panneau de contenu. Il annonce : "Ceci est un panneau de contenu associé à un onglet."
  • `aria-labelledby="tab-id"` : Placé sur chaque `role="tabpanel"`, sa valeur doit être l' `id` de l'élément `role="tab"` qui le contrôle. Cela crée l'association inverse, aidant les technologies d'assistance à comprendre quel onglet nomme le panneau.

Masquer le contenu inactif

Il ne suffit pas de masquer visuellement les panneaux d'onglets inactifs. Ils doivent également être cachés aux technologies d'assistance. La manière la plus efficace de le faire est d'utiliser l'attribut `hidden` ou `display: none;` en CSS. Cela supprime le contenu du panneau de l'arbre d'accessibilité, empêchant un lecteur d'écran d'annoncer un contenu qui n'est pas pertinent à ce moment-là.

Mise en œuvre pratique : Un exemple de haut niveau

Jetons un œil à une structure HTML simplifiée qui intègre ces rôles et attributs ARIA.

Structure HTML


<h2 id="tablist-label">Paramètres du compte</h2>
<div role="tablist" aria-labelledby="tablist-label">
  <button id="tab-1" type="button" role="tab" aria-selected="true" aria-controls="panel-1" tabindex="0">
    Profil
  </button>
  <button id="tab-2" type="button" role="tab" aria-selected="false" aria-controls="panel-2" tabindex="-1">
    Mot de passe
  </button>
  <button id="tab-3" type="button" role="tab" aria-selected="false" aria-controls="panel-3" tabindex="-1">
    Notifications
  </button>
</div>

<div id="panel-1" role="tabpanel" aria-labelledby="tab-1" tabindex="0">
  <p>Contenu pour le panneau Profil...</p>
</div>
<div id="panel-2" role="tabpanel" aria-labelledby="tab-2" tabindex="0" hidden>
  <p>Contenu pour le panneau Mot de passe...</p>
</div>
<div id="panel-3" role="tabpanel" aria-labelledby="tab-3" tabindex="0" hidden>
  <p>Contenu pour le panneau Notifications...</p>
</div>

Logique JavaScript (Pseudo-code)

Votre JavaScript serait responsable de l'écoute des événements clavier sur le `tablist` et de la mise à jour des attributs en conséquence.


const tablist = document.querySelector('[role="tablist"]');
const tabs = tablist.querySelectorAll('[role="tab"]');

tablist.addEventListener('keydown', (e) => {
  let currentTab = document.activeElement;
  let newTab;

  if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
    // Trouve l'onglet suivant dans la séquence, en revenant au début si nécessaire
    newTab = getNextTab(currentTab);
  } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
    // Trouve l'onglet précédent dans la séquence, en revenant à la fin si nécessaire
    newTab = getPreviousTab(currentTab);
  } else if (e.key === 'Home') {
    newTab = tabs[0];
  } else if (e.key === 'End') {
    newTab = tabs[tabs.length - 1];
  }

  if (newTab) {
    activateTab(newTab);
    e.preventDefault(); // Empêche le comportement par défaut du navigateur pour les touches fléchées
  }
});

function activateTab(tab) {
  // Désactive tous les autres onglets
  tabs.forEach(t => {
    t.setAttribute('aria-selected', 'false');
    t.setAttribute('tabindex', '-1');
    document.getElementById(t.getAttribute('aria-controls')).hidden = true;
  });

  // Active le nouvel onglet
  tab.setAttribute('aria-selected', 'true');
  tab.setAttribute('tabindex', '0');
  document.getElementById(tab.getAttribute('aria-controls')).hidden = false;
  tab.focus();
}

Considérations globales et meilleures pratiques

Construire pour un public mondial exige de penser au-delà d'une seule langue ou culture. En ce qui concerne les interfaces à onglets, la considération la plus importante est la directionnalité du texte.

Prise en charge des langues de droite à gauche (RTL)

Pour les langues comme l'arabe, l'hébreu et le persan qui se lisent de droite à gauche, le modèle de navigation au clavier doit être inversé. Dans un contexte RTL :

  • La `Flèche Droite` devrait déplacer le focus vers l'onglet précédent.
  • La `Flèche Gauche` devrait déplacer le focus vers l'onglet suivant.

Cela peut être mis en œuvre en JavaScript en détectant la direction du document (`dir="rtl"`) et en inversant la logique pour les touches fléchées gauche et droite en conséquence. Cet ajustement apparemment mineur est essentiel pour offrir une expérience intuitive à des millions d'utilisateurs dans le monde.

Indication visuelle du focus

Il ne suffit pas que le focus soit géré correctement en coulisses ; il doit être clairement visible. Assurez-vous que vos onglets focalisés et les éléments interactifs dans les panneaux d'onglets ont un contour de focus très visible (par exemple, un anneau ou une bordure proéminente). Évitez de supprimer les contours avec `outline: none;` sans fournir une alternative plus robuste et accessible. C'est crucial pour tous les utilisateurs de clavier, mais surtout pour ceux qui ont une basse vision.

Conclusion : Construire pour l'inclusion et l'utilisabilité

La création d'une interface à onglets vraiment accessible et conviviale est un processus délibéré. Elle exige de dépasser la conception visuelle pour s'intéresser à la structure, à la sémantique et au comportement sous-jacents du composant. En adoptant des modèles de navigation au clavier standardisés, en implémentant correctement les rôles et attributs ARIA, et en gérant le focus avec précision, vous pouvez créer des interfaces qui ne sont pas seulement conformes, mais véritablement intuitives et responsabilisantes pour tous les utilisateurs.

Rappelez-vous ces principes clés :

  • Utilisez un seul arrêt de tabulation : Employez la technique du `tabindex` itinérant pour rendre l'ensemble du composant navigable avec les touches fléchées.
  • Communiquez avec ARIA : Utilisez `role="tablist"`, `role="tab"` et `role="tabpanel"` ainsi que leurs propriétés associées (`aria-selected`, `aria-controls`) pour fournir une signification sémantique.
  • Gérez le focus logiquement : Assurez-vous que le focus se déplace de manière prévisible de l'onglet au panneau et hors du composant.
  • Masquez correctement le contenu inactif : Utilisez `hidden` ou `display: none` pour retirer les panneaux inactifs de l'arbre d'accessibilité.
  • Testez minutieusement : Testez votre implémentation en utilisant uniquement un clavier et avec divers lecteurs d'écran (NVDA, JAWS, VoiceOver) pour vous assurer qu'elle fonctionne comme prévu pour tout le monde.

En investissant dans ces détails, nous contribuons à un web plus inclusif — un web où l'information complexe est accessible à tous, quelle que soit leur manière de naviguer dans le monde numérique.