Chapitre 620 minDébutant
Formulaires et messages d'erreur : les bonnes pratiques
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- organiser un formulaire en une colonne, dans l'ordre de la tâche ;
- choisir le bon type de champ et indiquer le format attendu ;
- valider au bon moment, dans le navigateur et sur le serveur ;
- rédiger des messages d'erreur clairs, polis et utiles ;
- protéger l'utilisateur des actions irréversibles.
4 exercices corrigés1 schéma
Un formulaire ergonomique demande le moins d'informations possible, dans l'ordre où l'utilisateur les a en tête, avec un libellé visible et une aide pour chaque champ ; il prévient les erreurs plutôt que de les reprocher et, quand une erreur arrive, il dit où elle est et comment la corriger, sans rien effacer. Ce chapitre donne les règles pour structurer un formulaire, choisir les bons champs, valider au bon moment et rédiger des messages d'erreur utiles, puis les applique au formulaire de réservation de Prêt'Matos.
Avant le formulaire : chaque champ doit se justifier
Le formulaire est l'endroit où les utilisateurs abandonnent, se trompent et appellent le support. Chaque champ ajouté coûte du temps et une occasion d'erreur. Pour chacun, pose deux questions : en a-t-on vraiment besoin pour rendre le service ? et le sait-on déjà ?
Dans Prêt'Matos, le salarié est connecté avec son compte de l'entreprise : son nom, son service et son adresse sont connus, il ne faut pas les redemander (critère de concision). Il reste trois informations : le matériel (déjà choisi sur la fiche), la période, et un motif facultatif qui aide la logistique à arbitrer quand deux demandes se chevauchent.
Structurer le formulaire
Une seule colonne. L'œil descend le long des champs sans se demander dans quel ordre les lire. Deux colonnes font sauter des champs et cassent au zoom ou sur téléphone. Seule exception : deux champs courts et indissociables, comme la date de retrait et la date de retour, peuvent tenir côte à côte sur un grand écran.
Les libellés au-dessus des champs. C'est la disposition la plus rapide à parcourir, la seule qui fonctionne sur un téléphone et avec un fort zoom, et celle qui laisse la place aux libellés longs et aux traductions.
Des groupes nommés. Les champs qui vont ensemble forment un groupe avec un titre (en HTML, un fieldset et sa legend) : « Période du prêt » réunit les deux dates. Un long formulaire se découpe en étapes, avec un indicateur « Étape 2 sur 3 » (critère de guidage).
L'ordre de la tâche. Les champs suivent la façon dont l'utilisateur pense sa demande : quoi, puis quand, puis pourquoi. Pas l'ordre des colonnes de la table reservation.
Des boutons qui disent ce qu'ils font. Le bouton principal porte un verbe et son objet (« Confirmer la réservation », « Enregistrer le retour »), pas « OK » ni « Valider ». Il n'y en a qu'un par formulaire, visuellement dominant, placé à la fin des champs, là où l'utilisateur arrive. L'action secondaire (« Annuler ») est visible mais discrète. Le bouton « Réinitialiser » qui efface tout est à bannir : personne n'en a besoin, et tout le monde le clique un jour par erreur.
Choisir le bon type de champ
Le bon champ empêche des erreurs avant même la saisie (critère de protection contre les erreurs) et, sur un téléphone, ouvre le bon clavier.
| Besoin | Champ adapté | Pourquoi |
|---|---|---|
| Une date | Sélecteur de date (en HTML, <input type="date">) | Pas d'erreur de format ; le téléphone ouvre son calendrier |
| Un choix parmi 2 à 5 options | Boutons radio | Toutes les options sont visibles (reconnaissance plutôt que rappel) |
| Un choix parmi beaucoup d'options | Liste déroulante, ou champ avec suggestions s'il y en a des dizaines | Évite une saisie libre, tout en restant compacte |
| Oui ou non, une acceptation | Case à cocher, jamais cochée d'avance pour un consentement | Un seul clic, un état clair |
| Un texte court | Champ texte avec autocomplete adapté | Le navigateur peut remplir les données connues |
| Une quantité | Champ numérique (type="number") avec minimum et maximum | Contraint la valeur |
| Un code, un téléphone, un code postal | Champ texte avec inputmode="numeric" ou type="tel" | Clavier numérique, sans les flèches et l'arrondi d'un champ nombre |
| Un texte long | Zone de texte (textarea), avec le nombre de caractères restants | Montre la place disponible |
| Un fichier | Sélecteur de fichier, avec les types et la taille acceptés écrits à côté | L'utilisateur sait d'avance ce qui sera refusé |
Libellés, aides et exemples
Un libellé visible pour chaque champ, toujours. Le texte grisé à l'intérieur du champ (l'attribut placeholder) ne remplace pas un libellé : il disparaît dès qu'on tape, si bien qu'on ne sait plus ce qu'on remplissait ; il est souvent trop pâle pour être lu ; et un champ qui contient du texte gris ressemble à un champ déjà rempli.
Une aide sous le libellé quand le champ a une contrainte. « 15 jours au maximum », « Format : JJ/MM/AAAA », « Le numéro est sur l'étiquette collée sous le matériel ». L'aide est écrite avant l'erreur, pas révélée par elle.
Champs obligatoires et facultatifs. Si presque tous les champs sont obligatoires, signale plutôt les facultatifs (« Motif (facultatif) ») et dis-le en tête du formulaire. Sinon, marque les obligatoires d'un astérisque expliqué en tête (« Les champs marqués * sont obligatoires ») et déclare-les comme tels dans le code (required), pour que les lecteurs d'écran l'annoncent.
Accepter les saisies naturelles. Un numéro de téléphone tapé avec des espaces ou des points, une adresse électronique avec une majuscule ou un espace à la fin : nettoie la saisie au lieu de la refuser. Chaque refus d'une saisie compréhensible est une erreur que tu fabriques (critère de compatibilité).
Valider au bon moment
La validation dit à l'utilisateur si sa saisie est acceptable. Trop tôt, elle l'interrompt ; trop tard, elle l'oblige à revenir en arrière.
| Moment | Ce qu'on vérifie | Exemple sur Prêt'Matos |
|---|---|---|
| Pendant la frappe | Seulement des aides positives | Le compteur « 72 caractères restants » sous le motif |
| À la sortie du champ | Le format et les contraintes du champ, s'il a été rempli | Date de retour antérieure à la date de retrait |
| À l'envoi | Tout le formulaire : champs obligatoires, cohérence entre champs | Période qui dépasse 15 jours ; champ obligatoire vide |
| Sur le serveur, toujours | Toutes les règles, y compris celles qui dépendent des autres données | Matériel déjà réservé sur une partie de la période |
Trois règles accompagnent ce tableau.
- Pas d'erreur sur un champ qu'on n'a pas fini de remplir : afficher « adresse invalide » après la première lettre agace et inquiète.
- Une erreur disparaît dès qu'elle est corrigée : une fois qu'un message est affiché, revérifie le champ à chaque frappe pour l'effacer aussitôt.
- La validation du navigateur est un confort, celle du serveur est une obligation. N'importe qui peut envoyer une requête à l'API sans passer par le formulaire : le serveur revérifie tout, comme l'explique le cours sécurité applicative.
Rédiger un message d'erreur utile
Un bon message d'erreur a quatre qualités.
- Visible : placé juste sous le champ concerné, et rappelé en haut du formulaire quand il y a plusieurs erreurs.
- Explicite : il dit quel champ pose problème et pourquoi, dans les mots de l'utilisateur.
- Constructif : il dit comment corriger, avec un exemple ou la valeur acceptable.
- Courtois : il décrit la situation sans accuser l'utilisateur, sans jargon technique, sans majuscules ni points d'exclamation.
Il doit aussi être perceptible sans la couleur : un texte, éventuellement précédé d'une icône, et pas seulement une bordure rouge, que ne distinguent ni une personne daltonienne ni un lecteur d'écran.
Voici des messages relevés dans des applications, et leur réécriture pour Prêt'Matos. L'application vouvoie ses utilisateurs : c'est un choix de l'équipe, appliqué à tous les textes (critère d'homogénéité).
| Message à éviter | Défaut | Message utile |
|---|---|---|
| « Champ invalide » | Ne dit ni quel champ ni quoi faire | « Indiquez une date de retour postérieure à la date de retrait. » |
| « Erreur 409 » | Code technique | « PC-07 est déjà réservé du 10 au 14 mars. Choisissez d'autres dates ou un autre portable. » |
| « Vous n'avez pas rempli le champ obligatoire !!! » | Accusateur, criard, ne dit pas lequel | « Indiquez la date de retrait. » |
| « Format incorrect » | Ne donne pas le format attendu | « Saisissez la date au format JJ/MM/AAAA, par exemple 12/03/2027. » |
| « Une erreur est survenue » | Ne dit ni quoi ni que faire | « La réservation n'a pas pu être envoyée : la connexion a été interrompue. Vos informations sont conservées ; réessayez dans un instant. » |
| « Durée > 15 j » | Symboles, abréviations | « Choisissez une date de retour au plus tard le 26/03/2027 : un prêt dure 15 jours au maximum. » |
Quand un formulaire long contient plusieurs erreurs après l'envoi, affiche en haut un récapitulatif (« 2 erreurs empêchent l'envoi : »), avec un lien vers chaque champ, et place le focus dessus pour que les utilisateurs de lecteur d'écran l'entendent. Quand l'erreur vient du serveur ou du réseau, affiche un message global, conserve tout ce qui a été saisi et propose de réessayer.
Prévenir plutôt que corriger
Le meilleur message d'erreur est celui qu'on n'a pas besoin d'afficher (heuristique 5 de Nielsen).
- Contraindre la saisie : le calendrier n'autorise pas une date passée ; la date de retour ne peut pas précéder la date de retrait ni la dépasser de plus de 15 jours ; les jours où le matériel est déjà réservé sont grisés, avec la raison au survol ou au focus.
- Proposer de bonnes valeurs par défaut : le matériel de la fiche consultée, la date du jour pour un retour.
- Doser les confirmations : une confirmation (« Supprimer définitivement PC-07 du catalogue ? ») se justifie pour une action rare et irréversible. Pour une action fréquente, une confirmation systématique finit par être cliquée sans être lue ; mieux vaut permettre de défaire pendant quelques secondes (« Retour de PC-07 enregistré. Annuler »).
- Empêcher le double envoi : pendant l'envoi, le bouton affiche « Envoi en cours… » et ne réagit plus ; le serveur, de son côté, refuse proprement une deuxième réservation identique.
- Ne jamais perdre la saisie : après une erreur, un rechargement de page ou une déconnexion, l'utilisateur retrouve ce qu'il avait tapé.
Après l'envoi : confirmer et dire la suite
Le succès mérite autant de soin que l'erreur. Le message de confirmation récapitule ce qui a été enregistré et dit ce qui se passe ensuite :
Réservation confirmée : vidéoprojecteur VP-01, du mercredi 24/03 au vendredi 26/03/2027. À retirer au stock, bâtiment B, de 8 h à 17 h. Vous recevrez un rappel la veille du retour.
Pour Mathis, cette seule phrase aurait évité le point le plus bas de son parcours (chapitre 4).
Des formulaires honnêtes
Certaines interfaces sont conçues pour pousser l'utilisateur à faire ce qu'il ne veut pas : on les appelle interfaces trompeuses (dark patterns). Case d'inscription à la lettre d'information cochée d'avance, bouton « Refuser » minuscule et grisé à côté d'un grand « Accepter », formule culpabilisante (« Non merci, je préfère payer plus cher »), abonnement en un clic mais résiliation en dix écrans.
Ce n'est pas seulement contraire à l'ergonomie (contrôle explicite, compatibilité avec les intentions de l'utilisateur), c'est souvent illégal. Un consentement au sens du RGPD doit résulter d'un acte positif : une case cochée d'avance ne vaut pas consentement, comme l'a jugé la Cour de justice de l'Union européenne en 2019. La CNIL exige que refuser les cookies soit aussi simple que les accepter (cookies et traceurs). Et le règlement européen sur les services numériques (DSA) interdit aux plateformes en ligne de concevoir leurs interfaces de façon à tromper ou manipuler leurs utilisateurs (LCEN et DSA).
Le formulaire de réservation de Prêt'Matos en HTML
Voici l'écran ECR3 « Réserver » écrit en HTML. Il applique les règles du chapitre ; le chapitre 10 en fait un composant React avec la validation et les messages.
<main>
<h1>Réserver le vidéoprojecteur VP-01</h1>
<p>Tous les champs sont obligatoires, sauf le motif.</p>
<form action="/reservations" method="post">
<input type="hidden" name="materiel" value="VP-01">
<fieldset>
<legend>Période du prêt</legend>
<p id="aide-periode">
15 jours au maximum, premier et dernier jour compris.
Retrait et retour au stock, bâtiment B, de 8 h à 17 h.
</p>
<label for="debut">Date de retrait</label>
<input type="date" id="debut" name="debut" required
min="2027-03-08" aria-describedby="aide-periode">
<label for="fin">Date de retour</label>
<input type="date" id="fin" name="fin" required
min="2027-03-08" aria-describedby="aide-periode">
</fieldset>
<label for="motif">Motif (facultatif)</label>
<p id="aide-motif">Par exemple : présentation chez un client. 100 caractères au maximum.</p>
<input type="text" id="motif" name="motif" maxlength="100"
aria-describedby="aide-motif">
<button type="submit">Confirmer la réservation</button>
<a href="/catalogue/VP-01">Annuler</a>
</form>
</main>
| Choix | Règle appliquée |
|---|---|
| Titre « Réserver le vidéoprojecteur VP-01 » | Guidage : l'utilisateur sait où il est et sur quel matériel il agit |
| Phrase sur les champs obligatoires, motif marqué « facultatif » | Incitation ; les champs obligatoires sont aussi déclarés required |
fieldset « Période du prêt » | Groupement par la localisation, nommé pour les lecteurs d'écran |
Aide reliée aux champs par aria-describedby | La contrainte est annoncée avant l'erreur, à l'écran comme au lecteur d'écran |
type="date" avec min | Protection contre les erreurs : pas de format à deviner, pas de date passée (la valeur de min est calculée par le serveur à chaque affichage) |
| Un seul bouton principal, au libellé explicite ; « Annuler » en lien discret | Signifiance, contrôle utilisateur |
Sans JavaScript, ce formulaire fonctionne déjà : le navigateur vérifie les champs obligatoires et les dates, puis le serveur revérifie tout. Le script du chapitre 10 remplace les bulles natives du navigateur par les messages rédigés plus haut.
Exercices
Exercice 1 sur 4 Réécrire des messages d'erreur Réussi À revoir
Réécris chaque message pour une application de gestion des congés qui vouvoie ses utilisateurs.
- « ERREUR : CHAMP OBLIGATOIRE »
- « Date invalide » (la date de fin saisie précède la date de début)
- « Solde insuffisant »
- « Erreur 500 »
- « Le fichier n'est pas valide » (justificatif de 12 Mo, la limite est de 5 Mo)
Voir la réponseMasquer la réponse de l'exercice 1
Des formulations possibles :
- « Indiquez le type de congé. » (Le message nomme le champ ; il est affiché sous lui.)
- « La date de fin doit être postérieure ou égale à la date de début (le 14/04/2027). »
- « Il vous reste 3 jours de congés payés : réduisez la période ou choisissez un autre type de congé. »
- « Votre demande n'a pas pu être enregistrée à cause d'un problème technique. Vos informations sont conservées : réessayez dans quelques minutes. Si le problème continue, contactez le service informatique. »
- « Le justificatif fait 12 Mo : la taille maximale est de 5 Mo. Réduisez-le ou envoyez une photo. »
Chaque réponse dit ce qui ne va pas et comment corriger, sans majuscules, sans code technique, sans reproche.
Tu avais trouvé ?
Exercice 2 sur 4 Les défauts d'un formulaire Réussi À revoir
Le formulaire « Ajouter un matériel au catalogue » de la logistique a été codé sans maquette. Le voici décrit :
- deux colonnes de champs : à gauche « Désignation », « Type », « Date d'achat » ; à droite « N° inventaire », « Prix », « État » ;
- les libellés sont dans les champs, en texte gris (
placeholder) ; - « Type » est un champ texte libre ;
- « N° inventaire » est un champ
type="number"; - en cas d'erreur, tous les champs en erreur deviennent rouges, sans texte, et un message « Formulaire invalide » s'affiche en haut ;
- deux boutons de même taille côte à côte : « Réinitialiser » et « Valider ».
Relève les défauts et propose une correction pour chacun.
Voir la réponseMasquer la réponse de l'exercice 2
| Défaut | Correction |
|---|---|
| Deux colonnes | Une seule colonne, dans l'ordre de la tâche (désignation, type, n° d'inventaire, date d'achat, prix, état) |
Libellés en placeholder | Libellé visible au-dessus de chaque champ ; le texte d'exemple, s'il est utile, va dans une aide sous le libellé |
| « Type » en saisie libre | Liste fermée (portable, vidéoprojecteur, casque…) : pas de fautes de frappe, des données homogènes |
N° d'inventaire en type="number" | Champ texte (le numéro peut commencer par un zéro ou contenir des lettres, comme « PC-07 »), avec le format en aide |
| Erreurs signalées par la seule couleur, message global vague | Un message sous chaque champ fautif, qui dit comment corriger ; un récapitulatif en haut avec des liens vers les champs |
| « Réinitialiser » à côté de « Valider », de même taille | Supprimer « Réinitialiser » ; un seul bouton principal au libellé explicite, « Ajouter au catalogue » ; « Annuler » en action secondaire |
Tu avais trouvé ?
Exercice 3 sur 4 Quel type de champ ? Réussi À revoir
Choisis le champ le plus adapté pour chaque information et justifie.
- Le service de l'emprunteur, parmi 6 services.
- L'état d'un matériel rendu : bon état, abîmé, à réparer.
- La quantité de câbles HDMI prêtés avec un matériel (de 0 à 3).
- Le numéro de téléphone d'un contact.
- L'acceptation de la charte de prêt du matériel.
- Le commentaire du magasinier sur un matériel abîmé.
Voir la réponseMasquer la réponse de l'exercice 3
- Liste déroulante (ou boutons radio si la place le permet) : 6 options fermées ; mais si l'emprunteur est connecté, son service est déjà connu, et le champ disparaît.
- Boutons radio : trois options, toutes visibles d'un coup.
- Champ numérique avec
min="0"etmax="3", ou trois boutons radio et « aucun ». - Champ texte de type
tel, qui ouvre le clavier téléphonique, avecautocomplete="tel"; accepter les espaces et les points. - Case à cocher non cochée par défaut, avec un lien vers la charte.
- Zone de texte (
textarea), avec une limite affichée.
Tu avais trouvé ?
Exercice 4 sur 4 Confirmer ou permettre d'annuler ? Réussi À revoir
Pour chaque action, dis s'il vaut mieux demander une confirmation avant, permettre d'annuler après, ou ni l'un ni l'autre, et justifie.
- Annuler sa propre réservation à venir.
- Supprimer définitivement un matériel du catalogue, avec son historique de prêts.
- Enregistrer le retour d'un matériel (vingt fois par jour pour Noah).
- Changer le tri du planning.
Voir la réponseMasquer la réponse de l'exercice 4
- Les deux se défendent. L'action est courante, ce qui plaide pour un « Rétablir » pendant quelques secondes. Mais dès l'annulation, le créneau est libéré et un autre salarié peut le réserver : le « Rétablir » ne fonctionnerait pas toujours. C'est pourquoi Prêt'Matos a choisi une confirmation courte (écran ECR6), qui rappelle le matériel et les dates.
- Confirmation avant, explicite (« Supprimer définitivement PC-07 et ses 48 prêts ? Cette action est irréversible. »), voire proposer d'archiver plutôt que de supprimer : l'action est rare et irréversible.
- Permettre d'annuler après : une confirmation à chaque retour serait cliquée sans être lue (et ralentirait Noah) ; une erreur doit pouvoir se corriger depuis la liste.
- Ni l'un ni l'autre : l'action ne détruit rien et se défait en un clic.
Tu avais trouvé ?