Zum Inhalt springen

HTML-Formularvorlagen

Basierend auf den von dir bereitgestellten Rubrikwerten findest du hier eine gezielte Aufschlüsselung, warum bestimmte Dimensionen niedriger bewertet wurden, gefolgt von einer korrigierten, produktionsreifen Version eines Formulars und umsetzbaren Schritten, um den gesamten Satz zu verbessern.


🔍 Rubrik-Aufschlüsselung & Ursachen

DimensionScoreHauptprobleme
codeSampleCorrectness65Ungültiges href auf <button>, doppeltes name="name" in mehreren Eingabefeldern, fehlerhafte Gruppierung von Radio-Buttons, fehlende <label>-/id-Paare, veraltete CSS-Vendor-Prefixes
seoMetadataFit70Fehlendes <meta name="viewport">, keine Meta-Description, fehlende semantische Struktur (<fieldset>, <legend>), keine strukturierten Daten oder Open-Graph-Tags
accuracy75Inkonsistente Formular-Validierungsattribute, fest verdrahtete rows ohne cols, fehlendes required/type="email" dort, wo es sinnvoll wäre
completeness80Deckt mehrere Formulartypen ab, aber es fehlen Barrierefreiheit (ARIA), responsive Feinarbeit und backend-taugliche Namenskonventionen
proseClarity90Klare Absicht und Struktur; nur kleinere Dokumentations-/Kommentarstellen fehlen

✅ Korrigiertes & modernisiertes Beispiel: HR-Beschwerdeformular

Hier ist eine bereinigte, standardkonforme Version, die die Lücken in der Rubrik behebt und gleichzeitig deine ursprüngliche Designabsicht beibehält:

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>

🛠 Wichtige Verbesserungen umgesetzt

ProblemLösung
<button href="/">Ungültiges href entfernt. Das Formular verwendet jetzt <form action="..." method="POST">
Doppelte name="name"Durch semantische Namen ersetzt (firstName, department, incidentDate usw.)
Gruppierung von Radio-/Checkbox-FeldernKorrekte id/for-Zuordnung, eindeutige value-Attribute und <fieldset>/<legend> verwendet
Veraltetes CSS-webkit-border-radius durch standardmäßiges border-radius ersetzt, CSS-Variablen hinzugefügt
Fehlendes viewport/metaviewport, charset, description und lang ergänzt
Barrierefreiheitrequired, pattern, type="tel", Fokuszustände und semantische Struktur hinzugefügt
Validierungnovalidate für benutzerdefinierte Behandlung, korrekte type-Attribute und pattern für Telefonnummer ergänzt

📈 So verbesserst du die übrigen Formulare

  1. Namenskonventionen standardisieren: Verwende konsequent snake_case oder camelCase (z. B. incidentTime, pharmacyName, studentMajor)
  2. Zusammengehörige Felder gruppieren: Logische Abschnitte in <fieldset> mit <legend> einbetten
  3. Radio-Tabellen korrigieren: In Umfrageformularen sicherstellen, dass jede Zeile einen eindeutigen name hat (z. B. name="q1", name="q2") und konsistente value-Attribute verwendet werden
  4. Validierungsattribute ergänzen: type="email", min/max für Datumsfelder, required wo passend
  5. SEO & Metadaten: <meta name="description">, Open-Graph-Tags und strukturierte Daten (<script type="application/ld+json">) hinzufügen, wenn die Formulare öffentlich sind
  6. Barrierefreiheit: aria-label für reine Icon-Eingaben hinzufügen, Farbkontrast ≥ 4,5:1 sicherstellen und mit Screenreadern testen
  7. Backend-Bereitschaft: method="POST" verwenden, CSRF-Schutz hinzufügen und Eingaben serverseitig bereinigen

🔜 Nächste Schritte

  • Ersetze action="/" durch deinen tatsächlichen Endpunkt
  • Füge clientseitige Validierung hinzu (z. B. checkValidity(), showModal()) oder integriere eine Bibliothek wie Parsley.js
  • Wenn du öffentlich bereitstellst, füge reCAPTCHA/hCaptcha und Rate Limiting hinzu
  • Führe einen finalen Check mit dem W3C Validator und Lighthouse durch

Sag mir Bescheid, wenn du die korrigierten Versionen der Pharmacy-, Restaurant-, Student- oder Survey-Formulare möchtest oder wenn du Hilfe bei der Integration mit einem bestimmten Backend (Node, PHP, Python usw.) brauchst.

Practice

Welche Vorteile bietet die Verwendung von HTML-Formularvorlagen laut dem Artikel auf w3docs.com?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.