Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m291:learningunits:lu05:theorie:c_accessibility [2026/03/08 19:29] – gkoch | de:modul:m291:learningunits:lu05:theorie:c_accessibility [2026/03/08 22:22] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== LU05c – Accessibility Basics (A11y) ====== | ====== LU05c – Accessibility Basics (A11y) ====== | ||
| + | {{: | ||
| - | < | + | < |
| - | **Weiterführende | + | **Weiterführende |
| </ | </ | ||
| Zeile 21: | Zeile 22: | ||
| - | ===== Screenreader – Live-Demo ===== | + | ==== Warum ist A11y wichtig? |
| - | Ein **Screenreader** ist ein Hilfsprogramm, | + | {{: |
| - | ^ Screenreader ^ Plattform ^ Kosten ^ | + | Barrierefreiheit ist kein «Nice-to-have» mehr – sie ist aus drei Gründen relevant: |
| - | | **VoiceOver** | macOS / iOS | integriert (kostenlos) | | + | |
| - | | **NVDA** | Windows | kostenlos (Open Source) | | + | |
| - | | **JAWS** | Windows | kostenpflichtig | | + | |
| - | | **TalkBack** | Android | integriert (kostenlos) | | + | |
| - | ==== Live-Demo: Alarado Landingpage | + | * **Inklusion: |
| + | * **Gesetzliche Anforderungen: | ||
| + | * **Bessere UX für alle:** Barrierefreie Massnahmen – wie klare Fehlermeldungen, | ||
| + | |||
| + | |||
| + | ===== WCAG – Der internationale Standard ===== | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | Die **Web Content Accessibility Guidelines (WCAG)** werden vom World Wide Web Consortium (W3C) entwickelt und gelten als internationaler Standard für digitale Barrierefreiheit. Sie bieten Entwickler:innen klare, prüfbare Kriterien dafür, wie eine zugängliche Website aussehen muss. | ||
| + | |||
| + | |||
| + | ==== POUR – Die vier Grundprinzipien ==== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Die WCAG sind um vier Grundprinzipien aufgebaut, die unter dem Kürzel **POUR** zusammengefasst werden: | ||
| + | |||
| + | === 1. Wahrnehmbarkeit (Perceivable) === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Inhalte müssen für Augen, Ohren oder Screenreader erkennbar sein. | ||
| + | |||
| + | * Bilder brauchen aussagekräftige '' | ||
| + | * Videos benötigen Untertitel oder Transkripte | ||
| + | * Texte müssen ausreichend Kontrast zum Hintergrund haben (Mindest-Verhältnis: | ||
| + | |||
| + | === 2. Bedienbarkeit (Operable) === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Die Website muss ohne Maus – also nur mit Tastatur oder Sprachsteuerung – vollständig nutzbar sein. | ||
| + | |||
| + | * Focus-Styles beibehalten (nie '' | ||
| + | * Keine blinkenden Inhalte, die Anfälle auslösen könnten | ||
| + | * In unserem Projekt: '' | ||
| + | |||
| + | === 3. Verständlichkeit (Understandable) | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Sprache und Aufbau müssen logisch und vorhersehbar sein. | ||
| + | |||
| + | * Fehlermeldungen in Formularen müssen präzise erklären, was falsch ist (statt kryptischer Codes) | ||
| + | * Die Sprache des Dokuments muss im ''< | ||
| + | * Interaktionen sollen sich erwartungsgemäss verhalten | ||
| + | |||
| + | === 4. Robustheit (Robust) === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Inhalte müssen auf verschiedenen Geräten und mit Hilfstechnologien (Screenreader, | ||
| + | |||
| + | * Semantisches HTML verwenden statt '' | ||
| + | * Schriftgrössen in '' | ||
| + | * ARIA-Attribute korrekt und sparsam einsetzen | ||
| + | |||
| + | ===== Screenreader ===== | ||
| + | |||
| + | Ein **Screenreader** ist ein Hilfsprogramm, | ||
| - | In der Lektion demonstrieren wir, was ein Screenreader auf der Alarado Landingpage vorliest. Die Beobachtungen: | ||
| - | * **Navigation: | ||
| - | * **Buttons: | ||
| - | * **Dark-/ | ||
| - | Warum? Das erklären wir im Abschnitt [[# | ||
| ===== Semantisches HTML als Grundlage ===== | ===== Semantisches HTML als Grundlage ===== | ||
| Zeile 52: | Zeile 104: | ||
| * Für Screenreader als «Schaltfläche» erkennbar | * Für Screenreader als «Schaltfläche» erkennbar | ||
| - | Ein ''< | ||
| - | |||
| - | <code html> | ||
| - | <!-- ❌ Nicht barrierefrei ohne viel Zusatzarbeit --> | ||
| - | <div onclick=" | ||
| - | |||
| - | <!-- ✅ Semantisch korrekt – sofort barrierefrei --> | ||
| - | <button onclick=" | ||
| - | </ | ||
| - | < | + | < |
| **Erste ARIA-Regel: | **Erste ARIA-Regel: | ||
| </ | </ | ||
| + | |||
| Zeile 71: | Zeile 115: | ||
| ARIA ist eine Sammlung von HTML-Attributen, | ARIA ist eine Sammlung von HTML-Attributen, | ||
| + | <WRAP center round box 80%> | ||
| **Drei ARIA-Konzepte: | **Drei ARIA-Konzepte: | ||
| Zeile 77: | Zeile 122: | ||
| | **Zustand** | '' | | **Zustand** | '' | ||
| | **Eigenschaft** | '' | | **Eigenschaft** | '' | ||
| + | </ | ||
| Zeile 84: | Zeile 130: | ||
| Im HTML setzen wir '' | Im HTML setzen wir '' | ||
| + | <WRAP center round box 80%> | ||
| <code html> | <code html> | ||
| <button class=" | <button class=" | ||
| Zeile 93: | Zeile 139: | ||
| </p> | </p> | ||
| </ | </ | ||
| + | </ | ||
| **Was der Screenreader vorliest:** | **Was der Screenreader vorliest:** | ||
| * Zugeklappt: «What is this project, Schaltfläche, | * Zugeklappt: «What is this project, Schaltfläche, | ||
| * Aufgeklappt: | * Aufgeklappt: | ||
| - | |||
| - | Im JavaScript aktualisieren wir '' | ||
| - | |||
| - | <code javascript> | ||
| - | buttons.forEach((button) => { | ||
| - | button.addEventListener(' | ||
| - | const btn = e.currentTarget; | ||
| - | const panelElement = btn.nextElementSibling; | ||
| - | const panelIsOpen | ||
| - | |||
| - | // Alle Panels schliessen + aria-expanded zurücksetzen | ||
| - | buttons.forEach((andererBtn) => { | ||
| - | andererBtn.nextElementSibling.classList.remove(' | ||
| - | andererBtn.setAttribute(' | ||
| - | }); | ||
| - | |||
| - | // Dieses Panel öffnen | ||
| - | if (!panelIsOpen) { | ||
| - | panelElement.classList.add(' | ||
| - | btn.setAttribute(' | ||
| - | } | ||
| - | }); | ||
| - | }); | ||
| - | </ | ||
| - | |||
| - | ==== Icon-Wechsel über aria-expanded in CSS ==== | ||
| - | |||
| - | Im finalen Styling nutzen wir '' | ||
| - | |||
| - | <code css> | ||
| - | /* Plus-Icon: Standardzustand */ | ||
| - | .accordion-btn:: | ||
| - | content: url(' | ||
| - | } | ||
| - | |||
| - | /* Minus-Icon: wenn Panel offen */ | ||
| - | .accordion-btn[aria-expanded=' | ||
| - | content: url(' | ||
| - | } | ||
| - | </ | ||
| Zeile 143: | Zeile 150: | ||
| Nicht alle Nutzenden arbeiten mit einer Maus. Menschen mit motorischen Einschränkungen, | Nicht alle Nutzenden arbeiten mit einer Maus. Menschen mit motorischen Einschränkungen, | ||
| - | ^ Taste ^ Aktion ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | Pfeiltasten | Navigation innerhalb von Komponenten | | ||
| - | ==== Focus-Styles nicht entfernen! ==== | ||
| - | |||
| - | Der sichtbare Fokusrahmen ('' | ||
| - | |||
| - | <code css> | ||
| - | /* ❌ Nie so – macht Tastaturnavigation unsichtbar */ | ||
| - | button: | ||
| - | outline: none; | ||
| - | } | ||
| - | |||
| - | /* ✅ Eigenes Design anbieten, aber nie einfach weglassen */ | ||
| - | button: | ||
| - | outline: 3px solid var(--violet-600); | ||
| - | outline-offset: | ||
| - | border-radius: | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP tip> | ||
| - | **'': | ||
| - | </ | ||
| ===== Praxisbeispiel: | ===== Praxisbeispiel: | ||
| ==== Das Problem ==== | ==== Das Problem ==== | ||
| + | <WRAP center round box 80%> | ||
| Im Alarado-Projekt wurde der ''< | Im Alarado-Projekt wurde der ''< | ||
| <code css> | <code css> | ||
| - | /* Alarado | + | /* Alarado |
| .switch input { | .switch input { | ||
| display: none; | display: none; | ||
| Zeile 186: | Zeile 166: | ||
| Das entfernt das Eingabefeld **komplett** aus dem Accessibility Tree. Screenreader und Tastaturnavigation überspringen den Switch – er ist für Nutzende von Hilfstechnologien unsichtbar und nicht bedienbar. | Das entfernt das Eingabefeld **komplett** aus dem Accessibility Tree. Screenreader und Tastaturnavigation überspringen den Switch – er ist für Nutzende von Hilfstechnologien unsichtbar und nicht bedienbar. | ||
| + | </ | ||
| ==== Das HTML im Alarado-Projekt ==== | ==== Das HTML im Alarado-Projekt ==== | ||
| + | <WRAP center round box 80%> | ||
| <code html> | <code html> | ||
| <label class=" | <label class=" | ||
| Zeile 196: | Zeile 177: | ||
| </ | </ | ||
| </ | </ | ||
| + | </ | ||
| ==== Die Lösung: Visuell verstecken, aber zugänglich halten ==== | ==== Die Lösung: Visuell verstecken, aber zugänglich halten ==== | ||
| Statt '' | Statt '' | ||
| + | <WRAP center round box 80%> | ||
| <code css> | <code css> | ||
| - | /* ✅ Visuell versteckt, aber für Screenreader sichtbar */ | + | /* Visuell versteckt, aber für Screenreader sichtbar */ |
| .switch input { | .switch input { | ||
| position: absolute; | position: absolute; | ||
| Zeile 250: | Zeile 232: | ||
| * «Dark Mode aktivieren, Schalter, ausgeschaltet» | * «Dark Mode aktivieren, Schalter, ausgeschaltet» | ||
| * Nach Klick: «Dark Mode aktivieren, Schalter, eingeschaltet» | * Nach Klick: «Dark Mode aktivieren, Schalter, eingeschaltet» | ||
| + | </ | ||
| - | ==== Übersicht: Verschiedene Verstecktechniken | + | ===== A11y-Grundsätze |
| - | + | ||
| - | ^ Methode ^ Visuell sichtbar ^ Im Accessibility Tree ^ Einsatz ^ | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | Visually Hidden (CSS) | ❌ | ✅ | Inhalte nur für Screenreader | | + | |
| - | | '' | + | |
| - | + | ||
| - | + | ||
| - | ===== Checkliste: | + | |
| * Semantische HTML-Elemente verwendet (''< | * Semantische HTML-Elemente verwendet (''< | ||
| + | * Sprache des Dokuments deklariert: ''< | ||
| * Alle interaktiven Elemente per Tastatur erreichbar (Tab-Navigation)? | * Alle interaktiven Elemente per Tastatur erreichbar (Tab-Navigation)? | ||
| * Focus-Styles sichtbar – '' | * Focus-Styles sichtbar – '' | ||
| + | * Texte haben ausreichend Kontrast (Mindest-Verhältnis 4,5:1)? | ||
| + | * Schriftgrössen in '' | ||
| * Bilder haben ein aussagekräftiges '' | * Bilder haben ein aussagekräftiges '' | ||
| * Interaktive Elemente haben ein zugängliches Label ('' | * Interaktive Elemente haben ein zugängliches Label ('' | ||