Le WordPress d'aujourd'hui, décodé pour les développeurs

Accessibilité

« Buttons must have discernible text » sur une icône de partage seule

axe DevTools remonte une erreur sur le bouton de partage d'un article de presse locale. Diagnostic de l'icône seule, correctif par texte masqué, prévention par un composant réutilisable.

Par WordPress Développement • 2 décembre 2022 • 4 min de lecture • Aucun commentaire
« Buttons must have discernible text » sur une icône de partage seule

« Buttons must have discernible text » : ce message d’axe DevTools est apparu sur le bouton de partage d’un article, lors de l’audit du site web d’un journal de presse locale qui venait de refondre entièrement sa page article. Le bouton en question, une simple icône représentant une flèche sortante, s’affichait correctement, réagissait au clic, ouvrait bien la fenêtre de partage attendue. Pour un lecteur d’écran, pourtant, il n’existait tout simplement pas de nom : l’annonce se limitait à « bouton », sans aucune indication de sa fonction.

Symptôme : un bouton muet malgré une icône visible

Le code source du bouton ressemblait à ceci avant correction :

<button class="btn-partage">
  <svg aria-hidden="true">...</svg>
</button>

L’attribut aria-hidden="true" sur le SVG était en réalité correctement posé : il masque l’icône décorative aux technologies d’assistance, ce qui est la bonne pratique quand une icône n’apporte aucune information supplémentaire. Le problème venait d’ailleurs : rien, nulle part dans ce bouton, ne fournissait de texte alternatif à l’action elle-même. Masquer l’icône sans fournir de remplacement revient à supprimer la seule source d’information disponible.

Diagnostic : où chercher le nom accessible manquant

L'essentiel à retenir : L'icône seule ne porte aucun nom accessible ; Un texte masqué visuellement corrige le problème ; Un composant réutilisable évite la récidive

Un bouton obtient son nom accessible, par ordre de priorité, depuis l’un de ces éléments : son contenu textuel visible, un attribut aria-label, ou un élément référencé par aria-labelledby. Dans le cas du bouton de partage, aucune de ces trois sources n’existait : le contenu textuel était masqué par aria-hidden, et aucun attribut de nommage n’avait été ajouté en remplacement.

La vérification se fait directement dans les outils de développement du navigateur, onglet accessibilité, en inspectant l’élément : le champ « Nom accessible » y apparaît vide, confirmant le diagnostic posé par axe DevTools.

Correctif : un texte masqué visuellement, pas masqué pour tout le monde

La correction la plus robuste ajoute un texte réellement présent dans le DOM, mais masqué uniquement à l’écran grâce à une classe utilitaire, plutôt que de s’appuyer sur aria-label seul :

<button class="btn-partage">
  <svg aria-hidden="true">...</svg>
  <span class="masque-visuellement">Partager cet article</span>
</button>
.masque-visuellement {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

Cette approche par texte réel plutôt que par aria-label présente un avantage supplémentaire : elle reste traduisible automatiquement si le site passe un jour par un outil de traduction, alors qu’un attribut aria-label codé en dur dans un thème est souvent oublié lors de ce type d’opération.

Prévention : centraliser le composant bouton-icône

Le site comptait sept boutons du même type dispersés dans différents gabarits : partage, impression, agrandissement d’image, fermeture de bandeau, ouverture de recherche, basculement de thème sombre, retour en haut de page. Corriger chacun séparément aurait laissé la porte ouverte à une nouvelle régression au prochain ajout. La solution retenue a été de créer une fonction PHP unique, appelée partout où un bouton-icône est nécessaire :

function wpm_bouton_icone($icone_svg, $libelle, $classes = '') {
    printf(
        '<button class="btn-icone %1$s">%2$s<span class="masque-visuellement">%3$s</span></button>',
        esc_attr($classes),
        $icone_svg,
        esc_html($libelle)
    );
}

Chaque appel de cette fonction impose de fournir un libellé, sans quoi le bouton ne s’affiche pas correctement — un garde-fou qui rend l’erreur visible dès le développement plutôt qu’à l’audit final.

Vérifier que la correction tient dans le temps

  • Relancer axe DevTools sur la page article : l’erreur « Buttons must have discernible text » doit disparaître ;
  • Tester au lecteur d’écran : l’annonce doit devenir « Partager cet article, bouton » ;
  • Ajouter un test automatisé qui échoue si un futur bouton-icône est ajouté sans passer par la fonction centralisée.

Une icône seule n’est jamais un problème en soi : c’est l’absence de texte de remplacement, quelque part dans le code, qui transforme un bouton fonctionnel en bouton muet pour une partie des visiteurs.

Notre verdict

L’erreur « Buttons must have discernible text » se corrige presque toujours de la même manière : ajouter un texte réel, masqué visuellement, à côté de l’icône décorative. Le vrai travail de fond consiste ensuite à centraliser ce motif dans un composant unique, pour que la correction profite à tous les boutons du site présents et futurs, sans dépendre de la vigilance de chaque développeur au moment d’en créer un nouveau.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi