Aller au contenu principal

📚 Les formulaires

🔗 Documentation officielle formulaires


Bootstrap offre des classes pour styliser les formulaires HTML et les rendre plus attrayants et cohérents avec le reste de votre interface.

Principe de base

Les formulaires HTML standards sont fonctionnels mais un peu tristounets. Bootstrap ajoute des classes pour:

  • Améliorer l'apparence visuelle
  • Uniformiser le style entre navigateurs
  • Ajouter de la validation visuelle
  • Organiser les champs de manière claire

Structure de base d'un formulaire

Formulaire simple sans Bootstrap

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <title>Formulaire sans Bootstrap</title>
</head>
<body>
  <form>
      <label for="nom">Nom:</label>
      <input type="text" id="nom">
      
      <label for="email">Courriel:</label>
      <input type="email" id="email">
      
      <button type="submit">Envoyer</button>
  </form>
</body>
</html>

Même formulaire avec Bootstrap

<!DOCTYPE html>
<html lang="fr">
<head>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container mt-4">
      <form>
          <div class="mb-3">
              <label for="nom" class="form-label">Nom</label>
              <input type="text" class="form-control" id="nom">
          </div>
          
          <div class="mb-3">
              <label for="email" class="form-label">Courriel</label>
              <input type="email" class="form-control" id="email">
          </div>
          
          <button type="submit" class="btn btn-primary">Envoyer</button>
      </form>
  </div>
</body>
</html>

Observez les différences :

  • Chaque champ est dans un <div class="mb-3"> pour l'espacement
  • Les labels ont la classe form-label
  • Les inputs ont la classe form-control
  • Le bouton utilise les classes Bootstrap btn btn-primary

Classes principales pour les formulaires

ClasseUtilisation
form-labelLabel d'un champ
form-controlInput text, email, password, textarea, select
form-checkConteneur pour checkbox/radio
form-check-inputInput checkbox/radio
form-check-labelLabel pour checkbox/radio
mb-*Marge en bas pour espacer les champs

Champ de formulaire

Un champ de formulaire a plus ou moins toujours la même structure, soit un label avec la classe form-label et un input avec la classe form-control.

<div class="mb-3">
<label for="id-unique" class="form-label">Texte du label</label>
<input type="text" class="form-control" id="id-unique">
</div>
Important
  • L'attribut for du label doit correspondre à l'id de l'input
  • La classe mb-3 crée l'espacement entre les champs
  • La classe form-control stylise l'input

Types de champs

Champs textuels

<!DOCTYPE html>
<html lang="fr">
<head>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container mt-4">
      <form>
          <div class="mb-3">
              <label for="texte" class="form-label">Texte simple</label>
              <input type="text" class="form-control" id="texte" placeholder="Entrez du texte">
          </div>
          
          <div class="mb-3">
              <label for="email" class="form-label">Email</label>
              <input type="email" class="form-control" id="email" placeholder="nom@exemple.com">
          </div>
          
          <div class="mb-3">
              <label for="password" class="form-label">Mot de passe</label>
              <input type="password" class="form-control" id="password">
          </div>
          
          <div class="mb-3">
              <label for="textarea" class="form-label">Zone de texte</label>
              <textarea class="form-control" id="textarea" rows="3"></textarea>
          </div>
      </form>
  </div>
</body>
</html>

Tous utilisent la classe form-control: text, email, password, textarea, select, etc.

Checkboxes et radios

Les checkboxes et radios ont une structure différente, ils doivent être dans un conteneur avec la classe form-check:

<!DOCTYPE html>
<html lang="fr">
<head>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container mt-4">
      <form>
          <!-- Checkbox -->
          <div class="mb-3">
              <div class="form-check">
                  <input class="form-check-input" type="checkbox" id="check1">
                  <label class="form-check-label" for="check1">
                      Accepter les conditions
                  </label>
              </div>
              <div class="form-check">
                  <input class="form-check-input" type="checkbox" id="check2">
                  <label class="form-check-label" for="check2">
                      Recevoir les notifications
                  </label>
              </div>
          </div>
          
          <!-- Radio buttons -->
          <div class="mb-3">
              <div class="form-check">
                  <input class="form-check-input" type="radio" name="niveau" id="debutant">
                  <label class="form-check-label" for="debutant">
                      Débutant
                  </label>
              </div>
              <div class="form-check">
                  <input class="form-check-input" type="radio" name="niveau" id="intermediaire">
                  <label class="form-check-label" for="intermediaire">
                      Intermédiaire
                  </label>
              </div>
              <div class="form-check">
                  <input class="form-check-input" type="radio" name="niveau" id="avance">
                  <label class="form-check-label" for="avance">
                      Avancé
                  </label>
              </div>
          </div>
      </form>
  </div>
</body>
</html>

Structure checkbox/radio :

<div class="form-check">
<input class="form-check-input" type="checkbox" id="...">
<label class="form-check-label" for="...">Texte</label>
</div>

Select (liste déroulante)

<!DOCTYPE html>
<html lang="fr">
<head>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container mt-4">
      <form>
          <div class="mb-3">
              <label for="pays" class="form-label">Pays</label>
              <select class="form-select" id="pays">
                  <option selected>Choisissez...</option>
                  <option value="ca">Canada</option>
                  <option value="fr">France</option>
                  <option value="us">États-Unis</option>
              </select>
          </div>
      </form>
  </div>
</body>
</html>

Attention

Les <select> utilisent la classe form-select et non form-control.

Validation visuelle

Bootstrap offre des classes pour afficher visuellement si un champ est valide ou invalide :

<!DOCTYPE html>
<html lang="fr">
<head>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container mt-4">
      <form>
          <!-- Champ valide -->
          <div class="mb-3">
              <label for="nom" class="form-label">Nom</label>
              <input type="text" class="form-control is-valid" id="nom" value="Jean Dupont">
              <div class="valid-feedback">
                  Parfait !
              </div>
          </div>
          
          <!-- Champ invalide -->
          <div class="mb-3">
              <label for="email" class="form-label">Email</label>
              <input type="email" class="form-control is-invalid" id="email" value="email-invalide">
              <div class="invalid-feedback">
                  Veuillez entrer une adresse email valide.
              </div>
          </div>
          
          <!-- Champ normal -->
          <div class="mb-3">
              <label for="tel" class="form-label">Téléphone</label>
              <input type="tel" class="form-control" id="tel">
              <div class="form-text">
                  Format : 123-456-7890
              </div>
          </div>
      </form>
  </div>
</body>
</html>

Classes de validation :

  • is-valid: champ valide (bordure verte)
  • is-invalid: champ invalide (bordure rouge)
  • valid-feedback: message de succès
  • invalid-feedback: message d'erreur
  • form-text: texte d'aide neutre

Tailles des champs

Vous pouvez modifier la taille des champs avec les modificateurs form-control-lg et form-control-sm:

<!DOCTYPE html>
<html lang="fr">
<head>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container mt-4">
      <form>
          <input type="text" class="form-control form-control-lg mb-3" placeholder="Grand">
          <input type="text" class="form-control mb-3" placeholder="Normal">
          <input type="text" class="form-control form-control-sm" placeholder="Petit">
      </form>
  </div>
</body>
</html>

Classes de taille :

  • form-control-lg: grand
  • (aucune classe): normal
  • form-control-sm: petit

Champs désactivés et lecture seule

<!DOCTYPE html>
<html lang="fr">
<head>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container mt-4">
      <form>
          <div class="mb-3">
              <label for="normal" class="form-label">Champ normal</label>
              <input type="text" class="form-control" id="normal" value="Vous pouvez modifier">
          </div>
          
          <div class="mb-3">
              <label for="readonly" class="form-label">Lecture seule</label>
              <input type="text" class="form-control" id="readonly" value="Vous ne pouvez pas modifier" readonly>
          </div>
          
          <div class="mb-3">
              <label for="disabled" class="form-label">Désactivé</label>
              <input type="text" class="form-control" id="disabled" value="Champ désactivé" disabled>
          </div>
      </form>
  </div>
</body>
</html>

Attributs HTML :

  • readonly: lecture seule (valeur envoyée dans le formulaire)
  • disabled: désactivé (valeur NON envoyée dans le formulaire)

Bonnes pratiques

Toujours associer label et input

<!-- ✅ for et id correspondent -->
<label for="email" class="form-label">Email</label>
<input type="text" class="form-control" id="email">

<!-- ❌ pas d'association -->
<label class="form-label">Email</label>
<input type="text" class="form-control">

Utiliser les bons types d'input

<!-- ✅ types appropriés -->
<input type="email" class="form-control">
<input type="password" class="form-control">
<input type="number" class="form-control">
<input type="date" class="form-control">

<!-- ❌ tout en type text -->
<input type="text" class="form-control" placeholder="Email">

Ajouter des placeholders et textes d'aide

<div class="mb-3">
<label for="tel" class="form-label">Téléphone</label>
<input type="tel" class="form-control" id="tel" placeholder="123-456-7890">
<div class="form-text">Format canadien avec tirets</div>
</div>

Espacer les champs avec mb-*

<!-- ✅ Bon : espacement entre champs -->
<div class="mb-3">
<label>...</label>
<input>
</div>
<div class="mb-3">
<label>...</label>
<input>
</div>

Ressources

Documentation officielle des formulaires :
https://getbootstrap.com/docs/5.3/forms/overview/