Kurs HTML i CSS · Moduł 10: Dostępność (a11y)
ARIA - Accessible Rich Internet Applications
W tej lekcji6
ARIA (Accessible Rich Internet Applications) to zestaw atrybutów HTML, które pomagają uczynić dynamiczne treści i zaawansowane interfejsy dostępnymi dla technologii wspomagających. Możesz myśleć o ARIA jak o dodatkowych hieroglifach na ścianie świątyni - dopisują znaczenie tam, gdzie sam HTML nie wystarcza.
Pierwsza zasada ARIA
Nie używaj ARIA, jeśli możesz użyć natywnego HTML!
1<!-- ŹLE - ARIA na divie -->
2<div role="button" tabindex="0" aria-pressed="false">Kliknij mnie</div>
3
4<!-- DOBRZE - natywny HTML -->
5<button>Kliknij mnie</button>Natywny <button> automatycznie jest fokusowalny, reaguje na Enter i Spację, i jest rozpoznawany przez czytniki ekranowe. ARIA stosuj tylko wtedy, gdy natywny HTML nie oferuje potrzebnej funkcjonalności.
ARIA Roles (Role)
Role definiują, czym jest element w kontekście interfejsu.
1<!-- Landmark roles -->
2<div role="banner">Nagłówek strony</div>
3<div role="navigation">Nawigacja</div>
4<div role="main">Główna treść</div>
5<div role="complementary">Sidebar</div>
6<div role="contentinfo">Stopka</div>
7
8<!-- Widget roles -->
9<div role="tablist">
10 <button role="tab" aria-selected="true">Zakładka 1</button>
11 <button role="tab" aria-selected="false">Zakładka 2</button>
12</div>
13<div role="tabpanel">Treść zakładki</div>
14
15<!-- Alert role -->
16<div role="alert">Wystąpił błąd! Sprawdź formularz.</div>ARIA States & Properties
aria-label
Nadaje elementowi niewidoczną etykietę tekstową.
1<!-- Przycisk z ikona - bez tekstu widocznego -->
2<button aria-label="Zamknij okno dialogowe">
3 <span class="icon">X</span>
4</button>
5
6<!-- Nawigacja z etykieta -->
7<nav aria-label="Nawigacja po wystawach">
8 <ul>...</ul>
9</nav>aria-describedby
Łączy element z dodatkowym opisem.
1<label for="password">Hasło:</label>
2<input type="password" id="password"
3 aria-describedby="password-help">
4<p id="password-help">
5 Hasło musi mieć minimum 8 znaków, wielką literę i cyfrę.
6</p>aria-hidden
Ukrywa element przed czytnikami ekranowymi (ale pozostaje widoczny wizualnie).
1<!-- Ikona dekoracyjna - ukryta przed czytnikiem -->
2<button>
3 <span aria-hidden="true" class="icon">☰</span>
4 Menu
5</button>
6
7<!-- UWAGA: Nigdy nie ukrywaj treści, która jest ważna! -->aria-live
Informuje czytnik ekranowy o dynamicznych zmianach na stronie.
1<!-- Region live - czytnik ogłosi zmiany -->
2<div aria-live="polite" id="status">
3 <!-- Treść aktualizowana dynamicznie -->
4</div>
5
6<!-- Pilne powiadomienie -->
7<div aria-live="assertive" role="alert">
8 Sesja wygaśnie za 2 minuty!
9</div>Wartości aria-live:
off- brak ogłoszeń (domyślnie)polite- poczeka aż czytnik skończy bieżące zdanieassertive- przerwie bieżące czytanie natychmiast
aria-expanded
Informuje o stanie rozwijanych elementów.
1<button aria-expanded="false" aria-controls="menu">
2 Menu nawigacyjne
3</button>
4<nav id="menu" hidden>
5 <ul>
6 <li><a href="/">Strona główna</a></li>
7 <li><a href="/exhibitions">Wystawy</a></li>
8 </ul>
9</nav>aria-required i aria-invalid
Walidacja formularzy.
1<label for="name">Imię (wymagane):</label>
2<input type="text" id="name"
3 aria-required="true"
4 aria-invalid="false">
5
6<!-- Po błędnej walidacji -->
7<input type="email" id="email"
8 aria-required="true"
9 aria-invalid="true"
10 aria-describedby="email-error">
11<p id="email-error" role="alert">
12 Podaj poprawny adres e-mail.
13</p>Podsumowanie ARIA
Pamiętaj o pięciu zasadach ARIA:
- Nie używaj ARIA, jeśli możesz użyć natywnego HTML
- Nie zmieniaj semantyki natywnych elementów - nie dodawaj
role="heading"do<p> - Wszystkie interaktywne elementy ARIA muszą być dostępne z klawiatury
- Nie używaj
aria-hidden="true"na fokusowalnych elementach - Wszystkie interaktywne elementy muszą mieć dostępną nazwę
Testowanie ARIA
Aby sprawdzić, czy Twoje atrybuty ARIA działają poprawnie:
- Czytnik ekranowy - użyj VoiceOver (Mac), NVDA (Windows) lub TalkBack (Android)
- Chrome DevTools - zakładka Accessibility pokazuje drzewo dostępności
- Rozszerzenia - axe DevTools, WAVE
Praktyczny test
Otwórz stronę, wyłącz monitor (lub zamknij oczy) i spróbuj nawigować po niej używając tylko klawiatury i czytnika ekranowego. Czy wszystkie informacje są dostępne? Czy wiesz, co robi każdy przycisk?
Checklist ARIA dla dewelopera
- Czy każdy interaktywny element ma dostępną nazwę (tekst, aria-label)?
- Czy dynamiczne zmiany na stronie są ogłaszane przez aria-live?
- Czy modalne okna dialogowe mają poprawny focus trap?
- Czy stany (expanded, selected, pressed) są aktualizowane?
- Czy dekoracyjne elementy mają aria-hidden="true"?
ARIA to potężne narzędzie w rękach budowniczego dostępności - jak magiczne amulety, które dodają elementom ukrytą moc rozumianą przez czytniki ekranowe. Ale tak jak amulety w świątyniach egipskich, trzeba ich używać z wiedzą i umiarem. Nadmiar ARIA może bardziej zaszkodzić niż pomóc!
Kod do tej lekcji: index.html
1<!DOCTYPE html>
2<html lang="pl">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>ARIA - Atrybuty dostepnosci</title>
7 <link rel="stylesheet" href="style.css">
8</head>
9<body>
10 <h1>ARIA w praktyce</h1>
11
12 <!-- aria-label -->
13 <section>
14 <h2>aria-label - niewidoczna etykieta</h2>
15 <button aria-label="Zamknij okno dialogowe" class="icon-btn">
16 <span aria-hidden="true">✕</span>
17 </button>
18 <p>Przycisk z ikona X - czytnik powie "Zamknij okno dialogowe"</p>
19 </section>
20
21 <!-- aria-describedby -->
22 <section>
23 <h2>aria-describedby - dodatkowy opis</h2>
24 <label for="pwd">Haslo:</label>
25 <input type="password" id="pwd" aria-describedby="pwd-help">
26 <p id="pwd-help" class="hint">
27 Minimum 8 znakow, wielka litera i cyfra.
28 </p>
29 </section>
30
31 <!-- aria-expanded -->
32 <section>
33 <h2>aria-expanded - stan rozwijany</h2>
34 <button aria-expanded="false"
35 aria-controls="faq-answer"
36 onclick="toggleFaq(this)">
37 Czym jest skarabeusz?
38 </button>
39 <div id="faq-answer" hidden>
40 <p>Skarabeusz to swiety zuk w Starorzytnym Egipcie,
41 symbolizujacy odrodzenie i boga slonca Chepri.</p>
42 </div>
43 </section>
44
45 <!-- aria-live -->
46 <section>
47 <h2>aria-live - dynamiczne powiadomienia</h2>
48 <button onclick="updateStatus()">Sprawdz dostepnosc biletow</button>
49 <div aria-live="polite" id="ticket-status" class="status">
50 Kliknij przycisk, aby sprawdzic.
51 </div>
52 </section>
53
54 <!-- role="alert" -->
55 <section>
56 <h2>role="alert" - pilne powiadomienie</h2>
57 <button onclick="showAlert()">Wyswietl alert</button>
58 <div id="alert-area"></div>
59 </section>
60
61 <script>
62 function toggleFaq(btn) {
63 const expanded = btn.getAttribute('aria-expanded') === 'true';
64 btn.setAttribute('aria-expanded', !expanded);
65 document.getElementById('faq-answer').hidden = expanded;
66 }
67
68 function updateStatus() {
69 document.getElementById('ticket-status').textContent =
70 'Dostepne 15 biletow na wystawe Skarby Tutanchamona.';
71 }
72
73 function showAlert() {
74 const area = document.getElementById('alert-area');
75 area.innerHTML = '<div role="alert" class="alert">' +
76 'Uwaga! Wystawa zamyka sie za 30 minut.</div>';
77 }
78 </script>
79</body>
80</html>Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Jaka jest pierwsza zasada używania ARIA?
2. Jaka jest różnica między aria-live="polite" a aria-live="assertive"?
To 2 z 3 pytań do tej lekcji. Pozostałe rozwiążesz w grze.
Zadania praktyczne w grze
- Układanie w poziomie
Ułóż poprawną składnię pola z aria-describedby:
- Edytor kodu
Dodaj atrybuty ARIA: aria-label do przycisku-ikony, aria-describedby do pola wyszukiwania, aria-hidden do dekoracyjnej ikony, aria-expanded i aria-controls do FAQ.