{"id":2501,"date":"2024-07-30T14:20:52","date_gmt":"2024-07-30T12:20:52","guid":{"rendered":"https:\/\/ideance.net\/blog\/?p=2501"},"modified":"2024-07-30T14:20:52","modified_gmt":"2024-07-30T12:20:52","slug":"7-mauvaises-facons-dutiliser-lattribut-aria-label-la-troisieme-va-vous-surprendre","status":"publish","type":"post","link":"https:\/\/ideance.net\/blog\/en\/2501\/7-mauvaises-facons-dutiliser-lattribut-aria-label-la-troisieme-va-vous-surprendre\/","title":{"rendered":"7 mauvaises fa\u00e7ons d&rsquo;utiliser l&rsquo;attribut aria-label, la troisi\u00e8me va vous surprendre !"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Qu\u2019est-ce que l\u2019attribut aria-label&nbsp;?<\/h2>\n\n\n\n<p class=\"ice-block\">L\u2019attribut <code>aria-label<\/code> contient <strong>une cha\u00eene de caract\u00e8res pour fournir un nom accessible<\/strong> \u00e0 un \u00e9l\u00e9ment interactif.<\/p>\n\n\n\n<p>En effet, il arrive qu\u2019un \u00e9l\u00e9ment n\u2019ait pas de nom accessible dans le code de la page\u00a0: c\u2019est notamment le cas d&rsquo;un bouton contenant uniquement une ic\u00f4ne. L\u2019attribut <code>aria-label<\/code> peut \u00eatre alors utilis\u00e9 pour permettre la restitution d\u2019un nom pour ce bouton par les technologies d\u2019assistance, comme les lecteurs d\u2019\u00e9cran.<\/p>\n\n\n\n<p>Voici un exemple d&rsquo;utilisation pour un bouton sans intitul\u00e9 textuel :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;button <strong>aria-label=\"Fermer\"<\/strong> onclick=\"myDialog.close()\"&gt;\n  &lt;svg aria-hidden=\"true\" focusable=\"false\" width=\"17\" height=\"17\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"&gt;\n    &lt;path d=\"m.967 14.217 5.8-5.906-5.765-5.89L3.094.26l5.783 5.888L14.66.26l2.092 2.162-5.766 5.889 5.801 5.906-2.092 2.162-5.818-5.924-5.818 5.924-2.092-2.162Z\" fill=\"#000\" \/&gt;\n  &lt;\/svg&gt;\n&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<p>Les diff\u00e9rents audits de conformit\u00e9 RGAA (R\u00e9f\u00e9rentiel G\u00e9n\u00e9ral d\u2019Am\u00e9lioration de l\u2019Accessibilit\u00e9) que j\u2019ai pu mener tendent \u00e0 montrer que l&rsquo;utilisation de cet attribut n\u2019est pas totalement ma\u00eetris\u00e9e\u00a0par les \u00e9quipes de d\u00e9veloppement.<\/p>\n\n\n\n<p>J\u2019ai compil\u00e9 ici les erreurs les plus fr\u00e9quemment rencontr\u00e9es au cours de mes audits.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1 : L\u2019erreur b\u00eate<\/h2>\n\n\n\n<p>L\u2019erreur b\u00eate, mais pas isol\u00e9e\u00a0: la mauvaise \u00e9criture du nom de l\u2019attribut. Souvent, il s\u2019agit de l\u2019oubli du tiret entre <code>aria <\/code>et <code>label<\/code>. Et l\u00e0, et bien, \u00e7a marche beaucoup moins bien (en fait, pas du tout).<\/p>\n\n\n\n<p>Dans cet exemple, le bouton n&rsquo;a pas de nom accessible disponible pour les technologies d&rsquo;assistance \u00e0 cause de la faute dans l&rsquo;\u00e9criture du nom de l&rsquo;attribut :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;button <strong>arialabel=\"Fermer\"<\/strong> onclick=\"myDialog.close()\"&gt;&lt;span class=\"icon\"&gt;&lt;\/span&gt;&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<p>Pour \u00e9viter l\u2019erreur&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installer un <span lang=\"en\">linter<\/span> (outil d\u2019analyse de code permettant de d\u00e9tecter les erreurs et probl\u00e8mes de syntaxe) dans son outil de d\u00e9veloppement pr\u00e9f\u00e9r\u00e9.<\/li>\n\n\n\n<li>Passer le code des pages au <a href=\"https:\/\/validator.w3.org\/\" data-type=\"link\" data-id=\"https:\/\/validator.w3.org\/\">validateur W3C<\/a> : ce type d&rsquo;erreurs sera remont\u00e9.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2 : L&rsquo;exc\u00e8s de z\u00e8le<\/h2>\n\n\n\n<p>Il n\u2019est pas rare non plus de rencontrer des liens <code>&lt;a&gt;<\/code> flanqu\u00e9s d\u2019un attribut <code>aria-label<\/code> <strong>strictement identique<\/strong> \u00e0 l\u2019intitul\u00e9 textuel pr\u00e9sent dans l\u2019\u00e9l\u00e9ment. \u00c7a ne sert \u00e0 rien et alourdit le code et sa maintenance. Cette erreur n\u2019est pas la plus grave mais r\u00e9v\u00e8le une mauvaise compr\u00e9hension du r\u00f4le et de l\u2019utilisation de l\u2019attribut. <\/p>\n\n\n\n<p class=\"ice-block\">\u00c0 retenir : si le nom de l&rsquo;\u00e9l\u00e9ment est d\u00e9j\u00e0 pr\u00e9sent dans le code de la page, alors utiliser l&rsquo;attribut <code>aria-label <\/code>n&rsquo;est pas une bonne id\u00e9e.<\/p>\n\n\n\n<p>Exemple de redondance de l&rsquo;attribut :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;a href=&quot;#&quot; aria-label=&quot;Accueil&quot;&gt;Accueil&lt;\/a&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3 : Sans s\u00e9mantique, \u00e0 quoi bon ?<\/h2>\n\n\n\n<p>Il m\u2019arrive souvent de rencontrer des pages constell\u00e9es d\u2019attributs <code>aria-label<\/code> sur toutes sortes d\u2019\u00e9l\u00e9ments, notamment <code>&lt;div&gt;<\/code> et <code>&lt;span&gt;<\/code> sans attribut <code>role<\/code>, et donc sans s\u00e9mantique. La s\u00e9mantique donne le sens \u00e0 une partie de code. Cette s\u00e9mantique est implicite sur des \u00e9l\u00e9ments natifs tels que <code>&lt;a&gt;<\/code>, <code>&lt;button><\/code>, <code>&lt;table&gt;<\/code>, <code>&lt;ul><\/code> : pas besoin de leur ajouter un attribut <code>role<\/code>, contrairement aux \u00e9l\u00e9ments <code>&lt;div&gt;<\/code> et <code>&lt;span&gt;<\/code>.<\/p>\n\n\n\n<p class=\"ice-block\">Sans la pr\u00e9sence de cette s\u00e9mantique, <strong>l\u2019attribut <code>aria-label<\/code> est tout bonnement ignor\u00e9<\/strong> par les technologies d\u2019assistance&nbsp;: il n\u2019est pas restitu\u00e9. <\/p>\n\n\n\n<p>Dans ces deux exemples, les attributs <code>aria-label<\/code> seront ignor\u00e9s&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;span <strong>aria-label=\"Accueil\"<\/strong> class=\"icon\"&gt;&lt;\/span&gt;\n\n&lt;div class=\"button\" <strong>aria-label=\"Fermer\"<\/strong>&gt;&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4 : Le mieux ennemi du bien<\/h2>\n\n\n\n<p>En voulant am\u00e9liorer l\u2019exp\u00e9rience des utilisateurs de lecteur d\u2019\u00e9cran, certains d\u00e9veloppeurs font passer des messages bien intentionn\u00e9s via l\u2019attribut <code>aria-label<\/code> d&rsquo;un bouton ou d&rsquo;un lien.<\/p>\n\n\n\n<p>Intention louable, mais l\u00e0 o\u00f9 le b\u00e2t blesse, c\u2019est quand ce bouton ou ce lien <strong>contient d\u00e9j\u00e0 un contenu textuel<\/strong>.<\/p>\n\n\n\n<p class=\"ice-block\">Et l\u00e0 c\u2019est le drame&nbsp;: ce contenu textuel est tout bonnement ignor\u00e9 par le lecteur d\u2019\u00e9cran car l\u2019attribut <code>aria-label<\/code> <strong>\u00e9crase cet intitul\u00e9<\/strong>.<\/p>\n\n\n\n<p>Autre inconv\u00e9nient, pour les utilisateurs de logiciel de reconnaissance vocale, <strong>il devient impossible de cibler l\u2019\u00e9l\u00e9ment par son intitul\u00e9 visible<\/strong>.<\/p>\n\n\n\n<p>Impossible donc d\u2019activer le bouton ci-apr\u00e8s en dictant \u00ab\u00a0Fermer\u00a0\u00bb. Il faudrait dicter \u00ab\u00a0Retour au contenu principal\u00a0\u00bb, mais ce texte n&rsquo;est pas visible \u00e0 l&rsquo;\u00e9cran.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;button aria-label=\"Retour au contenu principal\" onclick=\"myDialog.close()\"&gt;Fermer&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5 : \u00ab\u00a0Ceinture bretelles\u00a0\u00bb rat\u00e9<\/h2>\n\n\n\n<p>Parfois, par souci de trop bien faire, l\u2019objectif n\u2019est pas atteint. L\u2019usage combin\u00e9 des attributs <code>aria-label<\/code> et <code>aria-labelledby<\/code> sur un m\u00eame \u00e9l\u00e9ment n\u2019est pas une bonne id\u00e9e.<\/p>\n\n\n\n<p>L\u2019attribut <code>aria-labelledby<\/code> a le m\u00eame objectif que l\u2019attribut <code>aria-label<\/code>&nbsp;: donner un nom accessible \u00e0 un \u00e9l\u00e9ment. Seulement, <code>aria-labelledby<\/code> a pour valeur l\u2019<code>id<\/code> (ou une liste d\u2019<code>id<\/code>) d\u2019un \u00e9l\u00e9ment sur la page contenant l\u2019intitul\u00e9 en question.<\/p>\n\n\n\n<p class=\"ice-block\">Mais il faut savoir que dans le calcul du nom accessible d\u2019un \u00e9l\u00e9ment, <strong>l\u2019attribut <code>aria-labelledby<\/code> pr\u00e9vaut<\/strong> sur tous les autres attributs et m\u00eame sur le contenu de l\u2019\u00e9l\u00e9ment.<\/p>\n\n\n\n<p>Pour faire simple, si sur un \u00e9l\u00e9ment sont pr\u00e9sents <code>aria-label<\/code>, <code>aria-labelledby<\/code> et contenu textuel, seul le contenu r\u00e9f\u00e9renc\u00e9 par <code>aria-labelledby<\/code> est restitu\u00e9 par les technologies d\u2019assistance.<\/p>\n\n\n\n<p>Cela signifie que le nom restitu\u00e9 pour le bouton suivant est \u00ab&nbsp;Bretelle&nbsp;\u00bb&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;span class=\"sr-only\" id=\"idBretelle\"&gt;<strong>Bretelle<\/strong>&lt;\/span&gt;\n&lt;button aria-label=\"Ceinture\" aria-labelledby=\"idBretelle\" onclick=\"myDialog.close()\"&gt;Fermer&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">6 : Mauvais jugement de valeur<\/h2>\n\n\n\n<p>Comme l\u2019attribut <code>aria-labelledby<\/code> vient d\u2019\u00eatre \u00e9voqu\u00e9, voici une autre confusion rencontr\u00e9e dans le code&nbsp;: donner un <code>id<\/code> comme valeur \u00e0 l\u2019attribut <code>aria-label<\/code>. <\/p>\n\n\n\n<p>Sans surprise, c\u2019est bien l\u2019<code>id<\/code> lui-m\u00eame qui sera restitu\u00e9 par les technologies d&rsquo;assistance.<\/p>\n\n\n\n<p>Dans cet exemple, le nom accessible restitu\u00e9 est \u00ab\u00a0idBouton\u00a0\u00bb :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;span class=&quot;sr-only&quot; id=&quot;idBouton&quot;&gt;Fermer&lt;\/span&gt;\n&lt;button aria-label=&quot;idBouton&quot; onclick=&quot;myDialog.close()&quot;&gt;&lt;span class=&quot;icon&quot;&gt;&lt;\/span&gt;&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7 : Avec la (bonne) langue, c&rsquo;est mieux<\/h2>\n\n\n\n<p>Les attributs <code>aria-label <\/code>ne sont pas visibles sur la page. Ils peuvent, \u00e0 ce titre, \u00eatre des contenus oubli\u00e9s et notamment dans la phase d\u2019internationalisation. Souvent (tr\u00e8s), je retrouve des <code>aria-label<\/code> en anglais sur une page dont la langue par d\u00e9faut est le fran\u00e7ais. <span lang=\"en\">Too bad&nbsp;!<\/span> (dommage).<\/p>\n\n\n\n<p class=\"ice-block\">Autre c\u00f4t\u00e9 d\u00e9savantageux de l\u2019attribut <code>aria-label<\/code>, c\u2019est qu\u2019il passe \u00e0 la trappe <strong>lors d\u2019une traduction automatique<\/strong> de la page&nbsp;: d\u00e9tail \u00e0 ne pas n\u00e9gliger !<\/p>\n\n\n\n<p>Exemple de code (trop) souvent rencontr\u00e9 sur une page en fran\u00e7ais :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;button <strong>aria-label=\"Close\"<\/strong> onclick=\"myDialog.close()\"&gt;&lt;span class=\"icon\"&gt;&lt;\/span&gt;&lt;\/button&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion : comment bien utiliser aria-label ?<\/h2>\n\n\n\n<p class=\"ice-block\">La meilleure fa\u00e7on d\u2019utiliser <code>aria-label<\/code> <strong>c\u2019est surtout de ne pas l\u2019utiliser<\/strong>, comme <a href=\"https:\/\/www.w3.org\/TR\/using-aria\/#rule1\">l\u2019indique la premi\u00e8re r\u00e8gle ARIA (<span lang=\"en\">Accessible Rich Internet Applications<\/span>) (en anglais)<\/a>.<\/p>\n\n\n\n<p>Pour donner un nom accessible \u00e0 un \u00e9l\u00e9ment, il faut privil\u00e9gier cet ordre de priorit\u00e9&nbsp;:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Utiliser la m\u00e9thode HTML native<\/strong>&nbsp;: un \u00e9l\u00e9ment <code>&lt;label&gt;<\/code> avec attribut <code>for<\/code> pour \u00e9tiqueter un champ <code>&lt;input&gt;<\/code>, du contenu textuel dans un \u00e9l\u00e9ment <code>&lt;button&gt;<\/code>, l\u2019attribut <code>alt<\/code> pour une image <code>&lt;img&gt;<\/code> etc.<\/li>\n\n\n\n<li><strong>Utiliser l\u2019attribut <code>aria-labelledby<\/code><\/strong> pointant vers l\u2019<code>id<\/code> d\u2019un texte visible existant&nbsp;: la relation visuelle est ainsi transmise dans le code.<\/li>\n\n\n\n<li><strong>Utiliser du texte en masquage accessible<\/strong> toujours pr\u00e9sent sur la page&nbsp;: cette m\u00e9thode contribue \u00e0 <a href=\"https:\/\/developer.mozilla.org\/fr\/docs\/Glossary\/Progressive_Enhancement\">l\u2019am\u00e9lioration progressive<\/a>, par exemple dans le cas d\u2019ic\u00f4nes informatives ins\u00e9r\u00e9es en CSS.<\/li>\n\n\n\n<li>Utiliser l\u2019attribut <code>aria-label<\/code>&nbsp;<strong>seulement si toutes les options pr\u00e9c\u00e9dentes sont impossibles<\/strong> et garder en t\u00eate que&nbsp;pour ce nom accessible&nbsp;: pas de traduction automatique, pas de possibilit\u00e9 de d\u00e9claration de changement de langue, pas d\u2019utilisation possible \u00e0 la reconnaissance vocale, pas de copie possible du texte, et il n\u2019appara\u00eetra pas sans les feuilles de styles CSS.<\/li>\n<\/ol>\n\n\n\n<p class=\"ice-block\"><a href=\"https:\/\/webaim.org\/projects\/million\/#aria\">D\u2019apr\u00e8s le rapport de <span lang=\"en\">The WebAIM Million<\/span> (en anglais)<\/a> , 74.6 % des pages d\u2019accueil test\u00e9es utilisent ARIA. Les pages avec ARIA comportent en moyenne <strong>34.2 % d\u2019erreurs d\u2019accessibilit\u00e9 en plus<\/strong> que celles sans ARIA.<br><span lang=\"en\">WebAIM (Web Accessibility in Mind)<\/span> est une organisation \u00e0 but non lucratif, fournisseuse de solutions en mati\u00e8re d&rsquo;accessibilit\u00e9 du web depuis 1999.<\/p>\n\n\n\n<p>Raison de plus pour utiliser avec pr\u00e9caution cet attribut <code>aria-label<\/code>&nbsp;!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ressources<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-label\" data-type=\"link\" data-id=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-label\">L&rsquo;attribut <code>aria-label<\/code> sur MDN<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.w3.org\/TR\/using-aria\/\" data-type=\"link\" data-id=\"https:\/\/www.w3.org\/TR\/using-aria\/\">Les r\u00e8gles d&rsquo;utilisation des attributs ARIA (en anglais)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/tink.uk\/the-difference-between-aria-label-and-aria-labelledby\/\">La diff\u00e9rence entre <code>aria-label<\/code> et <code>aria-labelledby<\/code> (en anglais)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/adrianroselli.com\/2020\/01\/my-priority-of-methods-for-labeling-a-control.html\">Les m\u00e9thodes pour donner un nom \u00e0 un \u00e9l\u00e9ment interactif par Adrian Roselli (en anglais)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/adrianroselli.com\/2019\/11\/aria-label-does-not-translate.html\"><code>aria-label<\/code> n&rsquo;est pas traduit par Adrian Roselli (en anglais).<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/webaim.org\/projects\/million\/\">Le rapport de <span lang=\"en\">The WebAIM Million<\/span> (en anglais)<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Qu\u2019est-ce que l\u2019attribut aria-label&nbsp;? L\u2019attribut aria-label contient une cha\u00eene de caract\u00e8res pour fournir un nom accessible \u00e0 un \u00e9l\u00e9ment interactif. En effet, il arrive qu\u2019un \u00e9l\u00e9ment n\u2019ait pas de nom accessible dans le code de la page\u00a0: c\u2019est notamment le cas d&rsquo;un bouton contenant uniquement une ic\u00f4ne. L\u2019attribut aria-label peut \u00eatre alors utilis\u00e9 pour permettre&hellip;<\/p>","protected":false},"author":13,"featured_media":2503,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[22,16],"tags":[],"class_list":["post-2501","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-html-css-et-javascript","category-technologie-dassistance"],"acf":[],"_links":{"self":[{"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/posts\/2501","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/comments?post=2501"}],"version-history":[{"count":12,"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/posts\/2501\/revisions"}],"predecessor-version":[{"id":2517,"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/posts\/2501\/revisions\/2517"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/media\/2503"}],"wp:attachment":[{"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/media?parent=2501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/categories?post=2501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ideance.net\/blog\/en\/wp-json\/wp\/v2\/tags?post=2501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}