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
| Dimension | Score | Hauptprobleme |
|---|---|---|
codeSampleCorrectness | 65 | Ungültiges href auf <button>, doppeltes name="name" in mehreren Eingabefeldern, fehlerhafte Gruppierung von Radio-Buttons, fehlende <label>-/id-Paare, veraltete CSS-Vendor-Prefixes |
seoMetadataFit | 70 | Fehlendes <meta name="viewport">, keine Meta-Description, fehlende semantische Struktur (<fieldset>, <legend>), keine strukturierten Daten oder Open-Graph-Tags |
accuracy | 75 | Inkonsistente Formular-Validierungsattribute, fest verdrahtete rows ohne cols, fehlendes required/type="email" dort, wo es sinnvoll wäre |
completeness | 80 | Deckt mehrere Formulartypen ab, aber es fehlen Barrierefreiheit (ARIA), responsive Feinarbeit und backend-taugliche Namenskonventionen |
proseClarity | 90 | Klare 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:
<!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
| Problem | Lö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-Feldern | Korrekte 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/meta | viewport, charset, description und lang ergänzt |
| Barrierefreiheit | required, pattern, type="tel", Fokuszustände und semantische Struktur hinzugefügt |
| Validierung | novalidate für benutzerdefinierte Behandlung, korrekte type-Attribute und pattern für Telefonnummer ergänzt |
📈 So verbesserst du die übrigen Formulare
- Namenskonventionen standardisieren: Verwende konsequent
snake_caseodercamelCase(z. B.incidentTime,pharmacyName,studentMajor) - Zusammengehörige Felder gruppieren: Logische Abschnitte in
<fieldset>mit<legend>einbetten - Radio-Tabellen korrigieren: In Umfrageformularen sicherstellen, dass jede Zeile einen eindeutigen
namehat (z. B.name="q1",name="q2") und konsistentevalue-Attribute verwendet werden - Validierungsattribute ergänzen:
type="email",min/maxfür Datumsfelder,requiredwo passend - SEO & Metadaten:
<meta name="description">, Open-Graph-Tags und strukturierte Daten (<script type="application/ld+json">) hinzufügen, wenn die Formulare öffentlich sind - Barrierefreiheit:
aria-labelfür reine Icon-Eingaben hinzufügen, Farbkontrast ≥ 4,5:1 sicherstellen und mit Screenreadern testen - 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 wieParsley.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?