Nazwa, rola, wartość
Każdy komponent interfejsu użytkownika musi programowo udostępniać nazwę, rolę i — tam gdzie ma to zastosowanie — wartość oraz stan. Bez tego czytniki ekranu, sterowanie głosowe i urządzenia z przełącznikami nie mogą zidentyfikować ani obsłużyć elementu.
Czego wymaga kryterium
Każdy interaktywny element na stronie — przyciski, łącza, pola formularza, zakładki, suwaki, niestandardowe widżety — musi udostępniać technologiom wspomagającym trzy rodzaje informacji:
- Nazwa — jak nazywa się ten element? („Wyślij”, „Zamknij okno dialogowe”, „Głośność”)
- Rola — jaki to rodzaj elementu? (przycisk, łącze, pole wyboru, zakładka, suwak)
- Wartość / stan — dla elementów, które ją posiadają: czy jest wciśnięty, rozwinięty, zaznaczony, wybrany? Jaka jest bieżąca wartość?
Udostępnienie musi być programowe — zdefiniowane w DOM, a nie namalowane przez CSS. Czytniki ekranu, monitory brajlowskie, oprogramowanie do sterowania głosowego oraz skanery z przełącznikami odczytują drzewo dostępności, a nie piksele.
Jak spełnić wymaganie
- Należy używać natywnego elementu HTML wszędzie tam, gdzie taki istnieje.
<button>dostarcza odpowiednią rolę, fokus, obsługę klawiatury i dostępną nazwę z treści tekstowej — bez dodatkowego nakładu pracy. - Dla przycisków z samą ikoną należy dodać
aria-label(lub wizualnie ukryty tekst).<button aria-label="Zamknij">×</button>. - Dla pól formularza należy powiązać
<label for>zidpola. Można też opakować pole w<label>. Tekst zastępczy (placeholder) nie jest etykietą. - Jeśli zachodzi konieczność zbudowania niestandardowego widżetu z
<div>i<span>, należy dodaćrole="…", zarządzaćtabindex, obsłużyć klawisze Enter i Space, a stan odzwierciedlać za pomocąaria-pressed,aria-expanded,aria-checked,aria-selected,aria-valuenow. - Wyrenderowaną stronę należy przejrzeć przez inspektora drzewa dostępności w przeglądarce (Chrome DevTools → Elements → Accessibility) i odczytać każdy element: każdy powinien być ogłaszany jako nazwa + rola + stan.
Typowe błędy
<div onclick="…">stylizowany jako przycisk — brak roli, obsługi klawiatury i nazwy. Czytniki ekranu go pomijają. Sterowanie głosowe nie może powiedzieć „kliknij Zapisz”.<div role="button">beztabindex="0"i bez obsługi Enter/Space — wygląda na dostępny, ale nim nie jest.- Przyciski z samą ikoną (
<button><svg /></button>) bezaria-label,aria-labelledbyani wizualnie ukrytego tekstu. Ogłaszane są jedynie jako „przycisk”. - Niestandardowe listy rozwijane zbudowane z
<div>i JavaScript, w których brakujerole="combobox",aria-expanded,aria-controlsoraz ról listbox/option dla elementów wewnętrznych. - Przyciski przełączające (wyciszenie, ulubione, obserwowanie), które zmieniają stan wizualnie, ale nigdy nie aktualizują
aria-pressed. Użytkownicy widzący dostrzegają zmianę; użytkownicy czytników ekranu nie słyszą różnicy. - Pola formularza z wizualną etykietą obok, lecz bez powiązania
for/idlub otaczającego elementu<label>. - Niestandardowe pola wyboru narysowane za pomocą
<svg>z ukrytym natywnym elementem input, w których:checkednie jest odzwierciedlany w widocznym interfejsie — stany czytnika ekranu i wizualny rozchodzą się.
Dlaczego to ważne
To najczęściej cytowane kryterium sukcesu w specyfikacji. Niemal każda skarga w stylu „ta strona jest bezużyteczna z czytnikiem ekranu” sprowadza się do błędu wynikającego z 4.1.2 — zazwyczaj chodzi o <div> udający przycisk lub przycisk z ikoną bez nazwy. Tu ujawnia się też koszt budowania niestandardowych widżetów: każdy natywny element HTML spełnia 4.1.2 automatycznie; każdy ręcznie zbudowany widżet <div> musi „zasłużyć” na zgodność linijka po linijce. Najszybszym audytem 4.1.2 jest przejście przez stronę klawiszem Tab przy włączonym czytniku ekranu i słuchanie — wszystko, co jest ogłaszane jako „puste” albo tylko „przycisk”, jest znaleziskiem.