Invalide
Ici l'ancre liée à l'annotation n'est pas cliquable, le contenu est difficilement accessible.
Cette page renseigne des règles à suivre concernant l'Accessibilité.
RGAA signifie Référentiel Général d’Amélioration de l’Accessibilité

Comment mettre en place une annotation en bas de page ? Critère 10-9 Annotation
Invalide
Ici l'ancre liée à l'annotation n'est pas cliquable, le contenu est difficilement accessible.
Valide
Pour mettre en place une annotation valide il y a plusieurs cas possibles :
Une ancre est cliquable et amène à l'annotation. Le contenu de celle-ci est facilement accessible et une ancre permet de revenir à l'endroit initial où celle-ci était signalée.
Une ancre reliée à une annotation :
Plusieurs ancres reliées à une même annotation :
autocomplete.Pourquoi mettre en place l'atttribut autocomplete :
Invalide
Soit ne pas renseigner l'atttribut autocomplete soit le renseigner avec off
Oui
Pour des valeurs comme nom / prénom / date d'anniversaire / code postale... (pour la liste exhaustisve voir avec UX) glossaire autocomplete
Cas particuliers : le combobox
Le combobox proposant aussi une aide à la saisie, il peu y avoir conflit. Pour éviter cela, la valeur de l'autocomplete sera dynamique.
A l'initialisation de la page :
A la prise de focus sur le champ :
Invalide
Voila le code d'une iframe fournie par youtube
Valide
Pour qu'une iframe soit valide, il faut qu'elle ait un attribut title.
Critère 2
MDN
Certains éléments fournis dans les iframe ne sont pas corrects.
L'attribut title doit être explicite. Dans notre cas il faut indiquer le nom de la vidéo. L'usage de certains attributs n'est pas correct.
Exemple : frameborder ne doit pas être utilisé car il est déprécié. Il est aussi préférable de gérer la taille de l'iframe via css
Cas général
L'attribut alt doit être renseigné à vide.
Cas pour le SEO (référencement Naturel)
L'attribut alt doit être renseigné avec un texte optimisé pour le SEO.
Il est nécessaire d'ajouter l'attribut aria-hidden='true' pour permettre aux lecteurs d'écran d'ignorer l'image.
L'attribut alt doit être renseigné avec un texte porteur d'informations.
La légende d'une image peut contenir :
Exemple de rendu :
A partir du moment où une image comporte une légende :
figure doit être utilisée pour englober à la fois l'image & sa légende.
role='figure' .aria-label doit être renseigné et correspondre à la valeur du figcaption , c'est à dire soit le :
figcaption doit englober la légende.Remarque :
Le altest obligatoire même si l'image est décorative, dans ce cas indiquer par exemple "illustration" dans le alt si la légende n'apporte pas d'information pertinente (ex: copyright). Si il y a plusieurs images avec légende dans la page, incrémenter la valeur d"'illustration" = illustration 1, illustration 2. A adapter en fonction du contexte par le contributeur
Exemple de structure valide pour une image et sa légende :
Le champ de formulaire peut être un :
inputtextareaselectPrincipes de base :
label doit être associé à un champ de formulaire et réciproquement. C’est à dire que l’un ne va pas sans l’autre. label est utilisé uniquement dans un formulaire et sert à nommer un champ de formulaire.label doit être pertinent et doit permettre de comprendre la fonction du champ auquel il est rattaché.label ne doit pas être utilisé pour afficher un simple texte.L'intitulé du Label doit être pertinent & explicite :
Comment utiliser correctement un label ?
Pour associer correctement votre label et votre champ input par exemple, nous allons utiliser l'attribut for :
Pour associer correctement votre input et votre champ label, nous allons utiliser l'attribut id :
Comment choisir entre <a> et <button> ?
Non (utiliser un élément button)
Un button déclenche une action, il est par exemple employé pour :
Oui (utiliser un élément a)
Un a permet de naviguer. Il est employé pour :
Lien du RGAA : Critère 12.6 / Critère 12.7
C'est quoi ? Pourquoi faire ?
Pour répondre aux besoins d'accessibilité (critères 12.6 et 12.7) des "liens d'évitements" sont nécessaires. Leurs objectifs est simplement de naviguer dans la page en évitant une partie du contenu (le contenu est séparé dans différentes zones).
Pour la zone de contenu principale (main) il faut obligatoirement prévoir un lien d'évitement (avec ou sans landmark sur cette zone).
Pour les autres zones il y a plusieurs assemblages possibles :
Nous préconisons la mise en place systématique des landmarks sur les différentes zones. Pour les liens d'évitements (en plus de celui vers la zone principale) c'est à voir avec les UX.
Liste des landmarks:
role='banner'role='navigation'role='main'role='contentinfo'role='search'Le code est à placer comme premier élément du body.
Les liens ne sont visibles que via la prise de focus.
Prévoir un role='navigation' + un aria-label pour donner du contexte.
Il faut aussi prévoir des id sur nos landmarks pour bénéficier de la gestion d'ancre native.
Non
Ajouter un libellé texte en masquage accessible si nécessaire , et continuer.
Si le lien est basé sur une image <img>, ajouter le libellé dans l’attribut alt de l’image, et continuer.
Oui
ContinuerVERIFICATION EXPERT
lien avec img:
sr-only :
Exemple : plusieurs liens “en savoir plus” sur une même page. Chaque lien possède une cible différente.
Non
ContinuerOui
Terminé
Exemple :
Non
Ajouter une information discriminante au libellé texte, par une des techniques
Oui
Terminé
sr-only :
aria-label :
aria-describedby :
title :
Non
Ajouter un libellé texte en masquage accessible si nécessaire , et continuer.
Si le lien est basé sur une image <img>, ajouter le libellé dans l’attribut alt de l’image, et continuer.
Oui
ContinuerVERIFICATION EXPERT
button avec img:
sr-only :
Exemple : plusieurs boutons “supprimer” sur une page listant des options.
Non
Ajouter une information discriminante au libellé texte, par une des techniques
Oui
Terminé
sr-only :
aria-label :
aria-describedby :
title :
Critère RGAA : 11.10.5
Invalide
Le placeholder ne doit jamais contenir d’information importante (exemple : précision nécessaire à la compréhension de la demande, format de donnée), ce sont les sous-labels (indications de saisie) qu’il faut utiliser.
Valide
le placeholder peut contenir des exemples de saisie non obligatoires à la compréhension (exemple : des noms de produits dans une barre de recherche d’un site e-commerce)
La bonne pratique serait de ne pas afficher de placeholder par défaut, et ne les utiliser que s’ils apportent quelque chose dans l’expérience utilisateur sans être indispensables à restituer.
A noter :
Invalide
Pour l'accessibilité cette structure est invalide car un button n'accepte que des balises de type : contenu phrasé.
Une div n'est pas un contenu phrasé
Valide
Le span est une balise de contenu phrasé.
Dans ce cas de figure c'est la balise la plus adaptée.
Informations
.form-grouplabeldoit être associé à la classe .field-labelrequired Invalide
Ici mon label et mon input ne sont pas liés.
Valide
Pour relier mon label.field-label et mon input j'utilise les attributs foret id .
l'attribut name doit également être renseigné et correspond au nom du champ qui sera rattaché à la donnée récupérée via le formulaire.
Un champ de formulaire peut être rattaché un label et un sous-label.
Nous avons déjà vu juste au dessus comment mettre en place le label.
Pour ajouter un sous-label il faut utiliser la balise html p associée à la classe .field-item.
Invalide
Ici il n'y a que mon label qui est rattaché à moninput .
Valide
Pour relier mon sous-label p.help-input je lui attribue un id et sur mon champinputje mets en place l'attribut aria-describedby .
Le .field-label et le .help-input sont reliés à mon input .
Lors de la lecture du champinput les 2 éléments seront vocalisés.
Il y a plusieurs structure disponible pour mettre en palce un champ regroupé :
fieldset legendrole="radiogroup" role="group"Nous avons fait le choix de la structure aria qui est plus souple que la structure native.
Invalide
Les différents éléments ne sont pas techniquement reliés entre eux.
Valide
Pour une structure valide il est obligatoire d'avoir role="radiogroup" ou role="group" et de lui relier notre question, ici .field-label via id et aria-labelledby.
Pour la structure label avec input (cf structure-input-label)
Il est possible d'avoir des informations complémentaire dans nos champs regroupés. La structure va donc évoluer, certains éléments devront être techniquement reliés.
Les nouveautées :
.help-input .information.action-modalInvalide
Les différents éléments ne sont pas techniquement reliés entre eux.
Valide
Pour une structure valide il est obligatoire de relier notre .help-input via id et aria-labelledby à notre role="radiogroup" ou role="group".
Dans le cas avec .information ou .action-modal nous allons avoir une modal ou collapse avec un button comme élément déclencheur. L'élément est focusable, grâce à cela peu importe la manière de naviguer avec les AT, l’utilisateur va le lire et donc pas besoin de lié les éléments. Néanmoins les règles de construction d'un button s'applique (cf libelles-bouton)
Le piège :
Tout d'abord ne pas confondre l'attribut autocomplete et un composant combobox.
L'attribut autocomplete permet à votre navigateur de proposer une autocompletion alors qu'un composant combobox va proposer une autocompletion avec un service extérieur (ex: une api pour retrouver son addresse).
La solution technique, partie HTML :
input ou textarea avec :
role='combobox'aria-autocomplete='list'aria-expanded='true/false'autocomplete="XXX" (pour plus d'info sur la valeur à choisir doc attribut-autocomplete)ul/ol pour la présentation des propositions avec :
role='listbox'aria-label='Suggestions de saisie : (contexte différenciant)'li avec :
role='option'aria-selected='true/false'tabindex='-1'div avec :
aria-atomic='true'aria-live='polite'La solution technique, partie JS :
aria-expanded='true/false' à l'ouverture/fermeture de la liste de résultatfocus sur le résultat current aria-selected='true/false'aria-activedescendant n'a pas été retennu car moins robuste que la solution avec un focus natiffocus du champ et entrainera la fermeture de la liste de résultatenter ou un click
focus dans le champ de saisie
Critère du RGAA : Liens Critère 10-6 Critère 10-7
Principes de base :
Un cas d'exception : mon lien / bouton se trouve dans une zone de texte.
Dans ce cas de figure je dois appliquer une représentation graphique différenciante (exemple: le soulignement)
Si ma représentation graphique différenciante est uniquement portée par une couleur alors je dois appliquer les 3 critères suivant (10-6):
Invalide
Pour l'accessibilité cette structure est invalide car le libellé est l'ensemble du contenu de la balise a. Le libellé n'est pas explicite, il y a trop d'information.
Valide
Ici le lien à un libellé moins dense. Il est plus simple d'avoir un libellé explicite. Pour répondre aux besoins UX/UI d'avoir une zone de clic plus grande comme avec le code invalide, on peut utiliser la méthode du lien étendu (streched link).
Principes de base
.wrapper-notification
role='region'aria-label='Indique le nombre de notification' (gestion dynamique).wrapper-notification n'est pas dans le DOM. Il est injecté en même temps que la notification.Comportement :
aria-labelaria-labelmain, h1, barre d'étape)main.aria-label
.wrapper-notification est supprimé du DOM.Un exemple valide de structure pour la mise en place d'une notification
id et l'attribut aria-describedby qui lui, doit être renseigné sur le champ input .aria-invalid='true' pour bien signifier que le champ input est en erreur..has-error est associée à la classe .form-group ..help-block est ajoutée à la balise p contenant le message d'erreur.Attention, en plus de la structure suivante, il est nécessaire de gérer le placement du focus dans le champ avec l'apparition du message d'erreur.
Voici un exemple valide de structure pour la mise en place d'un message d'erreur
id et l'attribut aria-labelledby qui lui, doit être renseigné sur l'élément role='group' ou role='radiogroup'.tabindex='-1' est placé sur l'émément portant le role='group / radiogroup'..has-error est associée à la classe .form-group ..help-block est ajoutée à la balise p contenant le message d'erreur.aria-invalid n'est pas nécessaire. La structure actuelle couvre le critère 11.10Voici un exemple valide de structure pour la mise en place d'un message d'erreur
button présent dans la modale, soit via la touche echap du clavier.role='dialog'aria-labelledby='id_Titre'tabindex='-1'aria-modal='true'role='document'.modal-content
.modal-header
role='document'.h1, la modale représente un nouveau contexte le h1 est plus cohérent. Néanmoins il est possible d'avoir un autre niveau de titre. Ne pas oublier l'id pour le lien technique avec aria-labelledby.modal-body (RAS).modal-footer (RAS)
Principes de base :
Utilisation de la balise <i>. La balise <span> est plus adaptée mais dans notre contexte il est préférable de garder une balise facilement identifiable.
Nos icones ne sont pas porteuses d'information, il faut donc ajouter aria-hidden='true'pour que le lecteur ne vocalise par le picto.
Structure :
Principes de base :
La mixin svg-sprite-icon permet de générer les pictos avec un mask-image.
L'intéret est que le lecteur d'écran ne vocalise pas d'information contrairement à la solution via une font d'icones. En passant par une font le lecteur d'écran peut chercher à vocaliser l'id $id et cela n'aurait aucun sens pour l'internaute.
Structure invalide :
Structure valide :
La variable $id renseigne maintenant le mask-image et non l'attribut content qui lui reste vide.
Invalide
Valide