Séance 3 : Formulaires HTML
🎯 Objectifs de la séance
À la fin de cette séance, vous serez capable de :
- Créer des formulaires HTML fonctionnels
- Utiliser différents types d'inputs et leurs attributs
- Implémenter la validation côté client
- Structurer un formulaire accessible
📚 Partie théorique
3.1 Introduction aux formulaires
Les formulaires permettent aux utilisateurs d'interagir avec un site web en envoyant des données.
Structure de base
<form action="traitement.php" method="POST">
<!-- Champs du formulaire -->
<button type="submit">Envoyer</button>
</form>
Attributs principaux :
action: URL où envoyer les données (serveur backend)method: Méthode HTTPGET: Données visibles dans l'URL (recherche, filtres)POST: Données cachées (inscription, mot de passe)
3.2 Les inputs de base
Input texte
Pourquoi <label> ?
- Associe une étiquette à un champ (accessibilité)
- Cliquer sur le label active le champ
fordoit correspondre à l'idde l'input
Types d'inputs texte
<!-- Texte simple -->
<input type="text" name="nom">
<!-- E-mail (validation automatique) -->
<input type="email" name="email">
<!-- Mot de passe (caractères masqués) -->
<input type="password" name="mdp">
<!-- Téléphone -->
<input type="tel" name="telephone">
<!-- URL -->
<input type="url" name="site-web">
<!-- Nombre -->
<input type="number" name="age" min="18" max="99">
<!-- Date -->
<input type="date" name="date-naissance">
<!-- Heure -->
<input type="time" name="heure-rdv">
<!-- Recherche -->
<input type="search" name="recherche">
3.3 Attributs importants des inputs
<input
type="text"
name="pseudo" <!-- Nom envoyé au serveur -->
id="pseudo" <!-- Pour le label -->
placeholder="Ex: John42" <!-- Texte d'indication -->
value="Valeur par défaut" <!-- Valeur pré-remplie -->
required <!-- Champ obligatoire -->
minlength="3" <!-- Longueur minimum -->
maxlength="20" <!-- Longueur maximum -->
pattern="[A-Za-z0-9]+" <!-- Expression régulière -->
readonly <!-- Lecture seule -->
disabled <!-- Désactivé (non envoyé) -->
autofocus <!-- Focus automatique -->
>
Exemple avec validation
<label for="email">E-mail :</label>
<input
type="email"
id="email"
name="email"
placeholder="votre@email.com"
required
>
3.4 Cases à cocher et boutons radio
Checkbox (cases à cocher)
Permet de sélectionner plusieurs options.
<p>Choisissez vos langages :</p>
<input type="checkbox" id="python" name="langages" value="python">
<label for="python">Python</label>
<input type="checkbox" id="java" name="langages" value="java">
<label for="java">Java</label>
<input type="checkbox" id="js" name="langages" value="javascript">
<label for="js">JavaScript</label>
Pré-cocher une case :
<input type="checkbox" id="accepte" name="accepte" checked>
<label for="accepte">J'accepte les conditions</label>
Radio buttons (boutons radio)
Permet de sélectionner une seule option parmi plusieurs.
<p>Niveau d'études :</p>
<input type="radio" id="l1" name="niveau" value="L1">
<label for="l1">Licence 1</label>
<input type="radio" id="l2" name="niveau" value="L2" checked>
<label for="l2">Licence 2</label>
<input type="radio" id="l3" name="niveau" value="L3">
<label for="l3">Licence 3</label>
⚠️ Important : Même name pour grouper les options (une seule sélection possible).
3.5 Zones de texte et listes déroulantes
Textarea (zone de texte multiligne)
<label for="message">Message :</label>
<textarea
id="message"
name="message"
rows="5"
cols="40"
placeholder="Votre message ici..."
maxlength="500"
></textarea>
Select (liste déroulante)
<label for="formation">Formation :</label>
<select id="formation" name="formation">
<option value="">-- Choisissez --</option>
<option value="info">Informatique</option>
<option value="maths">Mathématiques</option>
<option value="physique" selected>Physique</option>
</select>
Select multiple :
<select id="options" name="options" multiple size="4">
<option value="opt1">Option 1</option>
<option value="opt2">Option 2</option>
<option value="opt3">Option 3</option>
</select>
Grouper les options
<select id="pays" name="pays">
<optgroup label="Europe">
<option value="fr">France</option>
<option value="de">Allemagne</option>
</optgroup>
<optgroup label="Asie">
<option value="jp">Japon</option>
<option value="cn">Chine</option>
</optgroup>
</select>
3.6 Boutons
<!-- Bouton de soumission (envoie le formulaire) -->
<button type="submit">Envoyer</button>
<input type="submit" value="Envoyer">
<!-- Bouton de réinitialisation (efface les champs) -->
<button type="reset">Réinitialiser</button>
<input type="reset" value="Effacer">
<!-- Bouton normal (nécessite JavaScript) -->
<button type="button">Cliquez-moi</button>
3.7 Organisation et accessibilité
Fieldset et Legend (grouper des champs)
<fieldset>
<legend>Informations personnelles</legend>
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom">
<label for="prenom">Prénom :</label>
<input type="text" id="prenom" name="prenom">
</fieldset>
<fieldset>
<legend>Identifiants</legend>
<label for="email">E-mail :</label>
<input type="email" id="email" name="email">
<label for="mdp">Mot de passe :</label>
<input type="password" id="mdp" name="mdp">
</fieldset>
Datalist (auto-complétion)
<label for="navigateur">Votre navigateur :</label>
<input type="text" id="navigateur" name="navigateur" list="navigateurs">
<datalist id="navigateurs">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
<option value="Edge">
</datalist>
3.8 Validation HTML5
Attributs de validation
<!-- Champ obligatoire -->
<input type="text" required>
<!-- Longueur -->
<input type="text" minlength="3" maxlength="20">
<!-- Valeurs numériques -->
<input type="number" min="0" max="100" step="5">
<!-- Pattern (regex) -->
<input type="text" pattern="[0-9]{5}" title="Code postal à 5 chiffres">
<!-- E-mail valide -->
<input type="email" required>
Messages d'erreur personnalisés
<input
type="text"
id="code"
pattern="[A-Z]{3}[0-9]{3}"
title="Format : 3 lettres majuscules + 3 chiffres (ex: ABC123)"
required
>
💻 Partie pratique
Exercice 4 : Formulaire d'inscription événement tech
📋 Consignes
Créez un fichier inscription.html avec un formulaire d'inscription pour un événement tech (hackathon, conférence, LAN party...).
Le formulaire est modulaire : faites au minimum les sections obligatoires, les sections bonus sont optionnelles si vous avez le temps.
🔴 PARTIE OBLIGATOIRE
Section 1 : Informations personnelles
- Nom (texte, obligatoire)
- Prénom (texte, obligatoire)
- E-mail (e-mail, obligatoire)
- Date de naissance (date)
Section 2 : Choix de participation
- Type d'événement (liste déroulance avec options : Hackathon, Conférence, LAN Party, Workshop)
- Niveau d'expérience (case à cocher avec un seul choix possible parmis: Débutant, Intermédiaire, Avancé)
Section 3 : Centres d'intérêt
- Technologies (case à cocher avec 5 choix : Web, Mobile, IA, Data, Cloud, Cybersécurité)
- Commentaires (texte long)
Section 4 : Validation
- Case à cocher "J'accepte les conditions" (obligatoire)
- Boutons submit et reset
🟢 PARTIE BONUS
Section 5 : Adresse
- Adresse complète (texte)
- Code postal (texte avec pattern pour imposer 5 chiffres)
- Ville (auto-complétion des villes avec options : Paris, Lyon, Marseille, Toulouse, Bordeaux, Lille)
Exigences techniques
- [ ] Utiliser
<fieldset>et<legend>pour grouper les sections - [ ] Tous les champs doivent avoir un
<label>associé - [ ] Utiliser
placeholderpour guider l'utilisateur - [ ] Structure HTML valide
- [ ] Code commenté pour séparer les sections
✅ Checklist de validation
- [ ] Partie obligatoire complète et fonctionnelle
- [ ] Tous les labels associés aux inputs
- [ ] Validation (required) sur les champs importants
- [ ] Boutons submit et reset présents
- [ ] Code indenté et commenté
Note : Si vous finissez la partie obligatoire rapidement, essayez d'implémenter les sections bonus !
🔧 Conseils et bonnes pratiques
Structure d'un formulaire accessible
<form>
<!-- Toujours associer label et input -->
<label for="champ">Label :</label>
<input type="text" id="champ" name="champ">
<!-- Ou envelopper -->
<label>
Label :
<input type="text" name="champ">
</label>
</form>
Messages d'aide
<label for="mdp">Mot de passe :</label>
<input type="password" id="mdp" name="mdp" required>
<small>Minimum 8 caractères, incluant majuscules et chiffres</small>
📝 À retenir de cette séance
✅ <form> contient tous les champs et définit action et method
✅ Toujours associer <label> et input via for et id
✅ type détermine le comportement de l'input (text, email, password, number, date...)
✅ required, pattern, min/max permettent la validation côté client
✅ <fieldset> et <legend> organisent les sections
✅ Checkbox pour choix multiples, radio pour choix unique
✅ <select> pour listes déroulantes, <textarea> pour texte long
✅ Attribut name est crucial : c'est lui qui est envoyé au serveur
📚 Pour aller plus loin
Documentation
Outils
- HTML Form Guide - Guide visuel
- Regex101 - Tester les expressions régulières
💬 Questions fréquentes (FAQ)
Q : Quelle différence entre name et id ?
R : id sert à identifier l'élément côté client (CSS, JS, label). name est le nom de la variable envoyée au serveur.
Q : Pourquoi utiliser required si on peut valider côté serveur ?
R : Double sécurité ! La validation HTML améliore l'UX (feedback immédiat) mais il faut TOUJOURS valider côté serveur aussi.
Q : <button> ou <input type="submit"> ?
R : <button> est plus flexible (peut contenir des images, du HTML). Préférez <button type="submit">.
Q : Les données sont-elles envoyées automatiquement ?
R : Non, vous devez avoir un serveur backend (PHP, Node.js, Python...) à l'adresse indiquée dans action. Pour l'instant, on met action="#" pour tester.