Apprenez tous les attributs et éléments des formulaires HTML5 avec des exemples pour chaque cas : input, validation, autocomplete et accessibilité.
Introduction
Un formulaire HTML est un ensemble de champs qui permettent aux utilisateurs d'entrer des données et de les envoyer à un serveur. C'est comment vous capturez les adresses email, les mots de passe, les commentaires, et bien plus.
Les formulaires sont au cœur de chaque application web :
- Connexion et inscription
- Formulaires de contact
- Recherche et filtrage
- Paiement et e-commerce
- Commentaires et feedback
Les éléments de base
Tout formulaire HTML est composé de quelques éléments clés. Voici les plus importants :
<form> — Le conteneur principal
C'est la balise racine qui encadre tous les champs d'un formulaire :
<form action="/envoyer" method="POST">
<input type="email" name="email" placeholder="Votre email">
<button type="submit">Envoyer</button>
</form>
L'attribut action indique où envoyer les données (ex: /api/login). L'attribut method indique GET (données visibles dans l'URL) ou POST (plus sécurisé).
<input> — Le roi des champs
C'est l'élément le plus utilisé. Son attribut type change complètement son comportement :
<input type="email" name="email" placeholder="Entrez votre email">
<input type="password" name="password" placeholder="Mot de passe">
<input type="checkbox" name="conditions" id="conditions">
<input type="radio" name="genre" value="homme">
<label> — Accessibilité obligatoire
<label> relie du texte à un champ. C'est essentiel pour l'accessibilité : quand l'utilisateur clique sur le texte du label, le focus va sur l'input :
<label for="email">Email</label>
<input type="email" id="email" name="email">
<label>. Même pour les checkboxes et les radios. C'est crucial pour l'accessibilité.
<select> et <textarea> — Les autres champs importants
Pour une liste déroulante :
<label for="pays">Pays</label>
<select id="pays" name="pays">
<option value="">-- Choisir --</option>
<option value="fr">France</option>
<option value="be">Belgique</option>
</select>
Pour du texte multiligne :
<label for="message">Message</label>
<textarea id="message" name="message" rows="5" placeholder="Votre message..."></textarea>
Tous les types d'input
L'attribut type est le plus puissant d'un input. Il change le rendu visuel et ajoute une validation automatique. Voici TOUS les types disponibles :
| Type | Description | Cas d'usage |
|---|---|---|
text |
Texte simple (par défaut) | Noms, adresses, messages courts |
email |
Email. Valide le format automatiquement. Clavier mobile @ | Adresse email |
password |
Masque le texte (affiche des points) | Mots de passe |
number |
Seulement les chiffres. Clavier mobile numérique | Âge, quantité, prix |
tel |
Téléphone. Clavier mobile chiffres + symboles | Numéros de téléphone |
url |
URL. Valide format https://. Clavier mobile avec .com | Sites web, URLs |
search |
Champ de recherche (desktop = input normal, mobile = clavier spécial) | Barres de recherche |
date |
Date au format JJ/MM/AAAA. Sélecteur calendar si supporté | Dates de naissance, dates de départ |
time |
Heure au format HH:MM | Heures de rendez-vous |
datetime-local |
Date ET heure combinées | Réservations, événements |
month |
Mois et année (AAAA-MM) | Dates d'expiration, années |
week |
Numéro de semaine | Planification hebdomadaire |
color |
Sélecteur de couleur (affiche un color picker) | Thèmes, customisation |
range |
Curseur (slider) entre min et max | Volume, luminosité, notations |
checkbox |
Plusieurs choix possibles (cases à cocher) | Conditions, préférences multiples |
radio |
UN SEUL choix possible (boutons radio) | Genre, niveau, une seule option |
file |
Upload de fichier (ouvre un file picker) | Photos, documents, avatars |
hidden |
Champ invisible. Stocke des données côté client | Tokens CSRF, IDs cachés |
submit |
Bouton pour envoyer le formulaire | Bouton d'envoi |
reset |
Bouton pour réinitialiser les champs | Effacer le formulaire |
button |
Bouton neutre (aucune action par défaut) | Actions JavaScript custom |
type="email" affiche @ sur le clavier mobile, type="tel" affiche les chiffres. Meilleure UX = moins de frustration.
Attributs universels des inputs
Ces attributs fonctionnent sur presque tous les inputs pour contrôler leur comportement :
name — L'identifiant du champ (OBLIGATOIRE pour envoyer les données)
C'est le nom utilisé pour accéder aux données. Quand le formulaire est soumis, les données sont envoyées comme name=value :
<input type="email" name="email">
<!-- Résultat : email=utilisateur@exemple.com -->
id — L'identifiant unique (pour lier avec label et CSS)
L'attribut id crée un identifiant unique pour un élément. Utilisé pour les labels et JavaScript :
<label for="email">Email</label>
<input type="email" id="email" name="email">
type — Change le comportement et la validation
Voir la section précédente pour la liste complète. Choisissez le bon type pour chaque situation.
value — Valeur par défaut ou envoyée
C'est la valeur initiale affichée ou celle qui sera envoyée au serveur :
<input type="text" name="prenom" value="Jean">
<input type="radio" name="genre" value="homme">
placeholder — Texte d'exemple (disparaît quand on tape)
Affiche un exemple ou une instruction :
<input type="email" placeholder="exemple@email.com">
required — Rend le champ obligatoire
Le navigateur valide automatiquement que le champ n'est pas vide :
<input type="email" name="email" required>
disabled — Désactive le champ (grisé, non modifiable)
Utile pour les champs temporairement indisponibles :
<input type="text" name="code" disabled value="AUTO-GENERATED">
readonly — Lecture seule (affichage seulement, pas de modification)
Différent de disabled : la valeur est envoyée au serveur :
<input type="text" name="reference" readonly value="REF-12345">
autocomplete — Autocomplétion du navigateur
Permet au navigateur de suggérer des valeurs précédemment saisies :
<input type="email" name="email" autocomplete="email">
<input type="tel" name="phone" autocomplete="tel">
autofocus — Focus automatique au chargement
Place le curseur dans le champ dès que la page se charge :
<input type="text" name="recherche" autofocus placeholder="Chercher...">
form — Lie l'input à un formulaire spécifique
Permet à un input d'être en dehors du <form> mais toujours associé :
<form id="mon-form"></form>
<input type="email" form="mon-form" name="email">
Attributs de validation
HTML5 offre une validation côté client automatique. Ces attributs contraignent les valeurs acceptées :
min et max — Valeurs minimale et maximale
Pour les nombres et les dates :
<input type="number" name="age" min="18" max="120">
<input type="date" name="naissance" min="1950-01-01" max="2024-12-31">
minlength et maxlength — Longueur du texte
Pour contrôler la longueur des inputs texte :
<input type="password" name="password" minlength="8" maxlength="50">
<textarea name="bio" maxlength="500" placeholder="Max 500 caractères"></textarea>
pattern — Expression régulière
Valide le format avec une regex personnalisée :
<!-- Code postal français (5 chiffres) -->
<input type="text" name="codepostal" pattern="[0-9]{5}" placeholder="75001">
<!-- Numéro de téléphone -->
<input type="tel" pattern="[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}">
step — Pas d'incrément
Pour les nombres et les sliders :
<input type="number" name="prix" step="0.01" min="0">
<input type="range" name="volume" min="0" max="100" step="5">
multiple — Plusieurs valeurs
Pour files (plusieurs fichiers) et emails :
<input type="file" name="documents" multiple>
<input type="email" name="emails" multiple placeholder="email1@test.com, email2@test.com">
UX/Mobile : accessibilité et ergonomie
inputmode — Clavier mobile personnalisé
Force un clavier spécifique sur mobile. Très utile pour améliorer l'UX :
<input type="text" inputmode="numeric" placeholder="Code postal">
<input type="text" inputmode="email" placeholder="Email">
<input type="text" inputmode="tel" placeholder="Téléphone">
<input type="text" inputmode="url" placeholder="Site web">
<input type="text" inputmode="search" placeholder="Chercher...">
Les valeurs possibles sont : text, decimal, numeric, tel, email, url, search, none.
list et datalist — Suggestions d'autocomplétion
Fournit une liste de suggestions sans forcer l'utilisateur à choisir dedans :
<input type="text" name="browser" list="browsers">
<datalist id="browsers">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
<option value="Edge">
</datalist>
spellcheck — Vérification orthographique
Active ou désactive la vérification orthographique :
<textarea name="message" spellcheck="true"></textarea>
Accessibilité ARIA
ARIA (Accessible Rich Internet Applications) améliore l'accessibilité pour les personnes en situation de handicap :
aria-label — Description de l'élément
Donne un nom accessible quand il n'y a pas de label visuel :
<button aria-label="Fermer la fenêtre">✕</button>
<input type="search" aria-label="Chercher les produits">
aria-labelledby — Relie à un élément qui décrit
Utilise le texte d'un autre élément comme description :
<h2 id="form-title">Formulaire de contact</h2>
<form aria-labelledby="form-title"></form>
aria-describedby — Description détaillée
Fournit une explication supplémentaire :
<input type="password" aria-describedby="pwd-hint">
<p id="pwd-hint">Le mot de passe doit contenir 8 caractères minimum</p>
aria-required et aria-invalid — État du champ
Indique quand un champ est obligatoire ou invalide :
<input type="email" aria-required="true" aria-invalid="false">
aria-live — Mises à jour dynamiques
Annonce les mises à jour de contenu aux lecteurs d'écran :
<div aria-live="polite">Email envoyé avec succès</div>
Structures avancées
fieldset et legend — Grouper les champs
Organisez les champs liés ensemble. legend donne un titre au groupe :
<fieldset>
<legend>Adresse personnelle</legend>
<label>Rue<label>
<input type="text" name="rue">
<label>Ville</label>
<input type="text" name="ville">
</fieldset>
<fieldset>
<legend>Préférences</legend>
<label><input type="checkbox" name="newsletter"> Recevoir la newsletter</label>
</fieldset>
optgroup — Regrouper les options select
Organisez les choix d'une liste déroulante en groupes :
<select name="ville">
<optgroup label="Île-de-France">
<option>Paris</option>
<option>Versailles</option>
</optgroup>
<optgroup label="Provence">
<option>Marseille</option>
<option>Aix-en-Provence</option>
</optgroup>
</select>
Exemples complets
Formulaire de contact simple
<form action="/api/contact" method="POST">
<label for="nom">Nom</label>
<input type="text" id="nom" name="nom" required>
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
<label for="sujet">Sujet</label>
<select id="sujet" name="sujet" required>
<option value="">-- Choisir --</option>
<option value="general">Question générale</option>
<option value="support">Support technique</option>
</select>
<label for="message">Message</label>
<textarea id="message" name="message" rows="5" required></textarea>
<button type="submit">Envoyer</button>
</form>
Formulaire d'inscription
<form action="/api/signup" method="POST">
<label for="username">Nom d'utilisateur</label>
<input type="text" id="username" name="username" minlength="3" maxlength="20" required>
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
<label for="password">Mot de passe</label>
<input type="password" id="password" name="password" minlength="8" required>
<fieldset>
<legend>Genre</legend>
<label><input type="radio" name="genre" value="h"> Homme</label>
<label><input type="radio" name="genre" value="f"> Femme</label>
<label><input type="radio" name="genre" value="a"> Autre</label>
</fieldset>
<label><input type="checkbox" name="conditions" required> J'accepte les conditions</label>
<button type="submit">S'inscrire</button>
</form>
Formulaire de recherche
<form action="/search" method="GET">
<input type="search" name="q" placeholder="Chercher..." autofocus>
<button type="submit">Rechercher</button>
</form>
Bonnes pratiques
Pour créer des formulaires de qualité, suivez ces principes :
- Utilisez TOUJOURS des labels. Jamais de placeholders seuls
- Choisissez le bon type d'input. type="email" pour emails, type="tel" pour téléphones
- Validez côté client ET serveur. Frontend pour UX, backend pour sécurité
- Groupez les champs liés avec fieldset. Meilleure organisation
- Testez sur mobile. Les champs doivent être utilisables au doigt
- Utilisez autocomplete. Réduit la frustration utilisateur
- Rendez les champs accessibles. Aria labels, descriptions claires
- Indiquez les champs obligatoires. Avec "required" et une indication visuelle
- Ne cachez jamais les erreurs de validation. Montrez-les clairement
- N'utilisez pas de placeholders comme label. C'est confus pour l'utilisateur
Conclusion
Les formulaires HTML5 sont puissants et faciles à maîtriser. Vous disposez maintenant de tous les outils pour créer des formulaires accessibles, rapides et conviviaux.
- Connaître tous les types d'input
- Utiliser les attributs de validation
- Améliorer l'UX mobile avec inputmode
- Rendre accessible avec ARIA et labels
- Organiser avec fieldset et legend