Jour 47 - Des formulaires accessibles (partie 1)

Construire des formulaires accessibles en identifiant correctement les champs.

Ce que j’ai fait :

Ce que j’ai appris

Les formulaires, un élément incontournable du web

Les formulaires sont, à mon sens, un des éléments les plus complexes à mettre en oeuvre sur un site web. Qui ne s’est pas déjà retrouvé en difficulté à remplir un formulaire ? :

  • Dois-je indiquer mon nom et mon prénom sur ce champ, ou juste mon nom ?

  • Dans quel format dois-je donner cette date ?

  • Pourquoi ma validation ne marche pas ? J’ai beau cliquer sur le bouton, il ne se passe rien !

Nous avons tous et toutes déjà vécu ces situations et elles sont d’autant plus frustrantes que les formulaires sont généralement indispensables pour effecter des actions telles que faire un achat, compléter les informations d’un profil ou encore contacter un service. L’enjeu d’accessibilité de ces formulaires est donc extrêmement important : tout le monde doit pouvoir accéder aux mêmes informations et réaliser les actions souhaitées.

L’identification des champs

Les lecteurs d’écran permettent, grâce à des raccourcis clavier, de naviguer de champ en champ, et les outils de synthèse vocale proposent d’accéder aux différents champs par leur nom. Associer un champ de formulaire à une étiquette - c’est à dire un intitulé - est donc indispensable pour indiquer clairement à l’internaute le nom du champ sur lequel il ou elle se trouve et lui permettre de remplir au mieux le formulaire.

L’étiquette de champ permet d’indiquer à l’internaute quelle donnée est attendue pour remplir le champ (un nom, une date, une adresse…). Pour être valide, une étiquette doit :

  • être pertinente

  • être correctement reliée à son champ

  • être visuellement accolée au champ

Renseigner une étiquette pertinente

L’étiquette permet de faciliter la compréhension des données attendues dans un formulaire. Elle explicite le rôle d’un champ, ainsi que la nature des données attendues :

  • le type de données (un nom, une date, une adresse…)

  • le format des données (une date au format jour/mois/année)

  • le poids ou le format d’un fichier

Il n’est pas nécessaire d’écrire de grandes phrases, mieux vaut rester concis afin que l’internaute comprenne au mieux ce qu’on attend de lui ou d’elle. Par exemple :

  • Nom

  • Prénom

  • Téléphone (ex : +33612345678)

Il est important de prévoir des étiquettes identiques pour les champs présents plusieurs fois dans la page et dont la fonction est identique. Par exemple, sur un site de voyage, les étiquettes Ville de départ et Ville d'arrivée doivent être les mêmes sur le formulaire de voyage par train et le formulaire de voyage par avion.

Relier correctement l’étiquette à son champ

Plusieurs techniques permettent de relier une étiquette à son champ.

Labelliser avec la balise <label> et les attributs for et id

Le première méthode à privilégier est la relation HTML (HyperText Markup Language) entre un champ et son étiquette grâce à la balise <label> et aux attributs for et id. Un label est dit “explicite” lorsqu’il possède un attribut “for” dont la valeur correspond à la valeur de l’attribut “id” du champ qui lui est associé, comme c’est le cas avec l’exemple suivant :

<label for="prenom">Prénom</label>
<input type="text" id="prenom" />

Un label est dit “implicite” lorsqu’il inclut directement le champ en tant qu’élément enfant. Par exemple :

<label>
  Prénom
  <input type="text" />
</label>

Néanmoins, ce type de code peut poser des problèmes de restitution par les technologies d’assistance. Mieux vaut donc préciser la relation grâce aux attributs for et id.

<label for="prenom">
  Prénom
  <input type="text" id="prenom" />
</label>

Ce type de labellisation permet à tous les utilisateurs et utilisatrices d’accéder au même niveau d’information et il facilite la manipulation en agrandissant la surface de clic du champ (en cliquant sur l’étiquette, le curseur se place automatiquement dans le champ).

Labelliser avec l’attribut title

On peut également renseigner le libellé d’un champ grâce à l’attribut title. Par exemple :

<input type="text" id="prenom" title="Prénom" />

Toutefois, comme nous l’avons déjà vu, l’attribut title n’étant disponible qu’au survol de la souris, il n’apparaîtra pas dans le cas d’une navigation au clavier ou sur mobile. Son implémentation est donc, dans la mesure du possible, à éviter.

Labelliser avec ARIA (Accessible Rich Internet Applications)

Recourir à l’attribut <label> est parfaitement approprié pour labelliser des formulaires, cependant de nombreux formulaires sont implémentés sous la forme de composants Javascript dynamiques utilisant des éléments <div> ou <p>. La spécification ARIA permet alors d’associer un composant à un autre et de créer une étiquette conforme. Par exemple :

<p id="prenom">Votre prénom</p>
<input type="text" aria-labelledby="prenom" />

Cependant, ce type d’implémentation ne fournira une indication de labellisation qu’aux technologies d’assistance, et pas à tous les internautes. D’autre part, l’attribut aria-labelledby remplace toute autre relation existante : à cause de la priorité de restitution, les étiquettes réalisées avec une balise <label> ou un attribut aria-label ou title seront ignorées. Voici un exemple tiré de l’article Formulaires(lien externe) du Guide de l’intégrateur :

<label for="jfname">Votre nom de jeune fille</label>
<input id="jfname" type="text" aria-labelledby="name" />
<p id="name">Votre nom</p>

Ici, le lecteur d’écran restituera l’étiquette Votre nom, l’étiquette Votre nom de jeune fille sera ignorée.

Accoler visuellement l’étiquette à son champ

Il est important d’accoler visuellement l’étiquette au champ associé, afin que l’internaute puisse facilement faire le lien entre les deux.

Cette recommandation est particulièrement importante pour les internautes se servant d’une loupe d’écran ou du zoom : si une étiquette est trop éloignée de son champ, l’internaute la perdra de vue et ne saura pas quel champ il ou elle remplit.

En général, on positionne l’étiquette juste au-dessus du champ, à gauche pour les langues qui s’affichent de gauche à droite, à droite pour les langues qui s’affichent de droite à gauche. Il est aussi possible d’accoler l’étiquette juste à côté du formulaire, à condition que l’intitulé ne soit pas trop long.

Utiliser l’attribut placeholder avec parcimonie

L’attribut placeholder est fréquemment utilisé dans la conception des formulaires : considéré plus esthétique, il permet notamment d’alléger un formulaire en affichant du texte par défaut dans un champ. Ce texte s’effacera dès lors que internaute commencera à saisir du contenu dans le champ en question. Si l’utilisation du placeholder n’est pas interdite, elle est toutefois soumise à certaines conditions.

L’attribut placeholder ne doit pas être utilisé à la place d’une étiquette de champ. En effet le W3C (World Wide Web Consortium) précise bien The placeholder attribute should not be used as an alternative to a label . L’attribut placeholder ne doit pas fournir d’informations essentielles, qui doivent être données par des étiquettes disponibles en permanence. Un mauvaise utilisation du placeholder peut entraîner plusieurs problèmes :

  • fournir des informations sur la nature ou la fonction du champ dans un placeholder, sans autre étiquette, peut être particulièrement frustrant pour l’internaute car ces informations disparaîtront dès lors qu’il ou elle commencera à remplir le champ

  • les technologies d’assistance ne restituent pas toutes de manière uniforme cet attribut

  • la couleur par défaut du placeholder n’est pas suffisamment contrastée

Le placeholder doit donc fournir uniquement des exemples de valeur ou de saisie facultatives, en complément des informations essentielles données par les étiquettes. Voici un exemple tiré de l’article Placeholder et accessibilité(lien externe) du blog d’Atalan :

<label for="sports">Votre sport préféré</label>
<input type="text" id="sports" placeholder="Football, Tennis, Rugby...">

Implémenté de cette manière, et en corrigeant son contraste pour le rendre plus accessible, le placeholder peut être utilisé dans les formulaires.

Le blog d’Atalan évoque également la technique du placeholder “simulé” consistant à superposer une balise <label> visuellement sur le champ.