:focus s’applique dès qu’un élément reçoit le focus, tandis que :focus-visible ne s’applique que lorsque le navigateur juge pertinent d’afficher visuellement ce focus, généralement lors de la navigation au clavier.
En CSS, :focus et :focus-visible sont deux pseudo-classes liées au focus, mais elles ne répondent pas au même besoin d’ergonomie et d’accessibilité.
:focus s’applique dès qu’un élément reçoit le focus, quelle que soit la manière :
element.focus())button:focus {
outline: 2px solid blue;
}
Ici, le bouton aura ce style :
Cela peut produire des effets visuels indésirables :
:focus-visible s’applique uniquement quand le navigateur estime que l’indicateur de focus doit être visible, en général :
Le navigateur utilise des heuristiques (et la spec) pour décider si l’utilisateur est en mode navigation non-pointing (clavier, lecteur d’écran, etc.).
button:focus-visible {
outline: 2px solid blue;
}
Résultat :
| Pseudo-classe | Question posée |
|---|---|
:focus | "L’élément a-t-il le focus ?" |
:focus-visible | "Faut-il montrer visuellement le focus ?" |
button:focus {
outline: none;
}
button:focus-visible {
outline: 2px solid blue;
}
Cela permet :
:focus-visible est aujourd’hui supporté par :
Pour anciens navigateurs, il existe un polyfill officiel :
:focus-visible permet de réconcilier UX et accessibilité sans compromis.
:focus= focus technique:focus-visible= focus quand il est pertinent de le montrer