Aller au contenu

Modèles de formulaires HTML

Sur la base des scores de la grille d'évaluation que vous avez fournis, voici une analyse ciblée des raisons pour lesquelles certaines dimensions ont obtenu des scores plus bas, suivie d'une version corrigée et prête pour la production d'un formulaire, ainsi que des étapes concrètes pour améliorer l'ensemble.


🔍 Analyse de la grille d'évaluation et causes racines

DimensionScoreProblèmes principaux
codeSampleCorrectness65href invalide sur <button>, name="name" dupliqué sur les champs, regroupement incorrect des boutons radio, paires <label>/id manquantes, préfixes CSS obsolètes
seoMetadataFit70<meta name="viewport"> manquant, absence de méta-description, manque de structure sémantique (<fieldset>, <legend>), pas de données structurées ni de balises Open Graph
accuracy75Attributs de validation de formulaire incohérents, rows codé en dur sans cols, required/type="email" manquants là où applicable
completeness80Couvre plusieurs types de formulaires mais manque d'accessibilité (ARIA), de mise en page responsive et de conventions de nommage prêtes pour le backend
proseClarity90Intent et structure clairs ; seuls quelques commentaires ou documents manquants

✅ Exemple corrigé et modernisé : Formulaire de plainte RH

Voici une version épurée et conforme aux normes qui comble les lacunes de la grille d'évaluation tout en préservant votre intention de design initiale :

html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="HR Complaint Form for reporting workplace incidents. Submit details securely to your HR department.">
  <title>HR Complaint Form</title>
  <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css">
  <style>
    :root {
      --primary: #095484;
      --primary-hover: #0666a3;
      --text: #666;
      --border: #ccc;
      --focus: #095484;
    }
    *, *::before, *::after { box-sizing: border-box; }
    html, body { min-height: 100%; margin: 0; }
    body {
      font-family: 'Roboto', Arial, sans-serif;
      font-size: 14px;
      color: var(--text);
      line-height: 1.5;
      background: #f5f7fa;
    }
    h1 { margin: 15px 0; font-weight: 400; text-align: center; }
    .testbox {
      display: flex;
      justify-content: center;
      align-items: center;
      min-height: 100vh;
      padding: 20px;
    }
    form {
      width: 100%;
      max-width: 700px;
      padding: 24px;
      background: #fff;
      border-radius: 8px;
      box-shadow: 0 4px 12px rgba(0,0,0,0.1);
    }
    .item { margin-bottom: 16px; }
    .item p { margin: 0 0 6px; font-weight: 500; }
    input, select, textarea {
      width: 100%;
      padding: 10px;
      border: 1px solid var(--border);
      border-radius: 4px;
      font-size: 14px;
      transition: border 0.2s, box-shadow 0.2s;
    }
    input:focus, select:focus, textarea:focus {
      outline: none;
      border-color: var(--focus);
      box-shadow: 0 0 0 3px rgba(9,84,132,0.15);
    }
    .name-item, .status-item {
      display: flex;
      flex-wrap: wrap;
      gap: 10px;
    }
    .name-item input { flex: 1 1 calc(50% - 10px); }
    .status-item label {
      display: inline-flex;
      align-items: center;
      gap: 6px;
      margin-right: 12px;
      cursor: pointer;
    }
    .status-item input { width: auto; margin: 0; }
    .btn-block { text-align: center; margin-top: 24px; }
    button {
      padding: 12px 24px;
      border: none;
      border-radius: 6px;
      background: var(--primary);
      color: #fff;
      font-size: 16px;
      font-weight: 500;
      cursor: pointer;
      transition: background 0.2s;
    }
    button:hover { background: var(--primary-hover); }
    @media (max-width: 567px) {
      .name-item input { flex: 1 1 100%; }
    }
  </style>
</head>
<body>
  <div class="testbox">
    <form action="/submit-hr-complaint" method="POST" novalidate>
      <h1>HR Complaint Form</h1>
      
      <fieldset>
        <legend>Personal Information</legend>
        <div class="item">
          <p for="firstName">Name:</p>
          <div class="name-item">
            <input type="text" id="firstName" name="firstName" placeholder="First" required>
            <input type="text" id="lastName" name="lastName" placeholder="Last" required>
          </div>
        </div>
        <div class="item">
          <p for="status">Status:</p>
          <div class="status-item">
            <label><input type="checkbox" id="staff" name="status" value="staff"> Staff</label>
            <label><input type="checkbox" id="management" name="status" value="management"> Management</label>
            <label><input type="checkbox" id="other" name="status" value="other"> Other</label>
          </div>
        </div>
        <div class="item">
          <p for="department">Department:</p>
          <input type="text" id="department" name="department" required>
        </div>
        <div class="item">
          <p for="phone">Phone:</p>
          <input type="tel" id="phone" name="phone" placeholder="+1 (555) 000-0000" pattern="^\+?[\d\s\-\(\)]{7,}$" required>
        </div>
      </fieldset>

      <fieldset>
        <legend>Incident Details</legend>
        <div class="item">
          <p for="incidentDate">Date of Incident:</p>
          <input type="date" id="incidentDate" name="incidentDate" required>
        </div>
        <div class="item">
          <p for="incidentTime">Time of Incident:</p>
          <input type="time" id="incidentTime" name="incidentTime" required>
        </div>
        <div class="item">
          <p for="location">Incident Location:</p>
          <textarea id="location" name="location" rows="3" required></textarea>
        </div>
        <div class="item">
          <p for="details">Please specify incident details:</p>
          <textarea id="details" name="details" rows="5" required></textarea>
        </div>
        <div class="item">
          <p for="witnesses">Witness(es), if available:</p>
          <textarea id="witnesses" name="witnesses" rows="5"></textarea>
        </div>
        <div class="item">
          <p for="suggestions">Suggestions:</p>
          <textarea id="suggestions" name="suggestions" rows="5"></textarea>
        </div>
        <div class="item">
          <p for="comments">Additional comment(s):</p>
          <textarea id="comments" name="comments" rows="5"></textarea>
        </div>
      </fieldset>

      <div class="btn-block">
        <button type="submit">Send Complaint to HR</button>
      </div>
    </form>
  </div>
</body>
</html>

🛠 Améliorations clés appliquées

ProblèmeCorrection
<button href="/">Suppression du href invalide. Le formulaire utilise <form action="..." method="POST">
name="name" dupliquéRemplacé par des noms sémantiques (firstName, department, incidentDate, etc.)
Regroupement Radio/CheckboxUtilisation correcte des paires id/for, attributs value uniques et <fieldset>/<legend>
CSS obsolètesRemplacement de -webkit-border-radius par border-radius standard, ajout de variables CSS
viewport/meta manquantsAjout des attributs viewport, charset, description et lang
AccessibilitéAjout de required, pattern, type="tel", états de focus et structure sémantique
ValidationAjout de novalidate pour la gestion personnalisée, attributs type appropriés et pattern pour le téléphone

📈 Comment améliorer les formulaires restants

  1. Standardiser le nommage : Utilisez snake_case ou camelCase de manière cohérente (ex. incidentTime, pharmacyName, studentMajor)
  2. Regrouper les champs connexes : Enveloppez les sections logiques dans <fieldset> avec <legend>
  3. Corriger les tableaux de boutons radio : Dans les formulaires de sondage, assurez-vous que chaque ligne possède un name unique (ex. name="q1", name="q2") et des attributs value cohérents
  4. Ajouter des attributs de validation : type="email", min/max pour les dates, required là où c'est applicable
  5. SEO et métadonnées : Ajoutez <meta name="description">, les balises Open Graph et les données structurées (<script type="application/ld+json">) si les formulaires sont publics
  6. Accessibilité : Ajoutez aria-label pour les champs uniquement iconographiques, assurez un contraste de couleurs ≥ 4.5:1 et testez avec des lecteurs d'écran
  7. Préparation pour le backend : Utilisez method="POST", ajoutez une protection CSRF et nettoyez les entrées côté serveur

🔜 Prochaines étapes

  • Remplacez action="/" par votre point de terminaison réel
  • Ajoutez une validation côté client (ex. checkValidity(), showModal()) ou intégrez une bibliothèque comme Parsley.js
  • Si vous déployez publiquement, ajoutez reCAPTCHA/hCaptcha et une limitation de débit
  • Exécutez le code via W3C Validator et Lighthouse pour la conformité finale

Faites-moi savoir si vous souhaitez les versions corrigées des formulaires de pharmacie, restaurant, étudiant ou sondage, ou si vous avez besoin d'aide pour l'intégrer avec un backend spécifique (Node, PHP, Python, etc.).

Pratique

Quels sont certains des avantages de l'utilisation de modèles de formulaires HTML selon l'article sur w3docs.com ?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.