Lesson 7/8 10 min

Forms

Build complete forms with input, label, select, textarea and native HTML validation.

FR EN

La balise <form>

Un formulaire commence toujours par <form>. C'est le conteneur qui regroupe tous les champs. Sans cette balise, rien ne s'envoie.

Deux attributs importants :

  • action : où envoyer les données (URL du serveur)
  • method : GET ou POST

GET met les données dans l'URL, ce qui est utile pour une recherche (on peut partager le lien). POST envoie les données de façon cachée, indispensable pour un mot de passe ou des données sensibles.

Les types d'input essentiels

  • <input type="text"> : champ texte simple
  • <input type="email"> : validation email automatique
  • <input type="password"> : masque la saisie
  • <input type="number"> : que des chiffres
  • <input type="tel"> : clavier téléphone sur mobile
  • <input type="date"> : sélecteur de date natif
  • <input type="checkbox"> : case à cocher
  • <input type="radio"> : choix unique dans un groupe
  • <input type="file"> : upload de fichier

Le bon type améliore l'expérience utilisateur : clavier adapté sur mobile, validation automatique, et sélecteurs natifs.

Labels et accessibilité

Chaque champ doit avoir un <label> associé via l'attribut for. C'est la règle numéro 1 de l'accessibilité des formulaires.

Sans label :

  • Les lecteurs d'écran ne savent pas à quoi sert le champ
  • On ne peut pas cliquer sur le texte pour sélectionner le champ

Attention : le placeholder n'est pas un remplacement du label. Il disparaît dès qu'on tape, et il est souvent illisible (contraste trop faible).

Textarea, Select et Button

  • <textarea> : texte multi-lignes (commentaire, message). Contrairement à <input>, il a une balise fermante.
  • <select> + <option> : menu déroulant. Chaque <option> est un choix possible.
  • <button type="submit"> : envoyer le formulaire. Préférez <button> à <input type="submit"> car il peut contenir du HTML (icônes, etc.).

Validation native

HTML offre une validation gratuite, sans JavaScript :

  • required : champ obligatoire
  • minlength, maxlength : longueur min/max
  • pattern : regex de validation personnalisée

Le navigateur bloque l'envoi si la validation échoue, et affiche un message d'erreur automatique. C'est gratuit et ça fonctionne partout !

The <form> tag

A form always starts with <form>. It's the container that holds all the fields. Without this tag, nothing gets submitted.

Two important attributes:

  • action — where to send the data (server URL)
  • methodGET or POST

GET puts data in the URL — useful for searches (you can share the link). POST sends data hidden — essential for passwords and sensitive data.

Essential input types

  • <input type="text"> — simple text field
  • <input type="email"> — automatic email validation
  • <input type="password"> — masks the input
  • <input type="number"> — numbers only
  • <input type="tel"> — phone keyboard on mobile
  • <input type="date"> — native date picker
  • <input type="checkbox"> — checkbox
  • <input type="radio"> — single choice in a group
  • <input type="file"> — file upload

The right type improves user experience: adapted keyboard on mobile, automatic validation, and native pickers.

Labels and accessibility

Every field must have a <label> linked via the for attribute. This is rule number 1 for form accessibility.

Without a label:

  • Screen readers don't know what the field is for
  • You can't click the text to focus the field

Warning: the placeholder is not a replacement for a label. It disappears once you type, and it's often unreadable (poor contrast).

Textarea, Select and Button

  • <textarea> — multi-line text (comments, messages). Unlike <input>, it has a closing tag.
  • <select> + <option> — dropdown menu. Each <option> is a possible choice.
  • <button type="submit"> — submit the form. Prefer <button> over <input type="submit"> because it can contain HTML (icons, etc.).

Native validation

HTML provides free validation, no JavaScript needed:

  • required — required field
  • minlength, maxlength — min/max length
  • pattern — custom validation regex

The browser blocks submission if validation fails — and shows an automatic error message. It's free and works everywhere!

Essayez vous-même
Avec l'IA

Copiez ce prompt dans Claude ou ChatGPT :

Crée-moi un formulaire d'inscription avec : nom, email, mot de passe, confirmation mot de passe, date de naissance, acceptation CGU (checkbox), et un bouton s'inscrire. Ajoute la validation HTML native (required, minlength, type).
Ré-explique sans regarder

Sans relire le formulaire de l'IA : avec tes mots, comment rendre un champ email obligatoire et valide en HTML pur, sans une ligne de JavaScript ?

Une bonne explication dit : on met type="email" (le navigateur vérifie le format de l'adresse) et on ajoute l'attribut required (le champ devient obligatoire). À l'envoi, si le champ est vide ou mal formé, le navigateur bloque le formulaire et affiche un message d'erreur natif, sans aucun JavaScript. Bonus : minlength ou pattern pour aller plus loin.
Exercice : Corrigez le code de l'IA

L'IA a oublié tous les <label> ! Ce formulaire a des inputs sans label associé. Ajoutez un <label for="..."> pour chaque champ.

Corrigez le code
Accepter ou rejeter le code de l'IA

L'IA te propose ce bouton d'envoi. Ton rôle de relecteur : l'accepter tel quel ou le rejeter, et dire pourquoi.

<div class="btn" onclick="envoyer()">Envoyer</div>
À rejeter. Un <div> cliquable n'est pas un bouton : il n'est pas focusable au clavier, ne réagit pas à la touche Entrée, n'est pas annoncé comme "bouton" par les lecteurs d'écran, et surtout ne déclenche pas l'envoi natif du formulaire ni la validation HTML (required, etc.). Le bon réflexe : <button type="submit">Envoyer</button>, qui soumet le formulaire et déclenche la validation gratuitement.
Rappel libre

Sans remonter dans la leçon : à quoi sert un <label> et comment l'associe-t-on à son champ ? Et pourquoi un placeholder ne le remplace pas ?

Le <label> décrit à quoi sert un champ. On l'associe en faisant correspondre son attribut for à l'id du champ (<label for="email"> + <input id="email">). Bénéfices : les lecteurs d'écran annoncent le champ, et cliquer sur le texte place le focus dedans. Le placeholder ne le remplace pas : il disparaît dès qu'on tape, a un contraste souvent trop faible, et n'est pas un vrai libellé accessible.
Quelle est la différence entre GET et POST ?
Pourquoi toujours utiliser <label> ?
Comment rendre un champ obligatoire sans JavaScript ?
Pour un champ de commentaire multi-lignes, on utilise :
Next step

Your forms can now talk to the visitor. To finish the course on a high note, we move to attributes and best practices: accessibility, id and class attributes, and the pro habits that make HTML clean and durable.

Lesson 8: Attributes and best practices →
Besoin d'un développeur pour votre projet ?

Réponse sous 24h · Sans engagement