GouvernementFR / dsfr

🇫🇷 Official french government's design system (Système de Design de l'État)
https://www.systeme-de-design.gouv.fr/
Other
236 stars 54 forks source link

Discussion sur attributs `title` - remplacement par `aria-label` #904

Closed manuhabitela closed 3 months ago

manuhabitela commented 6 months ago

Bonjour :)

Je viens ici avec une micro PR d'exemple (et une méga description :see_no_evil:) pour commencer une discussion sur les attributs title utilisés sur les éléments interactifs du DSFR.

À mes yeux ces attributs ne sont pas le mieux qu'on puisse faire pour deux raisons :

  1. le support des lecteurs d'écran est peu fiable
  2. l'intérêt pour les utilisateurs en général est très limité

Je m'explique !

1. L'attribut title et les lecteurs d'écrans

Quand on utilise un lecteur d'écran audio (VoiceOver, NVDA, Jaws et autres), l'attribut title n'est pas souvent le plus adapté.

Par exemple, sur les liens s'ouvrant dans une nouvelle fenêtre, le DSFR conseille d'écrire du HTML comme ceci :

<a [...] target="_blank" title="legifrance.gouv.fr - nouvelle fenêtre">
    legifrance.gouv.fr
</a>

Ceci peut avoir plusieurs résultats différents suivant le lecteur d'écran, sa configuration utilisateur, ou son usage. Avec ce code, voici ce qui est peut être vocalisé :

Par exemple, avec NVDA ou JAWS, si je navigue pas à pas avec les flèches et que j'arrive sur un lien, le title n'est pas vocalisé. Il l'est en naviguant sur le lien via la touche Tabulation, ou en naviguant de lien en lien par exemple. On peut argumenter que cet usage n'est pas le principal (peut-être), mais on peut aussi argumenter de faire un truc supporté au mieux, plutôt que partiellement, pour répondre à tous les usages.

Avec VoiceOver, le title n'est pas vocalisé directement mais avec un temps d'attente sur le lien. Rien n'indique cependant avant d'attendre qu'une info supplémentaire est disponible.

Avec JAWS et NVDA, quand le title est vocalisé, il l'est directement après le contenu : le contenu est donc répété. Cependant si le title est strictement identique au contenu, alors il ne sera pas forcément [*] vocalisé.

[*] je dis "pas forcément" car c'est le cas la plupart du temps dans mes tests, mais suivant le sens du vent et des planètes, des fois il répète quand même l'info. Oui, grosse étude scientifique fiable de mon côté effectivement…

2. L'attribut title sans lecteur d'écran

Les attributs title dans le DSFR ne semblent pas utilisés qu'à des fins d'usages pour lecteurs d'écran. Notamment sur les boutons icone de recherche, menu, on double le contenu du bouton avec un title :

<button [...] title="Menu">Menu</button>

On a relevé plus haut que dans ce cas précis de title strictement identique au contenu, le title ne pose pas forcément problème avec un lecteur d'écran. Cependant il n'est pas nécessaire pour le lecteur d'écran, car le contenu texte à l'intérieur de la balise suffit.

Je suppose donc que ceci est fait afin de donner un contexte supplémentaire aux utilisateurs de souris. C'est cet usage que je remets en question ici.

À mes yeux, tous ces éléments combinés font que, se reposer sur cette tooltip pour donner de l'info, n'est pas une solution satisfaisante.

Car la plupart des utilisateurs ne vont jamais en profiter. Soit parce qu'ils sont sur mobile. Soit parce qu'ils ne devineront pas qu'on peut attendre sur l'interface avec la souris, sans bouger d'un seul pixel (!), pour afficher de l'aide. S'ils ont conscience du fonctionnement des tooltip "title", c'est souvent qu'ils découvrent ça par hasard, ou parce que ce sont des utilisateurs plutôt avertis. Autrement dit : c'est très rare.

Je vous donne une stat inutile pas du tout objective juste pour pousser mon argument : perso, j'ai jamais vu quelqu'un essayer d'afficher une tooltip title dans la vrai vie, sauf des développeurs qui savent que ça existe car c'est eux qui les codent :P

Une autre façon de voir les choses est : si l'info supplémentaire donnée par le title était vraiment nécessaire, on aurait surement mis en place de quoi rendre cette info disponible aussi au clavier et sur mobile, non ?

Réponse au point 1 pour les lecteurs d'écran : aria-label

À mes yeux, une meilleure façon de répondre au 1er problème serait d'utiliser l'attribut aria-label :

<a [...] target="_blank" aria-label="legifrance.gouv.fr - nouvelle fenêtre">
    legifrance.gouv.fr
</a>

Cet attribut a un support lecteur d'écran bien plus stable et cohérent que title. Ici, tous les lecteurs d'écran, quelque soit leur config, quelque soit l'usage, vocaliseront :

Lien legifrance.gouv.fr - nouvelle fenêtre

Pas de risque que ce ne soit pas vocalisé. Pas de risque que ce soit vocalisé en différé après une attente sur l'élément. Pas de répétition déroutante du contenu du lien.

Et la tooltip du point 2 ?

Je suis d'avis de simplement : ne plus se reposer sur la tooltip des title pour des infos considérées importantes pour tout le monde. Et proposer des changements d'UX au cas par cas si besoin :

Bref vous l'avez compris, je ne suis pas convaincu par l'usage des tooltip en général pour donner de l'info importante, en particulier si cette tooltip est implémentée uniquement avec un attribut title.


Enlever ces title du DSFR c'est aussi décider de moins montrer cette pratique qui, on l'a vu, a un usage plutôt "sensible". Si je suis du genre à m'inspirer des bouts du DSFR pour coder mon app, à copier/coller des bouts de code ici et là, je peux facilement me mettre dans la tête que cet attribut title est une bonne pratique fiable, alors qu'en réalité, pas trop.

Conclusion

J'ai créé deux pages de tests un peu isolés : le DSFR actuel vs une version avec aria-label pour tester facilement avec lecteurs d'écrans.

Qu'en pensez-vous ? Si ça vous paraît intéressant, je serai ensuite ravi de continuer le travail sur cette PR pour peaufiner la documentation et autres choses nécessaires que je n'aurais pas vues.

Merci !

keryanS commented 5 months ago

Bonjour Manu,

Merci pour cette recherche approfondie et cette proposition de modification. Nous en avons discuté avec l'équipe et notre partenaire Access42 expert en accessibilité.

Tu as raison sur certains points. Néanmoins, l'attribut title nous semble de manière générale le plus adapté :

Tes remarques sur le title en mobile et navigation clavier sont par ailleurs pertinentes, mais systématiser le tooltip pour ces cas nous semble un peu extrême. Et s'imposer de ne jamais utiliser d'icône sans l'accompagner de texte, est d'un point de vue conception UI/UX, compliqué. Cela dit, ces cas doivent être limités aux icônes simples et couramment utilisées dans le contexte (burger menu, loupe de recherche, etc).

manuhabitela commented 5 months ago

Ok d'ac, merci pour le retour !

Bon, j'avoue pas trop comprendre la logique de vouloir un title pour expliciter des choses, si en même temps on se dit que rendre les explications plus faciles à découvrir serait extrême.

Et sur les lecteurs d'écran ce n'est pas seulement un choix utilisateur. Suivant mon usage je peux tout à fait passer à côté de l'information sans l'avoir choisi. Un peu comme le title affiché à la souris en fait : parfois difficile de savoir que l'info est là même quand j'y ai accès. Mais j'entends que le cas est sans doute rare.

Après, c'est vrai que j'y pensais pas trop mais j'entends bien l'argument que aria-label est plus risqué et sans faire gaffe tu peux effectivement tout casser :)

Merci d'avoir pris le temps de regarder.

yaaax commented 5 months ago

Je serais d’avis d’utiliser title ET aria-label.

![voice-over-liens](https://github.com/GouvernementFR/dsfr/assets/11678850/c4a0c220-0b78-46e7-8102-c8ae301e16b8|width=5)

Chez Orange, ils ont un exemple dans ce sens sur la page Web développer - Navigation générale | Rendre les intitulés des liens et des boutons accessibles.

<a href="…" title="Valider le paiement en plusieurs fois" aria-label="Valider le paiement en plusieurs fois">valider</a>
<a href="…" title="Valider le paiement en une seule fois" aria-label="Valider le paiement en une seule fois">valider</a>

Qu’en pensez-vous ?

keryanS commented 4 months ago

C'est une possibilité que vous pouvez mettre en place de votre côté si vous êtes certain du libellé du aria-label, que l'intitulé du lien ne bougera pas, et qu'en cas d'internationalisation il sera bien traduit. Il sera alors de votre responsabilité de garder une cohérence entre l'intitulé, le title, et l'aria-label à tout moment.

Concernant le DSFR, étant donné que l'attribut aria-label écrase le texte du lien, il y a un fort risque de mauvais usage et de mauvaise maintenabilité. Nous ne pouvons donc pas nous permettre de le systématiser dans nos exemples. Nous essayons d'être un maximum "plug and play", et ne laissons pas de place au doute.

Par ailleurs, il convient généralement d'avoir le même niveau d'information entre un lecteur d'écran et la version visible. À ce titre, si l'information nécessite d'être explicitée pour être comprise, le title et aria-label ne sont pas préconisés. Il conviendra plutôt de revoir l'UX ou de préciser via un texte explicatif avant le lien.