Der technische Spickzettel zum Seminar Modern UI und UX Engineering für Webanwendungen — Kriterien, Markup-Formen und Prüfwege zum Nachschlagen, wenn man weiß, dass etwas zu tun ist, aber nicht mehr genau was. Maßgeblich sind die WCAG 2.2 und die ARIA Authoring Practices; hier steht die Auswahl, die im Alltag tatsächlich gebraucht wird. Die Methodenseite — Nutzerforschung, Interface Design, Evaluation — liegt auf dem zweiten Blatt: UX, Interface Design und KI.
WCAG 2.2: Prinzipien, Stufen und neue Kriterien
Die vier Prinzipien sind kein Inhaltsverzeichnis, sondern vier Suchrichtungen für Befunde.
| Prinzip | Fragt | Typischer Befund |
|---|---|---|
| Wahrnehmbar | Kommt die Information an | Zustand nur farblich markiert |
| Bedienbar | Lässt es sich bedienen | Auswahl nur per Ziehen |
| Verständlich | Ist es begreifbar | Fehlercode statt Erklärung |
| Robust | Kommt es bei assistiver Technik an | Eigenbau-Widget ohne Rolle |
„Robust” meint assistive Techniken, nicht Browserkompatibilität.
| Stufe | Bedeutung | Wo sie vorkommt |
|---|---|---|
| A | Ohne dies ist Inhalt unbenutzbar | Als Untermenge jeder Prüfung |
| AA | Zielstandard in Recht und Praxis | Verträge, Ausschreibungen |
| AAA | Einzelne Kriterien, gezielt gewählt | Wo eine Zielgruppe es braucht |
Neu in 2.2 und im Alltag am häufigsten gerissen:
| Kriterium | Verlangt | Bricht typischerweise an |
|---|---|---|
| Fokus nicht verdeckt | Indikator bleibt sichtbar | Klebender Kopfzeile |
| Zielgröße | 24 × 24 Pixel oder Abstand | Icon-Reihen in Tabellenzeilen |
| Zugängliche Anmeldung | Kein Gedächtnistest | Zeichenrätsel, Rechenaufgabe |
| Keine doppelte Eingabe | Bekanntes nicht neu abfragen | Mehrstufigen Strecken |
| Ziehbewegungen | Weg mit einfachem Zeigen | Drag-and-drop-Auswahl |
Modul: Standards und rechtlicher Rahmen
Rechtsrahmen und Nachweise
Drei Ebenen derselben Kette, keine konkurrierenden Anforderungen: technisch laufen alle drei auf die WCAG hinaus.
| Ebene | Verpflichtet | Technisches Ziel |
|---|---|---|
| Web Accessibility Directive | Öffentliche Stellen | WCAG über EN 301 549 |
| European Accessibility Act | Bestimmte private Dienste | Dasselbe, anderer Adressat |
| BFSG und BFSGV | Anbieter in Deutschland | Dasselbe, mit Fristen und Aufsicht |
Die EN 301 549 enthält für Web keine eigenen Kriterien, sie verweist auf die WCAG — Fassungsstand deshalb immer mit Datum der Aussage nennen.
| Artefakt | Muss enthalten | Veraltet, wenn |
|---|---|---|
| Erklärung zur Barrierefreiheit | Stand, Datum, bekanntes Offenes | Niemand sie nach Releases pflegt |
| Rückmeldeweg | Erreichbare Stelle, Frist | Die Adresse ins Leere läuft |
| Prüfbericht | Umfang, Fassung, Datum | Der Prüfumfang nicht genannt ist |
Modul: Standards und rechtlicher Rahmen
Nutzungssituationen und assistive Technik
Permanent, temporär und situativ stellen dieselbe Anforderung — einhändige Bedienung ist Dauerzustand, Gipsarm für Wochen, Kind auf dem Arm für Minuten. Das Modell ist ein Argument für die Anforderung, kein Ersatz für sie.
| Technik | Liest oder nutzt | Scheitert an |
|---|---|---|
| Screenreader | Rolle, Name, Zustand, Wert | Elementen ohne Rolle und Namen |
| Vergrößerung | Layout und Reflow | Fester Breite, Text in Grafiken |
| Sprachsteuerung | Sichtbare Beschriftung | Name weicht von Beschriftung ab |
| Schaltersteuerung | Fokusreihenfolge | Nicht fokussierbaren Bedienelementen |
Der gemeinsame Nenner aller vier ist die Tastatur. Deshalb ist der Tastaturdurchlauf die billigste Prüfung mit der größten Reichweite.
Modul: Menschen, Nutzungssituationen und assistive Technologien
Semantisches HTML: Name, Rolle, Zustand, Wert
Vier Angaben, die eine assistive Technik braucht — und die Stellen, an denen sie üblicherweise fehlen.
| Angabe | Quelle | Fehlt, wenn |
|---|---|---|
| Rolle | Das Element selbst | Ein div verwendet wird |
| Name | Beschriftung, Label, aria-label | Nur ein Icon im Element steht |
| Zustand | aria-expanded, aria-checked | Der Zustand nur in CSS lebt |
| Wert | value, aria-valuenow | Ein Regler nachgebaut wurde |
<!-- kommt als leere Schaltfläche an -->
<div class="icon" onclick="loeschen()"><svg>…</svg></div>
<!-- Rolle und Name sind gesetzt -->
<button type="button" onclick="loeschen()">
<svg aria-hidden="true">…</svg>
<span class="sr-only">Eintrag entfernen</span>
</button>
Link, Button und div sind nicht austauschbar:
| Element | Tastatur | Im Fokus | Kontextmenü |
|---|---|---|---|
a mit href | Eingabetaste | Ja | Neuer Tab möglich |
button | Eingabe und Leertaste | Ja | Kein Ziel |
div mit onclick | Gar nicht | Nein | Kein Ziel |
Was ein Eigenbau übernimmt, das ein natives Element mitbringt: Tastaturmuster, Rolle und Zustand, plattformübliches Touch-Verhalten — und künftige Verbesserungen, die beim nativen Element mit dem Browser kommen und beim Eigenbau nie von allein.
| ARIA-Muster | Warum es falsch ist | Richtig wäre |
|---|---|---|
role="button" auf <button> | Die Rolle ist schon da | Attribut weglassen |
aria-label auf einem div | Ohne Rolle wird nichts gemeldet | Passendes Element wählen |
aria-hidden auf Fokussierbarem | Fokus landet im Nichts | Element auch inert setzen |
aria-labelledby ins Leere | Die Id existiert nicht | Id prüfen oder Text nutzen |
Gleichnamige Landmarks brauchen ein Label — <nav aria-label="Hauptnavigation">
—, wobei das Wort „Navigation” nicht ins Label gehört: Die Rolle wird ohnehin
angesagt. Überschriftenebenen sind eine Aussage über die Struktur, die
Schriftgröße ist eine Klasse.
Modul: Semantisches HTML als Grundlage
Tastatur, Fokus und Sprungziele
/* Indikator nie ersatzlos entfernen */
:focus-visible {
outline: 3px solid #1b4a7a;
outline-offset: 2px;
}
/* hält den Fokus unter einer klebenden Kopfzeile frei */
:target, :focus-visible { scroll-margin-top: 5rem; }
tabindex kennt drei Bedeutungen: positive Werte verschieben die Reihenfolge
global (nicht verwenden), 0 nimmt in den Tablauf auf, -1 macht per Skript
fokussierbar — der Normalfall für Sprungziele. Ohne tabindex="-1" am Ziel
springt bei einem Skip-Link nur die Ansicht, der Fokus bleibt stehen.
| Komponente | Innerhalb | Hinein und heraus |
|---|---|---|
| Tabs | Pfeiltasten links und rechts | Tabulator, ein Stopp |
| Menü | Pfeiltasten hoch und runter | Escape schließt |
| Grid | Pfeiltasten in vier Richtungen | Tabulator verlässt das Grid |
| Combobox | Pfeiltasten in der Liste | Escape schließt, Eingabe wählt |
Drei Fehlerbilder mit demselben Ergebnis — kein Weiterkommen: die Fokusfalle (Overlay, eingebettetes Widget), der unerwartete Kontextwechsel (Auswahl sendet sofort ab) und der verlorene Fokus (Element wird entfernt, ohne den Fokus zu setzen).
<dialog> mit showModal() bringt Fokussetzung, Fokusfang, inerten
Hintergrund und Escape mit; role="dialog" auf einem div bringt nichts
davon.
Modul: Tastatur, Fokus und Navigation
Formulare, Fehler und Statusmeldungen
<label for="gd">Geburtsdatum</label>
<input id="gd" required aria-describedby="gd-hilfe" autocomplete="bday">
<p id="gd-hilfe">Beispiel: 03.09.1974</p>
<!-- Fehler: Zustand melden, Ursache und Korrektur verknüpfen -->
<input id="gd" aria-invalid="true" aria-describedby="gd-fehler">
<p id="gd-fehler" role="alert">Das Datum liegt in der Vergangenheit.</p>
Das Sternchen für Pflichtfelder ist Optik; gemeldet wird die Pflicht über
required. Zusammengehörige Eingaben brauchen fieldset und legend — ohne
Legende wird nur die Option angesagt, nicht die Frage dazu.
| Rolle | Unterbricht | Passt zu |
|---|---|---|
status | Nein, wartet ab | Trefferzahl, Speichern erfolgreich |
alert | Ja, sofort | Ablaufende Frist, Fehler |
| Kein Live-Bereich | Nichts wird gemeldet | Änderungen mit Fokuswechsel |
Die Live Region muss im Dokument stehen, bevor der Text hineinkommt.
autocomplete nimmt nur standardisierte Werte an (given-name,
family-name, email, postal-code …) — eigene Bezeichnungen wirken nicht.
Bei der Anmeldung gilt: Passwort mit Einfügen und Einmallink per Mail sind
zulässig, Zeichenrätsel und Rechenaufgaben nicht.
Modul: Barrierefreie Formulare und Interaktionen
Komponentenmuster
| Tabs | Akkordeon | |
|---|---|---|
| Geöffnet | Genau eines | Beliebig viele |
| Tastatur | Pfeiltasten, ein Tabstopp | Tabulator je Schalter |
| Rollen | tablist, tab, tabpanel | button mit aria-expanded |
| Passt zu | Alternativen Ansichten | Einer langen Seite |
| Eigenschaft | Modaler Dialog | Popover |
|---|---|---|
| Hintergrund | Inert, nicht bedienbar | Weiter bedienbar |
| Fokus | Wird gefangen | Bleibt frei |
| Escape | Schließt | Schließt |
| Passt zu | Entscheidung erzwingen | Zusatzinformation anbieten |
| Muster | Mindestens nötig | Besser |
|---|---|---|
| Tooltip | Tastatur, Escape, verknüpft | Text sichtbar daneben |
| Carousel | Pause, echte Bedienung | Liste statt Karussell |
| Toast | Live Region, lange genug | Meldung bleibt nachlesbar |
Eine Combobox braucht mindestens role="combobox", aria-expanded,
aria-controls auf ein role="listbox" und eine Statuszeile mit der
Trefferzahl. Eine Website-Navigation ist dagegen eine Linkliste in <nav> und
kein role="menu" — wer Menü-Rollen setzt, schuldet Pfeiltasten, Escape und
einen einzigen Tabstopp. Sortierbare Tabellen melden ihren Zustand über
aria-sort an der Kopfzelle plus role="status".
Modul: Zugängliche UI-Komponenten
Kontrast, Zoom, Zielgrößen und Medien
| Element | Mindestwert | Häufig übersehen bei |
|---|---|---|
| Fließtext | 4,5 : 1 | Hinweistexten in Grau |
| Große Schrift | 3 : 1 | Überschriften auf Farbflächen |
| Bedienelement | 3 : 1 | Rahmen von Eingabefeldern |
| Fokusindikator | 3 : 1 | Fokus auf farbigem Grund |
/* Trefferfläche wachsen lassen, Symbol klein halten */
.icon-btn {
min-width: 44px; min-height: 44px;
display: inline-grid; place-items: center;
}
/* im erzwungenen Modus verschwinden Hintergrundfarben, ein Rahmen überlebt */
@media (forced-colors: active) {
.tab[aria-selected="true"] {
border-bottom: 3px solid ButtonText;
forced-color-adjust: none;
}
}
Für Reflow bis 400 Prozent: min-height statt height, max-width in rem,
und keine Regel, die an der Bildschirmausrichtung hängt — fest montierte Geräte
drehen nicht.
| Fall | Behandlung | Fehlerbild |
|---|---|---|
| Dekoratives Icon | aria-hidden setzen | Wird sinnlos vorgelesen |
| Icon trägt Bedeutung | Namen ergänzen | Schaltfläche ohne Namen |
| Diagramm | Text und Datentabelle | Nur eine Grafik ohne Inhalt |
| Medium | Mindestens | Zusätzlich sinnvoll |
|---|---|---|
| Video mit Ton | Untertitel | Transkript zum Nachlesen |
| Reiner Ton | Transkript | Kapitelmarken |
| Bildtragendes Video | Audiodeskription | Textfassung der Inhalte |
| Stummes Video | Textalternative | Beschreibung im Umfeld |
Modul: Visuelle und responsive Accessibility
Prüfen: Reichweite der Verfahren
| Prüfart | Findet zuverlässig | Findet grundsätzlich nicht |
|---|---|---|
| Automatisch | Fehlende Namen, Kontrastwerte | Ob der Name sinnvoll ist |
| Halbautomatisch | Was zu prüfen ist, geführt | Die Entscheidung selbst |
| Manuell | Bedienbarkeit, Verständlichkeit | Nichts — aber es kostet Zeit |
| Ort | Was dort läuft | Wozu |
|---|---|---|
| Browser | Erweiterung, geführte Prüfung | Beim Entwickeln und Reviewen |
| Komponentenwerkstatt | Prüfengine je Eintrag | Fehler vor der Verwendung finden |
| Pipeline | Dieselbe Engine, feste Schwelle | Rückfall verhindern |
| Bericht | Ergebnisse mit Datum | Nachweis gegenüber Dritten |
Vier Fragen für den Screenreader-Rauchtest: Überschriftenliste aufrufen (ist die Struktur klar), Landmarkliste aufrufen (sind Bereiche anspringbar), Elementliste durchgehen (haben Elemente Namen), Filter ändern und hören (werden Änderungen gemeldet). Die geprüfte Kombination — etwa NVDA mit Firefox unter Windows — gehört in jeden Befund.
Zustände, die eine Prüfung erreichen muss: Dialog offen, Fehlerfall (ungültig absenden), leeres Ergebnis (unmöglichen Filter setzen), Ladezustand (Verbindung drosseln).
Ein Befund, der bearbeitet wird, trägt: Seite, Element, Reproduktionsschritte, Erwartet, Tatsächlich, Kriterium, geprüfte Kombination — und Auswirkung. Die letzte Zeile entscheidet über die Priorität; ohne sie bleibt es eine Formalie.
Modul: Accessibility Testing
Im Entwicklungsprozess verankern
| Zeitpunkt | Frage | Beispiel |
|---|---|---|
| Ready | Ist geklärt, was gilt | Tastenmuster der Komponente benannt |
| Ready | Ist das Nötige vorhanden | Fehlertexte formuliert, nicht nur rot |
| Done | Wurde es geprüft | Tastaturdurchlauf gemacht |
| Done | Ist es belegt | Befund im Ticket vermerkt |
Aus „Der Dialog ist barrierefrei” wird ein prüfbares Kriterium, indem man es in Sätze zerlegt: Fokus beim Öffnen auf der Überschrift, Fokus bleibt im Dialog, Escape schließt, nach dem Schließen liegt der Fokus wieder auf der auslösenden Schaltfläche. Vier Sätze, vier Tests — und derselbe Text taugt als Auftrag an einen Coding Agent.
| Stufe | Läuft | Findet |
|---|---|---|
| Linting | Beim Schreiben | Bild ohne alt, Klick auf div |
| Prüfengine im Test | Bei jedem Lauf | Zustände nach Interaktion |
| Bildvergleich | Bei jedem Lauf | Verschwundener Fokusrahmen |
| Quality Gate | Vor dem Zusammenführen | Rückfall unter die Schwelle |
| Feld im Findings-Register | Inhalt | Fehlt es, dann |
|---|---|---|
| Auswirkung | Was Menschen nicht können | Wird nicht priorisiert |
| Gruppe | Wer betroffen ist | Wirkt wie ein Schönheitsfehler |
| Behelf | Was bis dahin hilft | Betroffene stehen ohne Weg da |
| Termin | Bis wann behoben | Der Eintrag altert still |
Zuständigkeit hängt an Fragen, nicht an einer beauftragten Person: Design verantwortet Kontrast, Fokus, Zielgröße und Text; Entwicklung Semantik, Tastatur und Zustände; QA Prüfung und Nachweis; Product Owner Priorität und Termin.
Modul: Accessibility in Entwicklungsprozessen
Typische Fallen
outline: noneohne Ersatz. Der Indikator verschwindet, der Ersatz kommt „später”.:focus-visibletrennt Maus von Tastatur —:focusnicht.- Positive
tabindex-Werte. Sie ordnen die Reihenfolge global um; die visuelle Reihenfolge perorderzu ändern und das Markup zu belassen, ist dieselbe Falle von der anderen Seite. aria-label, das von der sichtbaren Beschriftung abweicht. Die Sprachsteuerung ruft die sichtbare Beschriftung auf und findet nichts.aria-hiddenauf einem fokussierbaren Element. Der Fokus landet im Nichts. Zusätzlichinertsetzen oder aus dem Tablauf nehmen.- ARIA als Ersatz für fehlendes Tastaturverhalten. Attribute melden Zustände, sie erzeugen keine Bedienbarkeit.
- Platzhaltertext als einzige Beschriftung. Er verschwindet beim Tippen — genau dann, wenn man ihn braucht.
- Fehler nur farblich markieren. Ohne
aria-invalidund verknüpften Fehlertext kommt weder Zustand noch Ursache an. - Gegen Weiß prüfen, obwohl das Element auf einer Farbfläche liegt. Und: nur den Ruhezustand messen, Hover, Fokus und Fehler auslassen.
- Zielgröße am Mauszeiger bemessen statt am Finger. 24 × 24 ist das WCAG-Minimum, 44 × 44 die praktikable Größe.
- Grüner automatischer Lauf als Konformitätsnachweis. Er belegt, dass Namen vorhanden sind, nicht dass sie sinnvoll sind.
- Das Quality Gate als Warnung einführen und nie scharf schalten. Ebenso wirkungslos: eine Schwelle, die der Bestand sofort reißt.
- Eine Erklärung veröffentlichen, die vollständige Konformität behauptet. Bekanntes Offenes gehört hinein — mit Behelf und Termin.