Utilisez un bouton
(gomakethings.com)- Dans une interface web, utiliser un
plutôt qu’unest le bon choix en matière d’accessibilité et de fonctionnalité - Un `` n’est pas reconnu comme élément interactif par les lecteurs d’écran, et ne réagit ni au focus clavier, ni aux touches
EnteretSpacebar - Même en ajoutant les attributs
[role="button"]ou[tabindex="0"], des problèmes d’ordre de focus et de gestion des événements clavier subsistent - Ajouter plusieurs écouteurs d’événements et des conditions pour corriger ces problèmes introduit une complexité inutile
- Un `` fournit nativement l’accessibilité, le focus et la gestion des entrées clavier : c’est donc la solution la plus simple et la plus standard
Mauvaise approche : fabriquer un bouton avec un ``
- Chez les utilisateurs de React ou HTMX, on voit souvent des implémentations d’interactions comme l’ouverture d’une modale avec un ``
- Exemple de code :
Open Modal
- Exemple de code :
- Problèmes de cette approche
- Les lecteurs d’écran ne reconnaissent pas cet élément comme interactif
- Il est impossible d’y déplacer le focus au clavier
- Seul l’événement
clickfonctionne, et les touchesEnterouSpacebarne déclenchent rien
Les limites des tentatives de “correction” de l’accessibilité
- Ajouter l’attribut
[role="button"]résout le problème de reconnaissance par les lecteurs d’écran, mais les problèmes de focus et de gestion des entrées clavier restent entiers - On peut ajouter
[tabindex="0"]pour rendre l’élément focalisable, mais cela peut perturber l’ordre du focus ou provoquer des déplacements inattendus - Pour gérer les entrées clavier, il faut enregistrer un événement
keydownau niveau global (document), puis détecter la toucheEnterou' '(espace) afin de trouver l’élément focalisé et l’exécuterdocument.addEventListener('keydown', (event) => { if (event.key !== 'Enter' && event.key !== ' ') return; const notRealBtn = document.activeElement.closest('[onclick]'); if (!notRealBtn) return; // 실행 코드 }); - En pratique, cela revient à réimplémenter de façon compliquée ce que `` fournit déjà nativement
Les fonctionnalités natives fournies par ``
- L’élément `` prend automatiquement en charge :
- le rôle implicite (
[role="button"]) - la possibilité d’obtenir le focus automatiquement
- le déclenchement d’un événement
clickavec les touchesEnteretSpacebarlorsque l’élément a le focus
- le rôle implicite (
- Pour reproduire le même comportement avec un
, **plusieurs attributs et scripts sont nécessaires**, alors qu’unsuffit en une seule ligne :Open Modal
Conclusion : la simplicité avant tout
- `` est la façon la plus simple de respecter les standards d’accessibilité tout en réduisant la quantité de code
- Utiliser des éléments HTML standard sans ajouter inutilement des attributs ou de la gestion d’événements est plus avantageux en termes de maintenabilité et d’efficacité
- Le message est clair : plus on veut rester “paresseux” en tant que développeur, plus il faut choisir le bon élément, afin d’éviter une complexité inutile et de tirer parti des fonctionnalités natives du web
7 commentaires
C’est un très bon article. L’idée principale du texte peut se résumer ainsi : « utilisons les balises HTML de manière pertinente ». Si l’on fournit un événement de clic avec une balise
div(ou une autre), je pense que cela ne diffère en rien de l’époque où l’on construisait les mises en page avec des balisestable.Bien sûr, ajouter des attributs
aria-*peut rendre les choses plus explicites, mais tant qu’à se donner tout ce mal, autant utiliser directement la balise appropriée lolQue de souvenirs, haha
Utilisez des boutons
background, border, outline, appearance, -webkit-appearance, cursor
Il y a beaucoup trop de styles par défaut à écraser, snif snif
C’est pour ça qu’il existe un reset CSS.
Les sites des administrations de notre pays utilisent beaucoup ``, on dirait...
Avis Hacker News
L’un de mes griefs, c’est quand des sites web implémentent la navigation avec des handlers
onclickIl suffit d’utiliser une balise `` et tout fonctionne automatiquement comme il faut : ouverture dans un nouvel onglet, intégration avec les dispositifs d’accessibilité, menu du clic droit, etc. Si c’est de la navigation, il faut utiliser des liens plutôt qu’une soupe JavaScriptonClickMême les éléments qui étaient en pratique des liens étaient tous gérés via des handlers de clic, et ça me dépasseLa plupart des boutons devraient explicitement avoir
type="button"La valeur par défaut estsubmit, donc s’ils sont dans un formulaire ils le soumettent automatiquement Je pense que certains développeurs utilisent des `` parce qu’ils ne le savent pas, etest différentpermet d’éviter le problème de `type="submit"` Unest vide dès le départ, donc on n’ajoute que les fonctionnalités nécessaires, et c’est plus facile à modifier ensuite À l’inverse, avec ``, il faut consulter la documentation pour comprendre le comportement par défaut Au final, c’est une question de contrôle explicite vs fonctionnalités intégréesJ’aurais aimé que l’article élargisse le propos vers l’idée d’utiliser simplement les éléments HTML conçus pour cet usage Beaucoup de développeurs SPA ne comprennent pas bien la sémantique des éléments HTML, donc ils réinventent la roue à chaque fois
Aujourd’hui, il y a toute une génération qui clique partout à l’écran pour trouver les zones interactives Il y a 10 ans, quelqu’un a fait en sorte que le glisser de lien passe avant la sélection de texte, et maintenant il est presque impossible de sélectionner du texte Il faudrait peut-être forker le navigateur pour corriger ça
La feuille de style par défaut de Chrome contient
button {align-items: flex-start}, ce qui m’a fait perdre beaucoup de temps à cause d’un bug de taille flexbox Malgré ça, j’essaie autant que possible d’utiliser les bons éléments HTML, mais sur de petits side projects il arrive que `` soit plus pratiqueappearance: noneest utile pour réinitialiser le style des boutons J’ai créé une classe.unbuttonifypour obtenir un comportement de bouton avec une autre apparenceIl faut utiliser les éléments conformément à leur intention d’origine autant que possible
J’ai deux reproches à faire aux boutons L’un, c’est qu’il faut de toute façon restyliser leur apparence, l’autre, c’est l’avertissement disant qu’on ne peut pas imbriquer des boutons En pratique, on tombe dessus assez souvent
Les LLM génèrent souvent ce genre de mauvais patterns Ils ignorent fréquemment les fonctionnalités natives du navigateur et implémentent des choses de façon inutilement complexe Je demande souvent à Claude de simplifier ce genre de code Ils ont aussi tendance à rendre étrange la gestion des erreurs en TypeScript
Moi, j’essaie d’utiliser des boutons par défaut autant que possible En revanche, quand quelque chose doit réellement se comporter comme un lien, j’utilise une balise ``
Je me demandais pourquoi certains voulaient utiliser ``