🏗️ Semantic HTML
❌ Schlecht
<div class="header">
<div class="nav">
<div onclick="...">Click</div> ✅ Gut
<header>
<nav>
<button>Click</button>
Screenreader verstehen <button>, aber nicht <div onclick>
Web für alle. Keine Ausreden.
<div class="header">
<div class="nav">
<div onclick="...">Click</div> <header>
<nav>
<button>Click</button>
Screenreader verstehen <button>, aber nicht <div onclick>
alt="Golden Retriever spielt im Park" alt="Bild" / alt="foto.jpg" / alt="" alt="" — OK für dekorative Bilder WCAG AA: mindestens 4.5:1 für normalen Text, 3:1 für großen Text.
Schwer lesbar
Gut lesbar
Tool: WebAIM Contrast Checker
Keyboard-User müssen sehen wo sie sind. Nie outline: none ohne Alternative!
/* Gut: Custom Focus Style */
button:focus-visible {
outline: 2px solid #3b82f6;
outline-offset: 2px;
}
/* Schlecht: Focus komplett entfernen */
button:focus {
outline: none; /* ❌ NIE! */
} Drück Tab um den Unterschied zu sehen
<input placeholder="Email"> Placeholder ist kein Label!
<label for="email">Email</label>
<input id="email"> Erste Regel von ARIA: Benutze kein ARIA wenn du natives HTML nutzen kannst.
<button aria-label="Menü schließen">✕</button> <span aria-hidden="true">🎨</span> Design Dekorative Icons vor Screenreadern verstecken
<div aria-live="polite">3 Ergebnisse gefunden</div> Dynamische Änderungen ankündigen