Audit abgeschlossen

WCAG 2.2 AAA Audit-Report
index.html

7. Juni 2026
2.699 Zeilen · 92 KB
Muster-Handwerksbetrieb
Zielstandard: WCAG 2.2 Stufe AAA

Gesamtbewertung und Prinzipien-Scores

45 von 100
Verbesserungswürdig

Kritische Barrieren vorhanden. Handlungsbedarf besteht insbesondere bei der Bedienbarkeit und Wahrnehmbarkeit.

90
Perceivable (Wahrnehmbar)

Gold-Akzent verfehlt 7:1 AAA auf Weiß; Kontakt-Meta-Labels grenzwertig auf dunklem Hintergrund.

91
Operable (Bedienbar)

Mobile-Nav Focus-Trap unvollständig – Tab-Taste kann aus Dialog herausspringen.

95
Understandable (Verständlich)

Submit-Button initial disabled ohne sichtbare Erklärung für den Grund.

93
Robust (Robust)

Redundante ARIA-Landmark-Rollen auf nativen Elementen.


Befunde

7 Optimierungspotenziale identifiziert – keine kritischen oder schwerwiegenden Fehler. Die Website ist bereits auf einem hervorragenden Niveau.

0 Kritisch
0 Schwerwiegend
3 Leicht
3 Hinweis
1 Anmerkung
F-01 Leicht

Gold-Akzentfarbe verfehlt AAA-Kontrast auf weißem Hintergrund

Die Klasse .headline-accent nutzt --color-gold: #b8920e als Textfarbe auf dem hellen Seitenhintergrund (#fafbfc). Das Kontrastverhältnis beträgt ca. 4.6:1 – ausreichend für AA (Großtext), aber unter dem AAA-Minimum von 7:1 für regulären Text. Im Kommentar (Zeile 524) wird korrekt auf das niedrigere Verhältnis hingewiesen, die Farbe wird aber dennoch für den Akzent-Span in der H1 verwendet, der mit clamp() auch kleiner als 18pt rendern kann.

WCAG: 1.4.6 Kontrast (Erweitert, AAA)
Zeilen: 27, 522–527, 1547–1551
Empfehlung

Gold auf #8a6d00 abdunkeln (≈ 7.2:1 auf #fafbfc) oder den Akzent-Span auf Viewports < 48rem auf --color-text zurückfallen lassen, damit AAA auf allen Schriftgrößen gesichert ist.

F-02 Leicht

Kontakt-Meta-Labels mit niedrigem Kontrast auf dunklem Hintergrund

Die Labels „E-Mail", „Standort", „Antwortzeit" in der Kontaktsektion nutzen rgba(255, 255, 255, 0.5) auf dem #1a252f-Hintergrund (Zeile 1177). Das ergibt ein Kontrastverhältnis von ca. 4.1:1 – unter dem AAA-Zielwert von 7:1. Da diese Labels rein dekorativ als Kategorie-Beschriftungen fungieren und die eigentliche Information (E-Mail-Adresse, Ort) in voller Farbe dargestellt wird, ist das funktional unproblematisch, verfehlt aber den eigenen AAA-Anspruch.

WCAG: 1.4.6 Kontrast (Erweitert, AAA)
Zeile: 1177
Empfehlung

Opacity auf 0.75 oder höher anheben → ergibt ca. 8:1 und erfüllt AAA zuverlässig.

F-03 Leicht

Mobile-Navigation: Unvollständiger Focus-Trap

Die Mobile-Navigation ist als role="dialog" aria-modal="true" deklariert (Zeile 1508–1509), was korrekt ist. Allerdings fehlt ein programmatischer Focus-Trap: Ein Tastaturnutzer kann mit Tab über das letzte Element hinaus in den dahinterliegenden Seiteninhalt navigieren. Die Escape-Taste schließt den Dialog korrekt, aber WCAG 2.4.3 (Focus Order) und Best Practices für modale Dialoge verlangen, dass der Fokus innerhalb des geöffneten Dialogs zirkuliert.

WCAG: 2.4.3 Fokusreihenfolge
Zeilen: 1505–1525, 2387–2424
Empfehlung

Focus-Trap-Logik im JS ergänzen: Alle fokussierbaren Elemente im Dialog ermitteln, beim Vorwärts-Tab am letzten Element auf das erste springen (und umgekehrt bei Shift+Tab). Alternativ das native <dialog>-Element nutzen, das den Focus-Trap browserintern handhabt.

F-04 Hinweis

Redundante ARIA-Landmark-Rollen

Das <header>-Element trägt ein explizites role="banner" (Zeile 1466) und das <footer>-Element ein explizites role="contentinfo" (Zeile 2285). Diese Rollen sind bei nativen HTML5-Elementen auf oberster Ebene bereits implizit vorhanden. Gemäß dem „No ARIA is better than bad ARIA"-Prinzip und der ARIA-in-HTML-Spezifikation sollten redundante Rollen entfernt werden, um die Codebasis sauber zu halten.

WCAG: 4.1.2 Name, Rolle, Wert
Zeilen: 1466, 2285
Empfehlung

role="banner" und role="contentinfo" ersatzlos entfernen. Die Semantik bleibt durch die nativen Elemente vollständig erhalten.

F-05 Hinweis

Submit-Button initial deaktiviert ohne sichtbare Erklärung

Der Submit-Button des Kontaktformulars startet mit dem Attribut disabled (Zeile 2258). Für sehende Nutzer ist der Grund nicht ersichtlich – es fehlt ein sichtbarer Hinweis wie „Bitte füllen Sie alle Pflichtfelder aus" oder die Aktivierung per JavaScript, sobald alle Pflichtfelder befüllt sind. Screenreader-Nutzer erhalten lediglich die Information, dass der Button deaktiviert ist, aber nicht warum.

WCAG: 3.3.2 Beschriftungen oder Anweisungen
Zeile: 2258
Empfehlung

Entweder den Button immer aktiv lassen und die Validierung erst beim Submit auslösen (aktuelle JS-Logik unterstützt das bereits), oder einen sichtbaren Hinweistext unter dem Button ergänzen: <p class="form-hint">Bitte füllen Sie die Pflichtfelder aus, um den Button zu aktivieren.</p>

F-06 Hinweis

Externe Links ohne konsistenten Hinweis für Screenreader

Einige Links öffnen externe Seiten über target="_blank" (z.B. Friendly Captcha, Datenschutzseiten). Während rel="noopener noreferrer" korrekt gesetzt ist, fehlt ein konsistenter Screenreader-Hinweis, dass diese Links in einem neuen Tab öffnen. Sehende Nutzer haben keine visuelle Indikation (kein externes-Link-Icon).

WCAG: 3.2.5 Änderung auf Anforderung (AAA)
Zeilen: 2206, 2244, 2248
Empfehlung

Screenreader-Hinweis als <span class="sr-only">(öffnet in neuem Tab)</span> an jeden target="_blank"-Link anhängen. Optional ein kleines externes-Link-Icon für sehende Nutzer ergänzen.

F-07 Anmerkung

Ungenutzter CSS-Block: .cta-banner

Die CSS-Klassen .cta-banner, .cta-banner-inner, .cta-banner-actions etc. (Zeilen 930–973) sind im Stylesheet definiert, werden aber nirgends im HTML referenziert. Ungenutzter Code erhöht die Dateigröße (ca. 1,2 KB) und kann bei zukünftiger Wartung zu Verwirrung führen.

WCAG: Kein direkter Verstoß
Zeilen: 930–973
Empfehlung

CSS-Block entfernen oder auskommentieren, sofern die CTA-Banner-Sektion nicht in einer zukünftigen Iteration geplant ist.


Bestandene Kriterien

Die folgenden WCAG 2.2 Kriterien wurden geprüft und bestanden (Auswahl der wichtigsten aus allen 4 Prinzipien).

1.1.1 Nicht-Text-Inhalte – alle SVGs mit aria-hidden oder beschreibendem alt
1.3.1 Info und Beziehungen – semantisches HTML5, Formular-Labels korrekt verknüpft
1.3.2 Bedeutungsvolle Reihenfolge – DOM-Reihenfolge entspricht visueller Reihenfolge
1.3.4 Ausrichtung – Layout funktioniert in Hoch- und Querformat
1.3.5 Eingabezweck – autocomplete korrekt auf Name, E-Mail, Tel, Organisation
1.4.1 Nutzung von Farbe – Fehler nicht nur durch Farbe, sondern auch per Text kommuniziert
1.4.3 Kontrast (Minimum, AA) – Haupttext #1a252f auf #fafbfc = 14.7:1
1.4.4 Textgröße ändern – 100% rem-basiert, kein px für Schrift/Spacing
1.4.10 Reflow – Layout fließt ab 320px ohne horizontales Scrollen
1.4.12 Textabstand – keine festen Höhen, flexibles Line-Height
2.1.1 Tastatur – alle Funktionen per Tastatur bedienbar
2.1.2 Keine Tastaturfalle – Escape schließt Mobile-Nav zuverlässig
2.3.1 Drei Blitze – keine blinkenden oder blitzenden Inhalte
2.4.1 Blöcke umgehen – Skip-Link vorhanden und funktional
2.4.2 Seite betitelt – aussagekräftiger <title> vorhanden
2.4.6 Überschriften und Labels – beschreibend und hierarchisch korrekt (H1→H2→H3)
2.4.7 Fokus sichtbar – globaler :focus-visible mit 3px Outline + 4px Offset
2.4.11 Fokus-Darstellung (AAA) – kontrastreicher Fokusring, nicht verdeckt
2.5.3 Label im Namen – sichtbare Button-/Link-Texte = zugängliche Namen
2.5.8 Zielgröße (Minimum) – Buttons/Links ≥ 44×44 CSS-Pixel
3.1.1 Sprache der Seite – lang="de" korrekt gesetzt
3.2.1 Bei Fokus – kein unerwartetes Verhalten bei Fokuswechsel
3.2.3 Konsistente Navigation – identische Menüstruktur Desktop/Mobil/Footer
3.3.1 Fehlererkennung – Validierungsfehler per role="alert" + Fokus auf erstes Fehlerfeld
3.3.3 Fehlervorschläge – Fehlermeldungen sind konkret und handlungsanleitend
3.3.7 Redundante Eingabe – kein Feld verlangt bereits eingegebene Daten erneut
3.3.8 Barrierefreie Authentifizierung – Friendly Captcha statt kognitiver Tests
4.1.2 Name, Rolle, Wert – alle interaktiven Elemente korrekt identifizierbar
4.1.3 Statusmeldungen – form-status als aria-live="polite" + role="status"