Poziom
A
Od wersji
WCAG 2.0
Pozycje
128 / 193
/ Kryterium WCAG

4.1.2 Nazwa, rola, wartość

Każda kontrolka potrzebuje nazwy i roli w kodzie strony, inaczej technologia wspomagająca nie powie, czym jest.

/ Czego wymaga

Technologia wspomagająca nie patrzy na ekran. Pyta przeglądarkę, jak nazywa się każda kontrolka, jakiego jest rodzaju i w jakim jest stanie. Kryterium wymaga, żeby wszystkie trzy informacje były dostępne w kodzie dla każdego komponentu interfejsu: nazwa, rola oraz każdy stan i wartość, które użytkownik może zmienić, przy czym zmiany mają być zgłaszane na bieżąco. Bez nich czytnik ekranu mówi „przycisk” i nic więcej albo nie mówi nic, a sterowanie głosem nie potrafi wskazać kontrolki.

Natywne kontrolki HTML użyte zgodnie ze specyfikacją spełniają to domyślnie: element button z tekstem, pole input z etykietą, link z treścią. Kryterium daje o sobie znać przy tym, co autorzy budują sami, czyli przy elemencie div reagującym na kliknięcia, własnej liście rozwijanej albo akordeonie. Takie elementy potrzebują roli, nazwy dostępnej i atrybutów stanu, na przykład aria-expanded lub aria-checked, które skrypt na bieżąco aktualizuje. Kryterium nie wymienia żadnych wyjątków. Kontrolka, która działa myszą, a nie ma jej w drzewie dostępności, nie spełnia wymogu.

/ Jak strony go nie spełniają

  • Przycisk zawiera samą ikonę i nie ma tekstu, atrybutu aria-label ani title.
  • Element div lub span z obsługą kliknięcia działa jak przycisk i nie ma żadnej roli.
  • Pole tekstowe nie ma elementu label, atrybutu aria-label ani aria-labelledby.
  • Akordeon albo przycisk menu otwiera się i zamyka, a atrybut aria-expanded nigdy się nie zmienia.
  • Atrybut aria-labelledby podaje id, którego nie ma na stronie, więc wyliczona nazwa jest pusta.

/ Jak sprawdzić samodzielnie

  1. Przejdź przez stronę tabulatorem z włączonym darmowym czytnikiem ekranu, na przykład NVDA. Przy każdym zatrzymaniu fokusu powinno być słychać nazwę, rolę i tam, gdzie to ma zastosowanie, stan.
  2. Zbadaj każdą kontrolkę w panelu Accessibility narzędzi deweloperskich przeglądarki i odczytaj jej nazwę (Name), rolę (Role) i właściwości stanu.
  3. Użyj każdego własnego widżetu: otwórz akordeon, przestaw przełącznik, wybierz opcję. Sprawdź, czy stan pokazany w drzewie dostępności zmienia się razem z nim.
  4. Uruchom darmowe rozszerzenie przeglądarki, takie jak axe DevTools lub WAVE, żeby wypisać kontrolki bez nazwy, a potem potwierdź jego wyniki ręcznie.
  5. Wyszukaj w źródle atrybuty aria-labelledby, aria-describedby i aria-controls i potwierdź, że każde wymienione w nich id istnieje.

/ Jak to naprawić

  • Najpierw sięgaj po element natywny: button do akcji, a z atrybutem href do nawigacji oraz input, select i textarea do danych.
  • Przyciski z ikonami nazwij atrybutem aria-label albo wizualnie ukrytym tekstem wewnątrz przycisku, a każdemu elementowi iframe daj atrybut title.
  • Połącz każde pole z elementem label za pomocą atrybutów for i id albo użyj aria-labelledby tam, gdzie widoczny tekst już pełni rolę etykiety.
  • We własnych widżetach ustaw rolę i utrzymuj aria-expanded, aria-checked lub aria-selected w zgodzie z tym, co widżet pokazuje, w tym samym skrypcie, który go zmienia.
  • Nie nadawaj aria-hidden="true" niczemu, co zawiera elementy przyjmujące fokus, a otwartemu oknu dialogowemu daj aria-modal="true" i nazwę.

/ Co sprawdza nasz skaner

Analiza statyczna liczy pola bez aria-label, aria-labelledby, title ani pasującego label for. Na wyrenderowanej stronie nasze reguły zgłaszają puste nazwy dostępne, odwołania ARIA do nieistniejących id, fokus wewnątrz aria-hidden, iframe bez tytułu oraz okna dialogowe, pola kombi i akordeony bez atrybutów stanu. axe i HTML_CodeSniffer dodają przyciski, linki i pola bez nazwy oraz niepoprawne wartości ARIA. Nic nie obsługuje widżetów, więc zmiany stanu pozostają niesprawdzone.

/ Kto je łamie, według naszych pomiarów

Zmierzone podmioty łamiące to kryterium, najwięcej wystąpień na górze
PodmiotSektorWystąpieniaWynik
Gdańskcity · PL1312
Toruńcity · PL8211
Bundesagentur für Arbeitgovernment · DE5816
Bundesministerium für Bildung und Forschunggovernment · DE498
Bundeszentrale für politische Bildunggovernment · DE3910
Poznańcity · PL361
Polski Instytut Sztuki Filmowejculture · PL217
Uniwersytet Jagiellońskieducation · PL211
PKP Intercitytransport · PL202
Stuttgartcity · DE206
Policjagovernment · PL1812
Social Security Administrationgovernment · US16-
Deutsche Bahntransport · DE155
Rzeszówcity · PL158
Universität Heidelbergeducation · DE1521
Uniwersytet Warszawskieducation · PL154
Urząd Ochrony Danych Osobowychgovernment · PL136
Deutsche Rentenversicherunggovernment · DE125
Komisja Nadzoru Finansowegogovernment · PL1217
Poczta Polskagovernment · PL1216
Szczecincity · PL122
Bundesregierunggovernment · DE114
Hamburgcity · DE1123
Nürnbergcity · DE112
Technische Universität Müncheneducation · DE1114
Bundesministerium der Justizgovernment · DE107
Politechnika Warszawskaeducation · PL1012
RWTH Aacheneducation · DE1019
State of Pennsylvaniagovernment · US1021
Centers for Disease Controlhealth · US98
Houstoncity · US87
King Countygovernment · US815
New Orleanscity · US87
New York Public Libraryculture · US823
Phoenixcity · US81
Uniwersytet im. Adama Mickiewiczaeducation · PL812
Rybnikcity · PL76
Seattlecity · US712
Teatr Wielki Opera Narodowaculture · PL73
Amtraktransport · US64
Baltimorecity · US67
Berliner Verkehrsbetriebetransport · DE621
Freie Universität Berlineducation · DE67
LA Metrotransport · US617
Ohio State Universityeducation · US66
Philadelphiacity · US68
State of Floridagovernment · US68
Uniwersytet Marii Curie-Skłodowskiejeducation · PL69
Düsseldorfcity · DE59
Gliwicecity · PL513
Indianapoliscity · US518
Krakówcity · PL512
Miami-Dade Countygovernment · US520
Nashvillecity · US512
Opolecity · PL58
Sąd Najwyższygovernment · PL514
Biblioteka Narodowaculture · PL416
Los Angeles Countygovernment · US49
Olsztyncity · PL48
Pacjent.gov.plhealth · PL49
Politechnika Poznańskaeducation · PL44
Stiftung Preußischer Kulturbesitzculture · DE421
Uniwersytet Mikołaja Kopernikaeducation · PL46
Bundesministerium des Innerngovernment · DE310
Bundesratgovernment · DE314
Las Vegascity · US38
Narodowy Fundusz Zdrowiahealth · PL318
Sejm RPgovernment · PL39
Senat RPgovernment · PL324
Statistisches Bundesamtgovernment · DE39
University of Floridaeducation · US323
Veterans Affairsgovernment · US333
Zamek Królewski w Warszawieculture · PL316
Bostoncity · US26
Bundesministerium der Finanzengovernment · DE213
Chicago Transit Authoritytransport · US24
Deutsche Nationalbibliothekculture · DE223
Dresdencity · DE215
Koleje Mazowieckietransport · PL217
New York Citycity · US237
Państwowa Komisja Wyborczagovernment · PL215
Politechnika Łódzkaeducation · PL25
Politechnika Śląskaeducation · PL22
Prezydent RPgovernment · PL215
San Franciscocity · US228
State of Texasgovernment · US222
Trybunał Konstytucyjnygovernment · PL214
University of Texas at Austineducation · US221
Zakład Ubezpieczeń Społecznychgovernment · PL227
Łódźcity · PL23
Bundesministerium für Gesundheitgovernment · DE146
Bundesnetzagenturgovernment · DE19
Bundestaggovernment · DE117
Cook Countygovernment · US113
Dallascity · US123
Department of Laborgovernment · US146
Detroitcity · US140
Gdyniacity · PL17
Hannovercity · DE110
Harris Countygovernment · US119
Karlsruher Institut für Technologieeducation · DE119
Krajowa Administracja Skarbowagovernment · PL15
Kölncity · DE116
Leipzigcity · DE126
Library of Congressculture · US130
Ludwig-Maximilians-Universität Müncheneducation · DE113
Minneapoliscity · US179
NASAgovernment · US119
Narodowy Bank Polskigovernment · PL123
Narodowy Instytut Dziedzictwaculture · PL16
Narodowy Instytut Zdrowia Publicznegohealth · PL125
Państwowa Inspekcja Pracygovernment · PL150
Państwowa Straż Pożarnagovernment · PL128
Politechnika Gdańskaeducation · PL122
Politechnika Wrocławskaeducation · PL117
Radomcity · PL12
Rzecznik Praw Obywatelskichgovernment · PL142
Smithsonianculture · US114
State of Georgiagovernment · US153
Szkoła Główna Handlowaeducation · PL112
Tychycity · PL120
Uniwersytet Wrocławskieducation · PL115
Uniwersytet Łódzkieducation · PL19
Uniwersytet Śląskieducation · PL19
Warszawacity · PL120
Warszawski Uniwersytet Medycznyeducation · PL113
Wrocławcity · PL12
Zielona Góracity · PL17

Jedna strona na podmiot, mierzona automatycznie w tygodniowym cyklu. Jeśli podmiot coś naprawił od ostatniego pomiaru, zmiana będzie widoczna przy następnym, a każdy podmiot może odpowiedzieć na swojej stronie.

/ Pytania o to kryterium

Co to jest nazwa dostępna?

To tekst, który przeglądarka udostępnia technologii wspomagającej jako nazwę elementu. Przeglądarka wylicza ją w ustalonej kolejności: najpierw aria-labelledby, potem aria-label, potem źródło natywne, czyli element label, atrybut alt albo tekst wewnątrz przycisku lub linku, a na końcu atrybut title. Czytnik ekranu odczytuje ją razem z rolą, na przykład „Szukaj, przycisk”.

Czy do spełnienia kryterium Nazwa, rola, wartość potrzebuję ARIA?

Często nie. Natywne elementy HTML mają już rolę, biorą nazwę ze swojej treści lub etykiety i same zgłaszają swój stan. ARIA jest potrzebna, gdy budujesz kontrolkę, której HTML nie oferuje, albo gdy natywna kontrolka nie ma widocznego tekstu, który mógłby ją nazwać. ARIA na elemencie, który nie zachowuje się jak rola, którą deklaruje, pogarsza sprawę.

Dlaczego czytnik ekranu mówi na mojej stronie tylko „przycisk”?

Bo przycisk ma rolę, a nie ma nazwy dostępnej. Najczęstsza przyczyna to przycisk z ikoną: svg albo obraz w tle wewnątrz elementu button bez tekstu. Dodaj aria-label mówiący, co przycisk robi, albo umieść w nim wizualnie ukryty tekst. Jeśli ikona jest elementem img, daj jej tekst alternatywny, który stanie się wtedy nazwą przycisku.