Babylon Design

par Samuel Le Morvan

Chez vous aussi, utilisez un Web de qualité

Rubrique Accessibilité

Veillez à la qualité globale de vos créations grâce aux bons conseils de votre hôte !

Rubrique Accessibilité

Sus au <a href="#"> !

Avec l’avènement des librairies Javascript, tout intégrateur HTML/CSS s’amuse à placer un peu partout des tas de petites fonctionnalités rigolotes telles que des carrousels, des accordéons voire des popins. Petit à petit est né le triangle des Bermudes de l’intégrateur.

Le fourvoiement originel

Attiré par la facilité de mise en place de tels gadgets, l’intégrateur contemporain s’est sournoisement détourné de son ineffable vérité : Faire du code HTML propre et sémantique.

Hé oui ! La perversité des RIA a poussé nos intégrateurs à disséminer des boutons d’action au gré de leurs errements pour pouvoir manipuler des composants interactifs. Or, ces boutons d’action se révèlent être un pure incarnation virtuelle des aiguilles vaudou plantées dans la poupée figurant l’accessibilité.

Poupée vaudou

Toi intégrateur ! Regarde-moi dans les yeux et dis moi à quoi est destinée une balise a ! À pointer vers une page externe ou vers un contenu interne à une page sera ta réponse. Et en prononçant ces mots tu commenceras à prendre conscience de ton égarement.

Dans son souci d’avoir des boutons d’action réactifs et tabulables au clavier, l’intégrateur voyait en la balise a son sauveur. Sophisme ! Aveuglé par l’habitude et la facilité, l’intégrateur a oublié sa mission fondamentale : celle de réfléchir d’abord à la structuration des données… En représailles, la balise a affublée d’un dièse orphelin a envoyé aux oubliettes tous les infortunés sans-Javascript.

Avec un peu de réflexion, accordez-moi le fait que la balise a n’est pas faite pour animer des fanfreluches.

Fi de a, mais à présent ?

Heureusement, le Glazman Dieu du HTML avait bien fait les choses dès le départ. Au 4ème jour du HTML, il créa la balise button et l’interrupteur fut.

Cette balise button autant utilisée que négligée voyait en l’arrivée triomphale des animations Javascript son salut. Que nenni ! Elle fût cantonnée à de rares apparitions et ne fût qu’employée par de sages architectes. Pourtant, à l’instar de sa sœur jumelle, l’adulée balise input, elle offre les mêmes possibilités :

  • button type="submit" : permet de valider un formulaire
  • button type="reset" : permet de réinitialiser un formulaire
  • button type="button" : ne fait rien d’autre qu’être un bouton

La balise button prisonière dans son château

Mais ce n’est pas tout ! La balise button n’est pas auto-fermante comme sa fesse-mathieu de sœur. Elle peut accueillir en son sein toutes les balises in-line souhaitant se rallier à sa cause.

Son seul défaut pourrait résider en son physique un peu ingrat. Souvent grise et replette, son apparence sans fard en a effarouché plus d’un. Pourtant, il suffit de l’endimancher avec un border:none; background:none pour qu’elle soit transfigurée.

Distinguez l’Ajax et les animations

Si les animations faites en Javascript fonctionnent avec des boutons d’action, ce n’est pas le cas de l’Ajax. Lorsque l’on met en place de telles requêtes, il va de soi que l’on doit partir d’un lien classique. Nulle question de placer des button à brûle-pourpoint.

Le dit Web 2.0 regroupe principalement deux éléments : l’Ajax et les animations Javascript mais ceux-ci sont bien distincts l’un de l’autre. Un balisage approprié serait : a pour l’Ajax et button pour les animations.

Quels bénéfices pour l’accessibilité ?

Au-delà de donner une structuration plus correcte au contenu HTML, bannir l’utilisation des <a href="#"> va permettre d’améliorer l’accessibilité en plusieurs points :

  • Une quantité moindre de liens dans la page.
  • Des éléments toujours tabulables malgré le changement de structuration.
  • Une navigation par liste de liens épurée dans une synthèse vocale.

Une liste de liens dans Jaws

Devenez des parangons d’intégrateurs

Après avoir lu ce pamphlet qui aura – j’espère – piqué au vif votre qualité d’intégrateur perfectionniste, de grâce ne commettez plus cette erreur.

Pour celer ce pacte, voici quelques exemples d’<a href="#"> pouvant être évité  :

Un bouton transformant du contenu Un bouton de défilement d’images Un bouton de fermeture de popin


Ce que nos lecteurs en disent :

  1. Bouctoubou

    Intéressant et bien écrit! Clap clap! :)

  2. Rik

    C’est quand même bien chiant de devoir mettre cet élément dans un formulaire. Bon, en HTML5 c’est plus le cas mais tout de même.

    Et puis une dose d’ARIA sur des liens, et zou, roulez jeunesse, non ?

    • Shemu

      Bin, je vois pas pourquoi ce serait chiant ? Un <button type="submit|reset" /> réagit exactement comme un <input type="submit|reset" />.

      Après, avec ARIA, c’est sûr plus de problème.

  3. STPo

    Mais quelle prose ! Du Stéphane dans le texte…

    Sinon moi ce que je fais parfois, c’est que je fabrique entièrement en JS les ancres correspondant à une surcouche fonctionnelle, comme ça le malheureux surfeur qui désactive les scripts n’est pas enduit d’erreur.
    Un mélange de flemme et de bonnes pratiques en somme…

    • Shemu

      Yep, c’est une bonne méthode. Mais n’oublie pas qu’utiliser une synthèse vocale ne signifie pas naviguer sans Javascript. Bien au contraire !

  4. an.archi

    Merci pour cet article !

    Il y a un truc qui me dérange, et tu le soulignes d’ailleurs très bien (dans un certain sens) quand tu écris "la balise <a> affublée d’un dièse orphelin".

    Ce n’est pas la balise <a> qui permet de créer un lien vers un document ou une partie de document hypertexte, mais son attribut href. :)
    Une ancre sans href sera (a priori) inoffensive.

    D’un point de vue sémantique, c’est d’ailleurs intéressant de constater qu’une barre de menu où la page courante est une balise <a> sans href a plus de sens que si elle était remplacée par un élément span (en plus de rationaliser les CSS).

    En tout cas, merci bien pour l’idée du button à laquelle je n’avais pas pensée. :)

    • Shemu

      C’est tout à fait juste !

  5. Vincent Valentin

    Et quand on précise une ancre dans le href et qu’elle est cohérente, on a droit hein, c’est plus logique ?

    Très bon article, bien vu l’aveugle ! ;)

    • Shemu

      Tout dépend du contexte mais à priori oui ;)

  6. an.archi

    Un problème cependant pour button (je viens d’essayer sur un projet car je trouvais ta proposition géniale, j’avoue), c’est que comme pour tous les éléments de formulaire, appliquer des styles via CSS reste très aléatoire.

    J’ai notamment essayé un <code>button:focus { text-decoration: underline; }</code> et sur Firefox 3.6 sur Ubuntu Karmic, ça ne semble pas vouloir fonctionner.

    Mais creusons un peu plus, creusons à défaut de pomper…

    • Shemu

      Il est vrai que la mise en forme par défaut est très différente selon les navigateurs.

      Mais pour te prouver que l’on faire la même chose avec un a ou un button, je te propose de jeter un œil à un autre article du site : Des boutons extensibles en CSS compatibles tous navigateurs et notamment la page de test.

      Cependant, il faut faire attention également au évolution des navigateurs. Par exemple dans Firefox 3.6, la mise en page par défaut des button a changé. Il y a maintenant un espacement à réinitialiser par ce bout de code CSS : button::-moz-focus-inner {border: 0; padding: 0;}.

  7. Karen

    Tu t’es fendu :) c’est vrai que c’est bien écrit dis donc :)

  8. an.archi

    Ha ben… J’ai peut-être pas creusé assez profond, alors… J’y retourne. :p

  9. Rik

    Je fais la petite bête hein. Je dis juste que, pour être valide, le <button> doit être dans un <form>. Il doit aussi être dans un <p> ou un <fieldset> ou autre. C’est quand même un peu plus chiant.

    • Shemu

      Non, justement ! button ne requiert pas d’être dans un form contrairement à input. Elle doit simplement être dans une balise block car c’est une inline. C’est un point déterminant dans la solution.

  10. Stéphane Deschamps

    @an.archi : Une ancre sans href sera (a priori) inoffensive.

    Oui et non. Elle ne sera pas focusable au clavier sans galère pour le développeur…

    Complément d’info sur l’article : en revanche une pagination en Ajax doit être fondée sur des liens, ça rend le bookmarkage bien plus facile. Flickr fait ça très bien, par exemple.

  11. an.archi

    @Stéphane: Mais si elle n’est pas focusable, c’est qu’elle n’a pas à l’être, a priori ?

  12. Rik

    Ah oui crotte, je dis des boulettes. Bon bah j’aurais appris quelque chose :)

    Stéphane, tabindex=0 ça marche pas ?

    PS : C’est fort déconcertant l’alignement des commentaires.

    • Shemu

      Pas de problème. Au contraire, ça me permet d’aborder un point que j’avais oublié dans l’article :)

      Pour le PS, un nouvelle version arrive. Pas de date, hein, mais elle arrive !

  13. Nicolas F.

    Slt,

    Je pense qu’utiliser un <a href="#id_du_contenu_ciblé">, c’est plus logique.

    Genre pour le bouton de défilement d’image, tu mets l’id de l’image suivante. Tu détectes le cliques, tu change l’image et tu ne stoppes pas la propagation de l’event qui va directement amener le focus sur l’image visée.

    J’applique ce principe à de nombreuses situations avec succès comme les tabbox, les carroussels etc…

    Du coup, le <input type="button"> ça me tente moyennement :/.

  14. Cyril

    @Nicolas F. : C’est par exemple ce que fait Jquery avec tabs().
    Joli article.

  15. Nicolas Froidure

    J’oubliais, on peut aussi faire du tabbox (ou autre) sans JS totalement accessible en utilisant les référence internes :
    <ul>
    <li><a href="#tab1">Tab 1</a></li>
    <li><a href="#tab2">Tab 2</a></li>
    </ul>
    <div id="tab1" class="tab">
    Contenu de tab1
    </div>
    <div id="tab2" class="tab">
    Contenu de tab2
    </div>
    <style>
    .tab { display:none; }
    .tab:target { display:block; }
    </style>

    Ca marche pas dans IE6-7, mais vous vous en doutiez ;)

  16. Daniel, de SeoMix

    Excellent article.

    J’avais mis en place depuis lien un lien a href=# pour tous mes boutons haut de page. Je me demande pourquoi ne j’y ait pas pensé plus tôt… ^^

    Par contre, certains tests ont démontré qu’un lien avec ancre était considéré comme un lien à part pris en compte par Google. Donc si on veut mettre l’accent sur une zone précise de son site ou de sa page, l’utilisation du href pour des actions utilisateurs est positive pour le référencement.

  17. 3rr0r404

    En tant que débutant je suis tombé sur votre site au hasard de mes recherches sur le web et j’en suis ravi !

    Pour ce qui est de l’article : dorénavant j’y réfléchirais à 2 fois avant de coller un lien alors qu’il n’y a pas lieu ;)

    Merci !

Les commentaires sont clos.