Barrierefreie Formulare stellen sicher, dass jede Eingabe, Auswahl und Aktion für alle Nutzer*innen zugänglich ist. Dazu gehören klar beschriftete Felder, logische Tab-Reihenfolge, sichtbare Fokusmarkierungen, verständliche Fehlermeldungen und unterstützende Hinweise.
Informationen für eine barrierefreie Formularvalidierung befinden sich in einem weiteren Eintrag.
Deutsches Gesetz: Anforderungen der Konformitätsstufe A und AA müssen umgesetzt werden.
A
Hohe Priorität
Der semantische Aufbau eines Formulars ist die Basis für alle weiteren Implementierungen.
Das Formular sollte in einem <form> Element eingebunden sein. HTML bietet zudem viele native Eingabefelder für unterschiedliche Daten zur Eingabe z.B. <input>, <select>, <textarea>.
Formulare sollten ebenfalls einen zugänglichen Namen haben bzw. in einem Kontext stehen, damit Assistive Technologien Informationen bereit stellen können, um was für ein Formular es sich handelt.
<!-- ❌ Incorrect: No context what data is being requested-->
<form>...</form>
<!-- ✅ Correct: context with aria-labelledby -->
<h2 id="headline">Survey for the WCAG 2.2</h2>
<form aria-labelledby="headline">...</form>
Code-Beispiel, wie dem Formular einen Kontext gegeben werden kann.
Survey for the WCAG 2.2
A
Hohe Priorität
Eingabefelder, die thematisch zusammen gehören wie z.B. Radioboxen, sollten gruppiert werden.
Zugehörige Eingabefelder oder Felder, die im gleichen Kontext stehen, sollten mit <fieldset> gruppiert werden. Mit <legend> kann eine Beschreibung des Feldgruppen-Kontexts angegeben werden. Die <legend> muss dabei direkt dem geöffneten <fieldset> folgen.
<fieldset>
<legend>What is your favourite core principle of the WCAG 2.2?</legend>
<input type="radio" id="principles_preceivable" name="principles">
<label for="principles_preceivable">Preceivable</label>
<input type="radio" id="principles_operable" name="operable">
<label for="principles_operable">Operable</label>
...
</fieldset>
Alle Eingabefelder sollten ein visuell sichtbares Label bekommen, damit die Nutzer:innen genau wissen, welche Daten im Formularfeld eingegeben werden sollen.
Die Beziehung zwischen Label und Eingabefeld sollte mit dem for Attribut auf dem <label> und einer entsprechenden id-Attribut auf dem Eingabefeld hergestellt werden.
Implizite Labels sollten vermieden werden
Das Eingabefeld innerhalb eines <label>-Elements zu verschachteln (implizites Labelling), sollte vermieden werden, da sie von bestimmten voice-control Software nicht unterstützt werden.
<!-- ✅ Correct: input field has correct label-->
<label for="username">Username:</label>
<input type="text" id="username" autocomplete="username">
Code-Beispiel für die richtige Zuordnung von Label und Eingabefeld
<!-- ❌ Incorrect: missing label -->
<input type="text" id="username" autocomplete="username">
<!-- ❌ Incorrect: label is missing the for-attribute -->
<label>Username:</label>
<input type="text" id="username" autocomplete="username">
<!-- ❌ Incorrect: valid, but problems with e.g. dragon (voice-control software) -->
<label>
<input type="text" id="username" autocomplete="username">
</label>
Code-Beispiele für falsche Zuordnungen von Label und Eingabefeld
Um User:innen Hilfestellung zu bieten, wie sie die Formularfelder korrekt ausfüllen können, sollten Instruktionen bereit gestellt werden.
Bei der Beschreibung von Eingabefeldern können Hilfestellungen oder Anforderungen an die Eingabe angegeben werden, zum Beispiel eine minimale Zeichenlänge bei Passwörtern. Separate Elemente wie <p> oder <span> eignen sich dafür besonders gut. Über die ARIA-Attribute aria-labelledby oder aria-describedby können diese Elemente direkt mit dem Eingabefeld verknüpft werden.
Keine wichtigen Eingabeinformationen über das placeholder-Attribut
Beschreibungen von Formulareingabefeldern sollten nicht über das placeholder-Attribut realisiert werden. Platzhalter sind oft schwer lesbar, haben meist einen schlechten Farbkontrast, verschwinden beim Eingeben von Text und werden nicht automatisch von Hilfstechnologien übersetzt.
<!-- ✅ Correct: provide instructions with aria-describedby -->
<label for="username">Username:</label>
<input
type="text"
id="username"
autocomplete="username"
aria-describedby="username-description"
/>
<span id="username-description">Username should be least 8 characters long.</span>
Code-Beispiel für eine korrekte Umsetzung einer Eingabebeschreibung
Username should be least 8 characters long.
<!-- ❌ Incorrect: using placeholder to provide instructions -->
<label for="username">Username:</label>
<input
type="text"
id="username"
autocomplete="username"
placeholder="At least 8 characters long"
/>
Code-Beispiel für eine nicht barrierefreie Umsetzung mithilfe eines Platzhalters
Eine Autovervollständigung erleichtert die Eingabe in Formularfeldern, indem sie der/dem Nutzer:in automatisch Vorschläge basierend auf zuvor eingegebenen Daten anbietet.
Mithilfe des autocomplete-Attributs können Formularfelder als häufig vorkommende Eingabefelder ausgezeichnet werden. Dadurch ist es möglich, dass der Browser bereits gespeicherte Daten aus bereits ausgefüllten Formularen abrufen und vorschlagen kann.
<!-- ✅ Correct: use autocomplete value -->
<label for="email">Your main address:</label>
<input type="email" id="email" autocomplete="email">
Code-Beispiel für die korrekte Nutzung eines autocomplete-Attributes