skip-link
Le lien d’évitement doit avoir une cible résoluble et utilisable
Vérifie que le fragment de l’href d’un lien « aller à ... » se résout en un élément réel et actuellement utilisable du document.
Applicabilité. S’applique aux éléments <a href="#fragment"> qui sont des liens d’évitement d’après l’un de deux signes :
- le nom accessible suit une formulation courante de lien d’évitement dans l’une des langues fournies : « skip » ou « jump to » (anglais) ; « aller au contenu », « passer au contenu », « accéder au contenu », « accès direct », « évitement » (français) ; « springen », « überspringen », « direkt zum », « zum Inhalt » (allemand) ; « saltar », « ir al contenido » (espagnol) ; « スキップ », « 本文へ » (japonais). « jump to » figure à côté de « skip » parce que les vrais liens d’évitement utilisent les deux conventions (p. ex. un lien « Jump to section ») ;
- ou c’est le premier lien du document et il précède l’élément
main(ou un élément dont l’attribut role se résout en main, son premier vrai jeton de rôle, sans tenir compte de la casse) : l’emplacement habituel d’un lien d’évitement, quelle que soit sa formulation.
Les autres liens d’ancre vers la même page ne sont pas des liens d’évitement et ne sont pas examinés. Lorsque la page n’a ni <main> ni role="main", un élément personnalisé auquel ses ElementInternals donnent le rôle main (this.attachInternals().role) est le main par rapport auquel se mesure la position d’un lien.
Attendu. Le fragment du lien se résout en un élément réel du document (via un id correspondant, ou un ancien <a name="...">), et cette cible est actuellement utilisable (non masquée de l’arbre d’accessibilité ; et, lorsque la géométrie du navigateur est disponible, rendue avec une surface qu’aucun ancêtre ne réduit à néant : un ancêtre en overflow: hidden réduit à une taille nulle, ou en overflow: clip qui la maintient à l’extérieur). Un lien d’évitement dont la cible est absente ou inutilisable dans les faits ne fournit pas de destination de contournement fiable. Une cible vide (sans élément ni texte à l’intérieur), comme <a id="content" tabindex="-1"></a> ou un ancien <a name>, n’a par nature aucune surface : suivre le lien lui donne le focus, ou y place le point de départ de la navigation séquentielle du focus (HTML, « scroll to the fragment »), si bien que la touche Tab suivante continue à partir de là. C’est ce qu’elle marque qui est mesuré à la place : son ancêtre le plus proche doté d’un contenu propre, comme le <main> qu’elle ouvre. Une cible en display: contents n’a pas de boîte propre, et est mesurée d’après celles de ses enfants.
Ce que rapporte un constat.
href: lehrefdu lien.unusableReasonCode(une cible inutilisable) : pourquoi elle l’est :ACC_TREE_INELIGIBLElorsqu’elle est masquée de l’arbre d’accessibilité,NO_CLIENT_RECTSlorsqu’elle n’est pas rendue,ZERO_AREA_TARGETlorsqu’elle, ou pour une cible vide le contenu qu’elle marque, n’a pas de surface ou est réduite à néant.targetSelector(une cible inutilisable) : un sélecteur pour la cible.geometryCheckEnabled(une cible inutilisable) : si la géométrie de la cible a pu être mesurée, ce qui nécessite un navigateur.viewport.width,viewport.height(une cible dont la géométrie a été mesurée) : le viewport dans lequel la page a été mise en page, en pixels CSS. Une cible masquée à une largeur peut être utilisable à une autre.
Ces champs de data.details aident à lire et à reproduire un constat. À part reasonCode et les quelques champs que la page Schéma de sortie donne comme stables, ils ne constituent pas un contrat stable : un champ peut être renommé ou supprimé dans une version mineure, ne vous appuyez donc pas dessus.
Exemples
<a href="#target">Skip to content</a><div id="target">Target content</div>
La cible du fragment existe et est utilisable.
<a href="#missing">Skip to main content</a>
La cible du fragment du lien n’existe nulle part dans la page : l’activer ne mène nulle part.
<a href="#contenu">Aller au contenu</a>
La formulation française des liens d’évitement est aussi reconnue, et la cible est absente.
Comment vérifier
Quand cette règle ne peut pas trancher, elle renvoie cantTell et laisse la question à une personne. Chaque question qu’elle peut poser figure ici sous son code de raison, avec les étapes pour y répondre. Un constat porte les mêmes étapes dans howToCheck, dans la langue de l’analyse. Voir Schéma de sortie.
SKIP_LINK_TARGET_MISSING
- Chargez la page, appuyez une ou deux fois sur Tab jusqu’à ce que le lien d’évitement indiqué par le rapport apparaisse, et notez son href.
- Appuyez sur Entrée pour le suivre.
- Appuyez encore une fois sur Tab et voyez où arrive le focus.
Réussite. Suivre le lien amène au contenu principal, et la touche Tab suivante va au premier contrôle qu’il contient.
Échec. Rien ne se passe ou le focus reste en haut, car aucun élément ne correspond à la cible du lien : le lien ne permet donc pas de contourner le contenu répété (bonne pratique, G1).
SKIP_LINK_TARGET_UNUSABLE
- Chargez la page à la largeur de fenêtre indiquée par le rapport (le cas échéant), appuyez sur Tab jusqu’à ce que le lien d’évitement apparaisse, puis appuyez sur Entrée.
- Observez si la page défile jusqu’à la cible et si la zone cible est visible.
- Appuyez encore une fois sur Tab et voyez où arrive le focus.
Réussite. La page se déplace vers le contenu principal visible, et la touche Tab suivante va au premier contrôle qu’il contient.
Échec. La cible est masquée, non affichée ou sans dimension : le focus ne dépasse donc pas le contenu répété (bonne pratique, G1).