Jour 49 - Des formulaires accessibles (partie 3)

Construire des formulaires accessibles en fournissant des aides à la saisie et en signalant les erreurs.

Ce que j’ai fait :

Ce que j’ai appris

Les aides à la saisie

Parfois, certains formats spécifiques sont attendus à la saisie. Par exemple : une date de naissance au format jj/mm/aaaa, ou le poids maximal d’un fichier à envoyer. Il est important d’indiquer les formats attendus à l’internaute afin de limiter les risques d’erreur et la frustration.

Directement dans l’étiquette du champ

La solution la plus simple est d’ajouter directement ces indications dans l’étiquette du champ concerné, c’est à dire dans la balise <label>. Elles seront ainsi accessibles à tous les utilisateurs et toutes les utilisatrices. Par exemple :

<label for="date">Date de naissance (au format jj/mm/aaaa)</label>
<input id="date" type="date" />

Avec aria-describedly

Parfois, pour des raisons graphiques ou de mise en page, il n’est pas possible d’intégrer les aides à la saisie dans l’étiquette du champ. Dans ce cas, il est possible de recourir à l’attribut ARIA (Accessible Rich Internet Applications) aria-describedly. Par exemple :

<label for="date">Date de naissance</label>
<input type="date" id="date" aria-describedly="format" />
<p id='format'>Format attendu : jj/mm/aaaa</p>

Avec l’attribut title

Enfin, en dernier recours, il est possible d’utiliser l’attribut title, mais qui ne sera malheureusement pas disponible pour tous les internautes. Par exemple :

<label for="date" title="au format jj/mm/aaaa">Date de naissance</label>
<input type="date" id="date" />

Les champs obligatoires

Outre les formats spécifiques attendus, il est important d’informer l’internaute sur le caractère obligatoire ou non de certains champs. La nature obligatoire du champ peut être indiquée de différentes manières :

  • directement dans l’étiquette
  • dans le code du champ

Indication dans l’étiquette

Le champ obligatoire peut être signalé par un signe distinctif (un pictogramme, une image…) ou par une mention textuelle directement dans la balise <label>. Il est nécessaire de préciser au début du formulaire que le pictogramme ou l’image employée signale un champ obligatoire.

<!-- Exemple avec une mention textuelle -->
<label for="prenom">Votre prénom (champ obligatoire)</label>
<input type="text" id="prenom" />

<!-- Exemple avec un pictogramme -->
<p>Les champs obligatoires sont signalés par le symbole *</p>
<label for="prenom">Votre prénom *</label>
<input type="text" id="prenom" />

Indication dans le code

Les champs obligatoires peuvent aussi être indiqués dans le code grâce à l’attribut required ou à l’attribut ARIA aria-required. Ces attributs seront bien restitués par un lecteur d’écran. En revanche, il est nécessaire de doubler cette information d’une alternative visible pour tous les internautes.

<!-- Exemple avec `required` -->
<p>Les champs obligatoires sont signalés par le symbole *</p>
<label for="prenom">Votre prénom *</label>
<input type="text" id="prenom" required />

<!-- Exemple avec `aria-required` -->
<p>Les champs obligatoires sont signalés par le symbole *</p>
<label for="prenom">Votre prénom *</label>
<input type="text" id="prenom" aria-required="true" />

Contrôle de saisie

Une fois le formulaire rempli et envoyé par l’internaute, il peut arriver que des erreurs soient présentes : des champs obligatoires non remplis ou des formats de données non respectés par exemple. Ces erreurs peuvent être signalées de différentes manières :

  • sous forme de liste, avant le formulaire
  • directement dans l’étiquette du champ
  • à proximité de chaque champ comportant une erreur

En complément, il est également possible d’indiquer les erreurs avec la propriété aria-invalid="true". Mais cette propriété ne peut être utilisée seule, il est nécessaire de lui ajouter une alternative visible pour tous les internautes.

Le RGAA recommande également, en cas d’erreur de saisie, de proposer des exemples facililant la correction.

Une liste d’erreurs avant le formulaire

Cette liste d’erreurs située avant le formulaire doit respecter certaines règles :

  • elle doit être située avant la balise <form>
  • elle doit donner le nombre total d’erreurs
  • chaque erreur doit avoir un lien vers le champ erroné

Les recommandations d’accessibilité d’Orange préconisent également d’utiliser le role="alert" afin de notifier directement les erreurs aux utilisateurs et utilisatrices de technologies d’assistance.

Voici un exemple de liste d’erreurs précédent un formulaire :

<div role="alert">
  <h2>Deux erreurs sont présentes dans le formulaire</h2>
  <ul>
    <li>
      <a href="#prenom" id="prenom_erreur">
        Le champ "Prénom" est obligatoire, veuillez le remplir.
      </a>
    </li>
    <li>
      <a href="#date" id="date_erreur">
      Le champ "Date de naissance" doit respecter le format jj/mm/aaaa, par exemple : 18/10/1989.
      </a>
    </li>
  </ul>
</div>  

<form>
  <label for="prenom">Votre prénom (champ obligatoire)</label>
  <input type="text" id="prenom" aria-required="true" />

  <label for="date">Date de naissance (au format jj/mm/aaaa)</label>
  <input id="date" type="date" />
</form>   

Directement dans l’étiquette du champ

Le message d’erreur et la suggestion de corrections peuvent être intégrés directement dans la balise <label>. Par exemple :

<label for="date">
   Votre date de naissance
   <span class="error">Veuillez renseigner votre date de naissance, au format jj/mm/aaaa, par exemple : 18/10/1989.</span>
</label>
<input type="date" id="date" aria-invalid="true" />

A proximité du champ erroné

Il peut également arriver que pour des raisons graphiques, on souhaite indiquer les erreurs à proximité du champ mais pas directement dans son étiquette. Dans tous les cas, le texte d’erreur doit être relié au champ correspondant grâce à l’attribut aria-describedly. Par exemple :

<label for="date">Votre date de naissance</label>
<input type="text" id="date" aria-invalid="true" aria-describedby="error-date" />
<p class="error" id="error-date">Veuillez renseigner votre date de naissance au format jj/mm/aaaa, par exemple : 18/10/1989.</p>