Formulare für Profis
Das lernst du in dieser Lektion
- Du nutzt die eingebaute HTML-Validierung von required bis pattern – ganz ohne JavaScript.
- Du setzt datalist, fieldset/legend und output korrekt und begründet ein.
- Du optimierst Formulare für mobile Tastaturen und Autofill mit autocomplete, inputmode und enterkeyhint.
- Du kommunizierst Fehler so, dass auch Screenreader-Nutzer sie sicher verstehen.
Formulare sind die Stelle, an der aus Besuchern Kunden werden – oder eben nicht. Jede Anmeldung, jede Bestellung, jede Kontaktaufnahme läuft durch ein Formular, und jedes unnötige Feld, jede kryptische Fehlermeldung kostet messbar Absprünge. Die Grundlagen sitzen bei dir längst; in dieser Lektion holst du heraus, was HTML von Haus aus kann: Validierung ohne eine Zeile JavaScript, passende Tastaturen auf dem Smartphone und Fehlermeldungen, die niemanden ausschließen.
Der Browser validiert mit
Bevor du für die Formularprüfung eine JavaScript-Bibliothek einbindest: Der Browser bringt eine komplette Validierung mit. Sie springt beim Absenden an, blockiert das Formular bei Fehlern, zeigt eine Meldung in der Sprache des Nutzers an und setzt den Fokus in das erste fehlerhafte Feld – Komfort und Barrierefreiheit inklusive, ganz ohne Code. Gesteuert wird sie über Attribute:
| Attribut | Prüft | Beispiel |
|---|---|---|
required | Feld darf nicht leer bleiben | <input required> |
minlength / maxlength | Mindest- und Maximallänge von Text | minlength="8" beim Passwort |
min / max / step | Wertebereich und Schrittweite bei Zahlen und Datumsangaben | min="1" max="8" bei der Gästezahl |
type="email" / type="url" | Grundformat der Eingabe | <input type="email"> |
pattern | Eigenes Muster (regulärer Ausdruck) | pattern="[0-9]{5}" für die PLZ |
Probiere die eingebaute Validierung direkt aus: Klicke in der Vorschau auf „Reservieren“, ohne etwas auszufüllen – der Browser meldet sich in deiner Systemsprache, ganz ohne JavaScript. Fülle die Felder dann Schritt für Schritt aus und beobachte, wie sich die Meldungen ändern (die Gästezahl steht absichtlich auf einem ungültigen Wert).
pattern: Maßarbeit mit regulären Ausdrücken
Wenn die eingebauten Typen nicht reichen, übernimmt pattern: Das Attribut enthält einen regulären Ausdruck – eine Mustersprache, die dir spätestens beim Programmieren wiederbegegnen wird –, und die Eingabe muss ihm vollständig entsprechen. Für eine deutsche Postleitzahl heißt das Muster [0-9]{5}: „genau fünf Zeichen aus dem Bereich 0 bis 9“.
Zwei Begleiter machen pattern erst rund. Erstens das title-Attribut: Sein Text wird in die Fehlermeldung des Browsers übernommen – ohne ihn erfährt der Nutzer nur, dass das Format nicht stimmt, aber nicht, was erwartet wird. Formuliere dort also immer die Anforderung in Menschensprache. Zweitens die Ausnahme: Mit novalidate am <form>-Element schaltest du die gesamte Browser-Validierung ab – sinnvoll, wenn du eine eigene Fehlerdarstellung per JavaScript baust oder deine Server-Validierung testen willst.
<label for="plz">Postleitzahl</label>
<input id="plz" name="plz" required
pattern="[0-9]{5}"
title="Bitte genau fünf Ziffern eingeben, z. B. 63811"
inputmode="numeric" autocomplete="postal-code">Die beiden letzten Attribute im Beispiel – inputmode und autocomplete – sind kein Zufall: Sie sind der Stoff der übernächsten Station dieser Lektion.
datalist: Vorschläge statt Zwang
Ein <select> zwingt zur Wahl aus einer festen Liste. Oft willst du aber beides: Vorschläge und Freiheit. Genau dafür gibt es <datalist> – eine Vorschlagsliste, die sich über das list-Attribut mit einem normalen Eingabefeld verbindet. Beim Tippen bekommt der Nutzer passende Vorschläge angeboten, darf aber jederzeit etwas ganz anderes eintragen.
Die Abgrenzung als Faustregel: select, wenn nur definierte Werte gültig sind (Zahlungsart, Land); datalist, wenn du häufige Eingaben beschleunigen, aber keine Möglichkeit ausschließen willst (Stadt, Beruf, Lieblingsbrotsorte).
<label for="stadt">Deine Stadt</label>
<input id="stadt" name="stadt" list="staedte">
<datalist id="staedte">
<option value="Aschaffenburg">
<option value="Stockstadt am Main">
<option value="Mainaschaff">
</datalist>fieldset und legend: Gruppen mit Stimme
Gehören mehrere Felder inhaltlich zusammen – Lieferadresse, Rechnungsadresse, Zahlungsart –, fasst du sie mit <fieldset> zusammen und gibst der Gruppe mit <legend> einen Namen. Der Browser rendert einen Rahmen (den CSS jederzeit umgestalten kann); entscheidend ist aber, was im Hintergrund passiert: Screenreader sagen die legend an, wenn Nutzer die Gruppe betreten, und stellen so den Zusammenhang her.
Bei Radio-Gruppen ist das Duo Pflicht, nicht Kür. Denn jeder Radio-Button trägt nur sein eigenes Label – „Ja“, „Nein“, „Vielleicht“. Sehende erfassen die zugehörige Frage über die Optik; wer sich per Screenreader von Feld zu Feld bewegt, hört beim einzelnen Knopf aber nur „Ja, Auswahlknopf“. Worauf sich das Ja bezieht, liefert erst die legend. Praktischer Nebeneffekt: Ein disabled am fieldset deaktiviert alle enthaltenen Felder auf einen Schlag.
<fieldset>
<legend>Wie möchtest du kontaktiert werden?</legend>
<input type="radio" id="k-mail" name="kontakt" value="mail" checked>
<label for="k-mail">Per E-Mail</label>
<input type="radio" id="k-tel" name="kontakt" value="telefon">
<label for="k-tel">Per Telefon</label>
<input type="radio" id="k-keine" name="kontakt" value="keine">
<label for="k-keine">Gar nicht</label>
</fieldset>Mobile Tastaturen und Autofill
Auf dem Smartphone entscheidet die eingeblendete Tastatur über Tempo und Tippfehler. Drei Attribute geben dir die Kontrolle, ohne die Validierung anzufassen:
autocompletesagt dem Browser, was in ein Feld gehört, damit er es automatisch ausfüllen kann. Die wichtigsten Werte:name,email,postal-code,street-address– und der Geheimtippone-time-code: Damit schlägt das Smartphone den gerade per SMS erhaltenen Bestätigungscode direkt über der Tastatur vor.inputmodewählt die Bildschirmtastatur:numericfür Ziffernblöcke,decimalfür Kommazahlen,emailblendet das @-Zeichen ein. Wichtig: Es ändert nur die Tastatur, nicht die Validierung.enterkeyhintbeschriftet die Enter-Taste passend zur Aktion:search,send,nextoderdone– eine kleine Geste mit spürbar besserer Führung.
Und autocomplete="off"? Nur mit sehr gutem Grund. Autofill auszuschalten trifft genau die Menschen am härtesten, die auf Unterstützung angewiesen sind – Nutzer mit motorischen oder kognitiven Einschränkungen. Die Barrierefreiheits-Richtlinien fordern maschinenlesbare Feldzwecke sogar ausdrücklich, und bei Login-Feldern ignorieren Browser das Abschalten ohnehin bewusst. Wer Autofill sabotiert, senkt seine Abschlussrate und schließt Menschen aus – ein doppelt schlechtes Geschäft.
output: Ergebnisse, die mitreden
Das unscheinbare <output>-Element markiert das Ergebnis einer Berechnung im Formular – etwa eine Preissumme, die auf Eingaben reagiert. Es sieht aus wie normaler Text, hat aber zwei eingebaute Vorteile: Über das for-Attribut dokumentiert es, aus welchen Feldern das Ergebnis entsteht, und Screenreader behandeln es als Live-Region – Änderungen werden automatisch angesagt, ohne dass du aria-live setzen musst.
Damit im nächsten Beispiel etwas passiert, steckt im oninput-Attribut des Formulars eine einzige Zeile JavaScript – betrachte sie als kleinen Vorgeschmack auf spätere Kurse. Ziehe am Regler und beobachte, wie die Summe live mitrechnet; die Stadt-Eingabe zeigt dir nebenbei die datalist aus dem vorigen Abschnitt in Aktion.
Fehler kommunizieren, ohne auszuschließen
Spätestens wenn du eigene Fehlermeldungen gestaltest (oder sie vom Server zurückkommen), stellt sich die Frage: Wie erfährt ein Screenreader-Nutzer, was an seinem Feld falsch ist? Die rote Umrandung sieht er nicht. Die Lösung ist ein Dreiklang: Die Fehlermeldung steht als sichtbarer Text beim Feld, das Feld verweist per aria-describedby auf die id dieser Meldung, und aria-invalid="true" markiert den Fehlerzustand. Beim Fokussieren hört der Nutzer dann alles Nötige in einem Zug: „E-Mail-Adresse, ungültige Eingabe, Bitte gib eine vollständige Adresse mit @-Zeichen ein.“
<label for="mail">E-Mail-Adresse</label>
<input id="mail" name="mail" type="email"
aria-invalid="true"
aria-describedby="mail-fehler">
<p id="mail-fehler">
Bitte gib eine vollständige Adresse mit @-Zeichen ein.
</p>Zum Schluss zwei UX-Grundsätze, die mehr bewirken als jedes technische Attribut. Erstens: So wenige Felder wie irgend möglich. Jedes zusätzliche Feld kostet nachweislich Absprünge – frage dich bei jedem einzelnen, ob du die Information jetzt wirklich brauchst. Zweitens: Labels bleiben immer sichtbar. Ein Platzhaltertext ist kein Ersatz für ein <label>: Er verschwindet beim Tippen (spätestens beim Kontrollieren der Eingaben fehlt dann jede Orientierung), sein Kontrast ist meist zu schwach, und assistive Technologien behandeln ihn uneinheitlich. Der Platzhalter darf ergänzen – etwa ein Formatbeispiel zeigen –, niemals ersetzen.
Zusammenfassung
- Der Browser validiert selbst:
required, Längen- und Wertegrenzen,type-Prüfungen undpattern– Meldungen, Fokus und Übersetzung inklusive. - Bei
patternimmer eintitlemit der Anforderung in Klartext mitgeben;novalidateschaltet die Browser-Prüfung gezielt ab. - HTML-Validierung ist Komfort – die verbindliche Prüfung gehört auf den Server.
datalistschlägt vor,selectschreibt vor;fieldset/legendist bei Radio-Gruppen Pflicht, weil erst die legend die Frage liefert.autocomplete,inputmodeundenterkeyhintmachen mobile Formulare schneller – Autofill nie ohne Not sabotieren.- Fehler barrierefrei: sichtbarer Fehlertext, per
aria-describedbyverknüpft, Zustand mitaria-invalid="true"– und generell: wenige Felder, sichtbare Labels.
Damit beherrschst du das anspruchsvollste Eingabe-Werkzeug des Webs. In der nächsten Lektion wird es visuell: „Responsive Bilder, Video & Audio“ zeigt dir, wie du Medien lieferst, die auf jedem Display scharf aussehen – ohne unnötige Megabytes zu verschwenden.
Teste dein Wissen
5 kurze Fragen zu dieser Lektion – die Auswertung passiert direkt im Browser.