Le formulaire pas à pas

Apprenez à créer des formulaires HTML complets et accessibles, champ par champ, jusqu’au formulaire d’inscription professionnel.

Qu'est-ce qu'un Formulaire HTML ?

Les formulaires sont essentiels pour l'interactivité web : collecte de données, authentification, feedback utilisateur, commandes...

Anatomie d'un Formulaire

Structure de base :

html

<form action="traitement.php" method="POST">
    <label for="nom">Nom :</label>
    <input type="text" id="nom" name="nom" required>
    <button type="submit">Envoyer</button>
</form>

Composants expliqués :

<form>

Conteneur principal avec action (où envoyer) et méthode (comment envoyer)

<label>

Étiquette associée à un champ pour l'accessibilité

<input>

Champ de saisie avec type, nom et validation

<button>

Bouton d'envoi ou d'action

Méthodes GET vs POST

GET Méthode GET

  • Données visibles dans l'URL
  • Limitée à ~2000 caractères
  • Peut être mise en favoris
  • Idéale pour recherche/filtres

html

URL résultante :
site.com/search?q=pizza&ville=paris

POST Méthode POST

  • Données cachées (corps de requête)
  • Aucune limite de taille
  • Plus sécurisé
  • Pour inscription, connexion, upload

html

Données cachées dans :
Corps HTTP (invisible)

Structure et Attributs Essentiels

Découvrez les attributs indispensables pour créer des formulaires professionnels et accessibles.

Attributs <form>

action

URL de destination des données

action="process.php"

method

GET ou POST

method="POST"

enctype

Pour upload de fichiers

enctype="multipart/form-data"

Attributs <input>

name

Identifiant côté serveur

name="email"

id

Lien avec <label>

id="user_email"

placeholder

placeholder="nom@email.com"

Validation HTML5

required

required

pattern

pattern="[0-9]{5}"

min/max

min="1" max="100"

Les 10 Types de Champs Essentiels

Découvrez chaque type de champ avec ses spécificités, ses attributs et ses cas d'usage.

1 Champ Texte (type="text")

Code HTML :

html

<label for="nom">Nom complet :</label>
<input
    type="text"
    id="nom"
    name="nom"
    placeholder="Jean Dupont"
    maxlength="50"
    required
>

Attributs spécifiques :
  • maxlength : Nombre max de caractères
  • minlength : Nombre min de caractères
  • size : Largeur visible du champ
  • readonly : Lecture seule

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Cas d'usage :
  • Noms, prénoms
  • Adresses
  • Titres d'articles
  • Recherche générale

11 Champ Caché (type="hidden")

Code HTML :

html

<!-- Token CSRF -->
<input
    type="hidden"
    name="_token"
    value="csrf_abc123xyz"
>
<!-- ID d'utilisateur -->
<input
    type="hidden"
    name="user_id"
    value="1234"
>
<!-- Action/État -->
<input
    type="hidden"
    name="action"
    value="update_profile"
>

Caractéristiques :
  • Invisible à l'utilisateur
  • Pas d'interaction possible
  • Transmis automatiquement
  • Valeur fixe ou générée dynamiquement

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
⚠️ Sécurité importante :
  • Visible dans le code source HTML
  • Modifiable par l'utilisateur technique
  • Toujours valider côté serveur
  • Ne pas stocker de données sensibles
✅ Cas d'usage courants :
  • Tokens CSRF : Protection contre les attaques
  • IDs d'enregistrement : Identifier les données à modifier
  • Actions de formulaire : Spécifier l'opération à effectuer
  • Données de session : Informations temporaires
  • Valeurs calculées : Résultats d'étapes précédentes
  • Timestamps : Horodatage de soumission
❌ À éviter absolument :
  • Mots de passe : Visibles dans le code source
  • Clés API : Exposées côté client
  • Prix/montants : Modifiables par l'utilisateur
  • Permissions : Facilement contournables
  • Données personnelles : Problèmes de confidentialité
  • Logique métier critique : Non sécurisée

Exemples pratiques d'utilisation :

1. Formulaire d'édition d'un article

html

                    &lt;h5 class="text-white font-medium mb-3"&gt;&lt;/h5&gt;
<form method="POST" action="/articles/update">
  <!-- ID de l'article à modifier -->
  <input type="hidden" name="article_id" value="456">
  <!-- Token de sécurité -->
  <input type="hidden" name="_token" value="">
  ... <!-- Champs visibles -->
</form>

2. Formulaire de panier e-commerce

html

                    &lt;h5 class="text-white font-medium mb-3"&gt;&lt;/h5&gt;
<form method="POST" action="/cart/add">
  <!-- ID du produit -->
  <input type="hidden" name="product_id" value="789">
  <!-- Prix (calculé côté serveur, pas de sécurité ici) -->
  <input type="hidden" name="price_display" value="29.99">
  <!-- Quantité visible à l'utilisateur -->
  <input type="number" name="quantity" min="1" value="1">
</form>

3. Formulaire multi-étapes

html

                    &lt;h5 class="text-white font-medium mb-3"&gt;&lt;/h5&gt;
<form method="POST" action="/registration/step2">
  <!-- Étape courante -->
  <input type="hidden" name="current_step" value="2">
  <!-- Données de l'étape précédente -->
  <input type="hidden" name="step1_data" value="">
  <!-- Timestamp de début -->
  <input type="hidden" name="started_at" value="">
  ... <!-- Champs de l'étape 2 -->
</form>

Manipulation avec JavaScript :

html

// Créer un champ hidden dynamiquement
const hiddenInput = document.createElement('input');
hiddenInput.type = 'hidden';
hiddenInput.name = 'dynamic_data';
hiddenInput.value = 'valeur_calculée';
form.appendChild(hiddenInput);
// Modifier la valeur d'un champ hidden existant
document.querySelector('input[name="_token"]').value = 'nouveau_token';
// Vérifier l'existence d'un champ hidden
const tokenField = document.querySelector('input[name="_token"]');
if (tokenField) {
    console.log('Token:', tokenField.value);
}

2 Champ Email (type="email")

Code HTML :

html

<label for="email">Email :</label>
<input
    type="email"
    id="email"
    name="email"
    placeholder="nom@example.com"
    autocomplete="email"
    required
>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Avantages :
  • Validation automatique du format email
  • Clavier mobile optimisé (@, .com)
  • Autocomplétion du navigateur
  • Impossible d'envoyer sans @ et domaine

3 Champ Mot de Passe (type="password")

Code HTML :

html

<label for="password">Mot de passe :</label>
<input
    type="password"
    id="password"
    name="password"
    minlength="8"
    pattern="(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}"
    required
>

Pattern expliqué :
  • (?=.*[a-z]) : 1 minuscule minimum
  • (?=.*[A-Z]) : 1 majuscule minimum
  • (?=.*\d) : 1 chiffre minimum
  • .{8,} : 8 caractères minimum

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Bonnes pratiques :
  • Toujours masquer la saisie
  • Ajouter des règles de complexité
  • Permettre l'affichage temporaire
  • Confirmation sur un 2ème champ

4 Champ Numérique (type="number")

Code HTML :

html

<label for="age">Âge :</label>
<input
    type="number"
    id="age"
    name="age"
    min="13"
    max="120"
    step="1"
    value="25"
    required
>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Attributs spécifiques :
  • min/max : Valeurs limites
  • step : Incrément (0.01 pour décimales)
  • value : Valeur par défaut
  • Boutons +/- automatiques

5 Champ Date (type="date")

Code HTML :

html

<label for="naissance">Date de naissance :</label>
<input
    type="date"
    id="naissance"
    name="naissance"
    min="1900-01-01"
    max="2010-12-31"
    value="1995-06-15"
    required
>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Format et contraintes :
  • Format obligatoire : YYYY-MM-DD
  • Calendrier intégré dans la plupart des navigateurs
  • min/max : Plage de dates autorisées
  • Validation automatique de date valide

6 Liste Déroulante (<select>)

Code HTML :

html

<label for="pays">Pays :</label>
<select id="pays" name="pays" required>
    <option value="">-- Choisir un pays --</option>
    <optgroup label="Europe">
        <option value="FR" selected>France</option>
        <option value="DE">Allemagne</option>
    </optgroup>
    <optgroup label="Amérique">
        <option value="US">États-Unis</option>
        <option value="CA">Canada</option>
    </optgroup>
</select>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Éléments clés :
  • <option> : Chaque choix avec value et texte
  • <optgroup> : Regroupement d'options
  • selected : Option présélectionnée
  • multiple : Sélection multiple possible

7 Zone de Texte (<textarea>)

Code HTML :

html

<label for="message">Message :</label>
<textarea
    id="message"
    name="message"
    rows="5"
    cols="50"
    placeholder="Votre message ici..."
    maxlength="500"
    required
>
Texte par défaut ici
</textarea>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Différences avec input :
  • Texte multiligne autorisé
  • rows/cols : Taille visuelle
  • Contenu entre balises (pas value)
  • Redimensionnable par l'utilisateur

8 Boutons Radio (type="radio")

Code HTML :

html

<fieldset>
    <legend>Genre :</legend>
    <label>
        <input type="radio" id="homme" name="genre" value="M" checked>
        Homme
    </label>
    <label>
        <input type="radio" id="femme" name="genre" value="F">
        Femme
    </label>
    <label>
        <input type="radio" id="autre" name="genre" value="A">
        Autre
    </label>
</fieldset>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Règles importantes :
  • Même name = groupe exclusif
  • value différente pour chaque option
  • <fieldset> + <legend> pour l'accessibilité
  • Un seul choix possible par groupe

9 Cases à Cocher (type="checkbox")

Code HTML :

html

<fieldset>
    <legend>Langages préférés :</legend>
    <label>
        <input type="checkbox" id="html" name="langages[]" value="html" checked>
        HTML
    </label>
    <label>
        <input type="checkbox" id="css" name="langages[]" value="css" checked>
        CSS
    </label>
    <label>
        <input type="checkbox" id="js" name="langages[]" value="javascript">
        JavaScript
    </label>
    <!-- Case unique -->
    <label>
        <input type="checkbox" id="newsletter" name="newsletter" value="oui" required>
        J'accepte les conditions
    </label>
</fieldset>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Bonnes pratiques :
  • name[] : Tableau pour choix multiples
  • name unique pour case unique
  • required : Obligatoire à cocher
  • checked : Présélectionnée

10 Upload de Fichiers (type="file")

Code HTML :

html

<!-- IMPORTANT: form avec enctype -->
<form enctype="multipart/form-data">
    <label for="photo">Photo de profil :</label>
    <input
        type="file"
        id="photo"
        name="photo"
        accept="image/*"
        required
    >
    <!-- Multiple fichiers -->
    <label for="documents">Documents :</label>
    <input
        type="file"
        id="documents"
        name="documents[]"
        accept=".pdf,.doc,.docx"
        multiple
    >
</form>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Attributs spécifiques :
  • enctype="multipart/form-data" sur <form>
  • accept : Types de fichiers autorisés
  • multiple : Sélection multiple
  • capture : Appareil photo mobile

Organisation et Accessibilité des Formulaires

Apprenez à structurer vos formulaires avec fieldset/legend et à améliorer l'expérience utilisateur avec placeholder et label.

Fieldset et Legend - Groupement de Champs

Structure de base :

html

<fieldset>
    <legend>Informations personnelles</legend>
    <label for="prenom">Prénom :</label>
    <input type="text" id="prenom" name="prenom">
    <label for="nom">Nom :</label>
    <input type="text" id="nom" name="nom">
</fieldset>
<fieldset disabled>
    <legend>Options avancées</legend>
    <!-- Tous les champs seront désactivés -->
    <input type="checkbox" name="option1"> Option 1
</fieldset>

Rendu visuel :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Avantages de fieldset/legend :
  • Regroupement visuel et logique
  • Amélioration de l'accessibilité
  • Support des lecteurs d'écran
  • Attribut disabled sur tout le groupe

Labels - Association et Accessibilité

Différentes techniques :

html

<!-- Méthode 1: for/id (recommandée) -->
<label for="email_user">Adresse email :</label>
<input type="email" id="email_user" name="email">
<!-- Méthode 2: label englobant -->
<label>
    Téléphone :
    <input type="tel" name="telephone">
</label>
<!-- Label avec icône et description -->
<label for="mot_de_passe" class="label-avec-info">
    🔒 Mot de passe
    <span class="required">*</span>
    <small class="help-text">8 caractères minimum</small>
</label>
<input type="password" id="mot_de_passe" name="password">
<!-- Label pour radio/checkbox -->
<label class="checkbox-label">
    <input type="checkbox" name="newsletter">
    Je souhaite recevoir la newsletter hebdomadaire
</label>

Rendu et comportement :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
Points clés des labels :
  • Cliquer sur le label active le champ
  • Obligatoire pour l'accessibilité
  • for="id" = association explicite
  • Label englobant = association implicite
  • Peut contenir des éléments de mise en forme

Placeholder - Texte d'Aide et Exemples

Exemples d'utilisation :

html

<!-- Placeholder informatif -->
<input type="text" name="nom"
      placeholder="Dupont">
<!-- Placeholder avec format -->
<input type="email" name="email"
      placeholder="nom@entreprise.com">
<!-- Placeholder avec instructions -->
<input type="tel" name="telephone"
      placeholder="01 23 45 67 89">
<!-- Placeholder pour recherche -->
<input type="search" name="recherche"
      placeholder="Rechercher un produit, une marque...">
<!-- Textarea avec placeholder -->
<textarea name="message" rows="4"
      placeholder="Décrivez votre problème en détail...">
</textarea>
<!-- Placeholder avec unité -->
<input type="number" name="poids"
      placeholder="70 (en kg)">

Démonstration interactive :

Formulaire réel : la validation du navigateur s’y applique, la soumission est bloquée.
⚠️ Bonnes pratiques :
  • Ne JAMAIS remplacer le label par placeholder
  • Donner des exemples concrets, pas des instructions
  • Être concis mais informatif
  • Éviter les textes redondants avec le label
❌ À éviter :
  • placeholder="Entrez votre nom" (redondant)
  • placeholder="Nom*" (remplace le label)
  • Placeholders trop longs (lisibilité)
  • Informations critiques uniquement dans placeholder

Accessibilité Avancée avec ARIA

Attributs ARIA pour formulaires :

html

<!-- Champ avec description -->
<label for="password">Mot de passe</label>
<input type="password" id="password"
      aria-describedby="pwd-help pwd-error"
      aria-required="true">
<div id="pwd-help">8 caractères minimum</div>
<div id="pwd-error" role="alert">Erreur: trop court</div>
<!-- Groupe avec titre -->
<div role="group" aria-labelledby="shipping-title">
    <h3 id="shipping-title">Adresse de livraison</h3>
    <!-- champs adresse -->
</div>
<!-- Champ optionnel -->
<label for="commentaire">
    Commentaire <span aria-label="optionnel">(optionnel)</span>
</label>
<textarea id="commentaire" aria-required="false"></textarea>

Impact sur l'accessibilité :

Attributs ARIA essentiels :
  • aria-required : Indique si le champ est obligatoire
  • aria-describedby : Lie le champ à sa description
  • aria-labelledby : Référence un titre/label
  • role="alert" : Annonce les erreurs
  • aria-invalid : État de validation
Bénéfices :
  • Lecteurs d'écran informés
  • Navigation clavier améliorée
  • Contexte accessible à tous
  • Conformité WCAG 2.1
Test d'accessibilité :
  • Naviguer uniquement au clavier (Tab)
  • Tester avec un lecteur d'écran
  • Vérifier les contrastes de couleurs
  • Valider avec axe DevTools

Validation HTML5 Avancée

Découvrez les techniques de validation côté client pour améliorer l'expérience utilisateur.

Messages d'Erreur Personnalisés

CSS pour le style :

html

/* Champs valides */
input:valid {
    border-color: green;
    background: rgba(0,255,0,0.1);
}
/* Champs invalides */
input:invalid {
    border-color: red;
    background: rgba(255,0,0,0.1);
}
/* Focus sur champ obligatoire vide */
input:required:invalid {
    border-color: orange;
}

JavaScript pour messages :

html

// Messages personnalisés
const email = document.getElementById('email');
email.addEventListener('invalid', function(e) {
    if (this.validity.valueMissing) {
        this.setCustomValidity('Veuillez renseigner votre email');
    } else if (this.validity.typeMismatch) {
        this.setCustomValidity('Format email invalide');
    } else {
        this.setCustomValidity('');
    }
});

Patterns (RegEx) Utiles

Code postal français :

pattern="[0-9]{5}"

Exactement 5 chiffres

Téléphone français :

pattern="0[1-9]([0-9]{8})"

Commence par 0, puis 9 chiffres

Mot de passe fort :

pattern="(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}"

8+ caractères avec maj, min, chiffre et symbole

URL :

pattern="https?://.+"

Commence par http:// ou https://

Nom d'utilisateur :

pattern="[a-zA-Z0-9_-]{3,16}"

3-16 caractères, lettres, chiffres, _ et -

Carte bancaire :

pattern="[0-9]{4}[\s]?[0-9]{4}[\s]?[0-9]{4}[\s]?[0-9]{4}"

16 chiffres avec espaces optionnels

Projet : Formulaire d'Inscription Complet

Créons ensemble un formulaire professionnel utilisant tous les 10 types de champs étudiés.

Formulaire Complet - Tous les Champs

html

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Inscription - Formulaire Complet</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
        .form-group { margin-bottom: 20px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input, select, textarea { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 5px; }
        input:valid { border-color: green; background: rgba(0,255,0,0.1); }
        input:invalid { border-color: red; background: rgba(255,0,0,0.1); }
        fieldset { border: 1px solid #ddd; border-radius: 5px; padding: 15px; }
        legend { font-weight: bold; padding: 0 10px; }
        .checkbox-group label, .radio-group label { display: flex; align-items: center; font-weight: normal; }
        .checkbox-group input, .radio-group input { width: auto; margin-right: 10px; }
        button { background: #007bff; color: white; padding: 12px 30px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; }
        button:hover { background: #0056b3; }
        .required { color: red; }
    </style>
</head>
<body>
    <h1>Formulaire d'Inscription Complet</h1>

    <form action="traitement.php" method="POST" enctype="multipart/form-data">

        <!-- 1. CHAMP TEXTE -->
        <div class="form-group">
            <label for="nom">Nom complet <span class="required">*</span></label>
            <input type="text" id="nom" name="nom" placeholder="Jean Dupont" maxlength="50" required>
        </div>

        <!-- 2. CHAMP EMAIL -->
        <div class="form-group">
            <label for="email">Email <span class="required">*</span></label>
            <input type="email" id="email" name="email" placeholder="nom@example.com" autocomplete="email" required>
        </div>

        <!-- 3. CHAMP MOT DE PASSE -->
        <div class="form-group">
            <label for="password">Mot de passe <span class="required">*</span></label>
            <input type="password" id="password" name="password" minlength="8"
                   pattern="(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}" required>
            <small>8 caractères min. avec majuscule, minuscule et chiffre</small>
        </div>

        <!-- 4. CHAMP NUMÉRIQUE -->
        <div class="form-group">
            <label for="age">Âge <span class="required">*</span></label>
            <input type="number" id="age" name="age" min="13" max="120" step="1" value="25" required>
        </div>

        <!-- 5. CHAMP DATE -->
        <div class="form-group">
            <label for="naissance">Date de naissance <span class="required">*</span></label>
            <input type="date" id="naissance" name="naissance" min="1900-01-01" max="2010-12-31" required>
        </div>

        <!-- 6. LISTE DÉROULANTE -->
        <div class="form-group">
            <label for="pays">Pays <span class="required">*</span></label>
            <select id="pays" name="pays" required>
                <option value="">-- Choisir un pays --</option>
                <optgroup label="Europe">
                    <option value="FR" selected>France</option>
                    <option value="DE">Allemagne</option>
                    <option value="ES">Espagne</option>
                </optgroup>
                <optgroup label="Amérique">
                    <option value="US">États-Unis</option>
                    <option value="CA">Canada</option>
                </optgroup>
            </select>
        </div>

        <!-- 7. ZONE DE TEXTE -->
        <div class="form-group">
            <label for="message">Message de présentation</label>
            <textarea id="message" name="message" rows="5" placeholder="Parlez-vous un peu de vous..." maxlength="500"></textarea>
            <small>Maximum 500 caractères</small>
        </div>

        <!-- 8. BOUTONS RADIO -->
        <fieldset class="form-group">
            <legend>Genre <span class="required">*</span></legend>
            <div class="radio-group">
                <label>
                    <input type="radio" id="homme" name="genre" value="M" checked required>
                    Homme
                </label>
                <label>
                    <input type="radio" id="femme" name="genre" value="F" required>
                    Femme
                </label>
                <label>
                    <input type="radio" id="autre" name="genre" value="A" required>
                    Autre
                </label>
            </div>
        </fieldset>

        <!-- 9. CASES À COCHER -->
        <fieldset class="form-group">
            <legend>Langages de programmation préférés</legend>
            <div class="checkbox-group">
                <label>
                    <input type="checkbox" name="langages[]" value="html" checked>
                    HTML
                </label>
                <label>
                    <input type="checkbox" name="langages[]" value="css" checked>
                    CSS
                </label>
                <label>
                    <input type="checkbox" name="langages[]" value="javascript">
                    JavaScript
                </label>
                <label>
                    <input type="checkbox" name="langages[]" value="php">
                    PHP
                </label>
                <label>
                    <input type="checkbox" name="langages[]" value="python">
                    Python
                </label>
            </div>
        </fieldset>

        <!-- 10. UPLOAD DE FICHIERS -->
        <div class="form-group">
            <label for="photo">Photo de profil <span class="required">*</span></label>
            <input type="file" id="photo" name="photo" accept="image/*" required>
            <small>Images seulement (JPG, PNG, GIF)</small>
        </div>

        <div class="form-group">
            <label for="documents">Documents complémentaires</label>
            <input type="file" id="documents" name="documents[]" accept=".pdf,.doc,.docx" multiple>
            <small>PDF ou Word (sélection multiple possible)</small>
        </div>

        <!-- CONDITIONS OBLIGATOIRES -->
        <div class="form-group">
            <div class="checkbox-group">
                <label>
                    <input type="checkbox" name="conditions" value="accepte" required>
                    J'accepte les <a href="conditions.html" target="_blank">conditions d'utilisation</a> <span class="required">*</span>
                </label>
                <label>
                    <input type="checkbox" name="newsletter" value="oui">
                    Je souhaite recevoir la newsletter
                </label>
            </div>
        </div>

        <!-- BOUTONS -->
        <div class="form-group">
            <button type="submit">S'inscrire</button>
            <button type="reset" style="background: #6c757d; margin-left: 10px;">Réinitialiser</button>
        </div>

    </form>

    <script>
        // Messages de validation personnalisés
        const email = document.getElementById('email');
        const password = document.getElementById('password');

        email.addEventListener('invalid', function() {
            if (this.validity.valueMissing) {
                this.setCustomValidity('Veuillez renseigner votre email');
            } else if (this.validity.typeMismatch) {
                this.setCustomValidity('Format email invalide');
            } else {
                this.setCustomValidity('');
            }
        });

        email.addEventListener('input', function() {
            this.setCustomValidity('');
        });

        password.addEventListener('invalid', function() {
            if (this.validity.valueMissing) {
                this.setCustomValidity('Mot de passe requis');
            } else if (this.validity.patternMismatch) {
                this.setCustomValidity('Le mot de passe doit contenir au moins 8 caractères avec majuscule, minuscule et chiffre');
            } else {
                this.setCustomValidity('');
            }
        });

        password.addEventListener('input', function() {
            this.setCustomValidity('');
        });
    </script>
</body>
</html>

Instructions

  • 1. Créez le fichier HTML : Copiez le code ci-dessus dans un fichier formulaire-complet.html
  • 2. Ouvrez dans votre navigateur : Double-cliquez sur le fichier ou faites glisser dans votre navigateur
  • 3. Testez tous les champs : Remplissez le formulaire et observez la validation en temps réel
  • 4. Experimentez : Modifiez les attributs, patterns et styles pour comprendre leur impact

Fonctionnalités incluses

Tous les 10 types de champs Text, email, password, number, date, select, textarea, radio, checkbox, file

Validation HTML5 complète Required, pattern, min/max, maxlength, accept

Messages d'erreur personnalisés JavaScript pour améliorer l'expérience utilisateur

Style CSS intégré Validation visuelle, responsive, professionnel

Accessibilité Labels, fieldset, legend, attributs ARIA

Prêt pour la production Structure professionnelle, sécurisé, maintenable

Maîtrisez les Formulaires HTML ! 📝

Vous avez maintenant tous les outils pour créer des formulaires professionnels et sécurisés. Passez à l'étape suivante : la sécurisation côté serveur.

🎯 Prochaines étapes recommandées :

1. Créer le formulaire complet • 2. Apprendre PHP pour traitement • 3. Sécuriser avec validation serveur • 4. Améliorer avec JavaScript

Maîtrisez les formulaires HTML

Vous avez maintenant tous les outils pour créer des formulaires HTML professionnels, accessibles et sécurisés.