Co oznacza to kryterium
Kontrolka powinna przekazywać oprogramowaniu, czym jest, do czego służy oraz jaki ma bieżący stan lub wartość. Użytkownik czytnika musi móc rozpoznać przełącznik, dowiedzieć się, czy jest włączony, i go zmienić. Pole udostępnia wpisaną wartość oddzielnie od swojej nazwy. Zmiany muszą być dostępne dla odbiorców, w tym technologii asystujących.
To pomaga osobom niewidomym korzystającym z czytnika lub brajla, osobom z ograniczeniami ruchowymi używającym sterowania głosem lub przełączników oraz osobom słabowidzącym, których oprogramowanie śledzi fokus. Sam dotyk, narysowany obrys lub tekst na ekranie nie potwierdzają tych sposobów obsługi.
Przykłady błędów i poprawek
Jeden wybór, trzy odmienne usterki
Własna „Pracownia” pokazuje ustawienia powiadomień dla syntetycznego zamówienia P-104. Użytkownik włącza „Powiadomienia o odbiorze” i wpisuje kod P-104. Początkowo wybór jest wyłączony, a pole puste. Przykład niczego nie wysyła ani nie utrwala.
WWW good/name/role/bad zachowują identyczne dane, wygląd i wejście. Zmienia się wybrana część semantyki. Poniższa tabela podaje odczyty rzeczywistego drzewa AX i DOM w przeglądarce na macOS z 2026-10-04, bez przypisywania im odczytu przez czytnik.
| Wariant | Nazwa i rola w AX | Stan po tym samym wejściu | Problem i poprawka |
|---|---|---|---|
| good | „Powiadomienia o odbiorze”, switch | Space: 0 → 1, Enter: 1 → 0; UI zgodny. | Nazwa jest stała, stan pochodzi z bieżącego modelu. |
| name | Switch bez nazwy, mimo widocznej etykiety | 0 → 1, działanie zachowane. | Przywróć aria-labelledby; we Flutterze Semantics.label. |
| role | Container zamiast switch | DOM aria-checked zmienia się, ale AX nie ma stanu przełącznika. | Przywróć role=“switch” i zachowaj istniejącą obsługę. |
| bad | Nazwa i rola istnieją | Widoczne „Włączone”, a AX nadal 0 i aria-checked=false. | Aktualizuj semantykę z tego samego modelu co wygląd. |
| control | Nazwany natywny checkbox | Space: 0 → 1, checked=true. | Brak jawnego role lub aria-checked jest prawidłowy dla tej standardowej kontrolki. |


Surowe JPEG z Codex IAB/macOS, 2026-10-04. Odczyty i obrazy są sekwencyjne. Różny obrys fokusu wynika z wejścia wskaźnikiem lub klawiaturą i nie jest badaną usterką. Semantyki nie można wywnioskować z samych pikseli.
- Problem
- Widoczna etykieta, reagowanie na Space i zmiana koloru nie zapewniają nazwy, roli ani aktualnego stanu.
- Skutek
- Użytkownik może nie wiedzieć, czego dotyczy wybór, albo otrzymać informację Wyłączone po jego włączeniu.
- Poprawka
- Powiąż nazwę, zastosuj właściwą rolę oraz aktualizuj stan przez usługi dostępności wraz z modelem. Sprawdź też dostępną akcję i odbiór zmian przez docelową technologię asystującą.
Pole i standardowa kontrolka
WWW good i control udostępniały text field „Kod odbioru”, właściwość settable oraz wartość P-104 po wpisaniu. W ponowieniu iOS każdy wariant miał TextField z tą nazwą i wartością po typeText. Puste native value wynosiło dokładnie pusty tekst; placeholder „Np. P-104” występował w label. Nie należy utożsamiać placeholdera, nazwy i wartości.
Kontrolą Fluttera był CupertinoSwitch z nazwą ze scalonego wiersza. Brak własnego identyfikatora testowego nie był brakiem nazwy. Osobny wariant bez roli pokazano tylko na WWW: flaga toggled Fluttera wiąże stan binarny z semantyką przełącznika.
Kiedy obowiązuje i gdzie są wyjątki
Co ma przekazywać kontrolka
Wymaganie dotyczy wszystkich komponentów interfejsu, również standardowych i tworzonych skryptem. Jedna postrzegana kontrolka realizuje odrębną funkcję; liczba elementów DOM lub widżetów nie określa liczby kontrolek. Odrębne części wielopolowego wejścia potrzebują własnej identyfikacji.
| Informacja | Znaczenie |
|---|---|
| Nazwa | Identyfikuje kontrolkę. Nie jest HTML name, ID testowym ani samym hintem. Może pochodzić z tekstu, powiązanej etykiety lub API. |
| Rola | Określa funkcję, np. link, przycisk, pole lub przełącznik. Kursor pointer i tabindex nie nadają roli. |
| Stan | Dynamiczna cecha, np. checked, expanded lub fokus. Rola przełącznika nie zmienia się po włączeniu. |
| Właściwość i wartość | Np. relacja etykiety, zakres suwaka, bieżąca liczba lub tekst pola. AX może nazywać binarny stan polem Value, bez zmiany jego znaczenia. |
| Programowa obsługa | Informacje można odczytać i zmieniać metodami odbiorcy, również akcją dostępności. Prywatny model aplikacji nie wystarcza. |
| Informacja o zmianie | Mechanizm platformy udostępnia aktualizację odbiorcom. Odczyt drzewa przed i po nie potwierdza emisji ani odbioru zdarzenia. |
Programowe ustawienie nie wymaga publicznego endpointu ani nieograniczonego zapisu każdej właściwości. Wymagane właściwości zależą od funkcji: nie każda kontrolka ma wartość liczbową, zaznaczenie lub możliwość edycji.
Standardowe komponenty i relacje z innymi wymaganiami
4.1.2 nie zawiera listy wyjątków dla własnych kontrolek. Standardowy komponent może realizować wymaganie, gdy użyto go zgodnie ze specyfikacją i nie uszkodzono semantyki. Statyczny akapit i dekoracja nie są kontrolkami; ukrycie działającego przycisku przed AT nie czyni go dekoracją.
Nazwa może być niewidoczna — 4.1.2 samo nie wymaga widocznej etykiety. Niepusta nazwa o błędnym znaczeniu albo rola przycisku dla suwaka nie wystarczą. Identyczne nazwy kilku elementów nie są automatycznie błędem: oceń funkcję i kontekst. Fokus klawiatury, fokus AT i wizualne zaznaczenie mogą się różnić.
Nie trzeba dodawać aria-live ani ręcznie odczytywać każdego przełączenia. Dublowanie standardowych komunikatów może przeszkadzać. Zewnętrzny komunikat „Zapisano” należy też do 4.1.3 i nie zastępuje checked kontrolki. ARIA nie dodaje obsługi klawiatury ani akcji. Przy złożonym comboboxie zbadaj także relacje, rozwinięcie, zaznaczenie i aktywnego potomka; sama nazwa nie pokrywa wszystkiego.
Platformy
Interpretacja AI z 2026-10-04: WCAG 2.2 dla WWW, informacyjna WCAG2ICT 2.2, Group Note 2025-12-11, dla dokumentów i oprogramowania. Zastosowanie nie jest potwierdzonym wykonaniem ani oceną obowiązku prawnego.
| Środowisko | Warunek i adaptacja | Wykonanie źródłowe |
|---|---|---|
| WWW, także telefon | Kontrolki, pola, linki i widżety. | Lokalne WWW/macOS, AX/DOM i interakcje; telefon niewykonany. |
| Mobilne | Usługi dostępności platformy udostępniają dane AT i funkcjom oprogramowania bazowego. | Flutter/iOS Simulator po ponowieniu: build, XCTest i native AX; Android i rzeczywisty AT niewykonane. |
| Desktop | Ta sama adaptacja do kontrolek programu. WWW na macOS nie jest jego testem. | Niewykonane. |
| Dokument | Formularze i kontrolki potrzebują poprawnych danych autora, także przy standardowym komponencie formatu. | Niewykonane. |
| Kiosk | Interaktywne oprogramowanie; przy funkcjonalności zamkniętej alternatywy wymagają osobnej oceny. | Niewykonane. |
Statyczny akapit nie spełnia warunku, ale nie wyłącza platformy. W hybrydzie rozdziel WWW i część natywną.
Rozwiązania w technologiach
Preferuj standardową kontrolkę z nazwą i wspólnym bieżącym stanem. Dokumentację poniższych API przejrzano w źródle 2026-10-04; fragmenty nie tworzą osobnych aplikacji.
Flutter
import 'package:flutter/cupertino.dart';
// W State: bool enabled = false;
MergeSemantics(
child: Row(children: [
const Expanded(child: Text('Powiadomienia o odbiorze')),
CupertinoSwitch(
value: enabled,
onChanged: (value) => setState(() => enabled = value),
),
]),
)To wariant control wykonany hostowo i na iOS. Własny good używa jednego Semantics z label, toggled z modelu, onTap i wykluczeniem dekoracyjnego dziecka. Wykluczenie przenosi odpowiedzialność na autora; nie usuwaj semantyki natywnego pola. Hostowy test SemanticsOwner potwierdza wewnętrzne połączenie, bez mostu iOS/AT.
Dokumentacja i analiza: PASS. 5 nowych testów: PASS; świeży build iOS oraz końcowy XCTest/native AX: PASS w ponowieniu. VoiceOver i monitor zdarzeń: niewykonane.
iOS / SwiftUI
import SwiftUI
struct PickupNotifications: View {
@State private var enabled = false
var body: some View {
Toggle(isOn: $enabled) {
Text("Powiadomienia o odbiorze")
}
}
}Toggle bierze nazwę z etykiety i stan z Binding. Własny narysowany wybór wymaga także roli i akcji. Ręczne announcement nie zastępuje API ani aktualnego stanu. Dokumentacja: sprawdzona; typecheck, runtime i VoiceOver: niewykonane. Build Fluttera nie potwierdza SwiftUI.
Android / Compose
import androidx.compose.material3.Switch
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
@Composable
fun PickupNotifications() {
var enabled by remember { mutableStateOf(false) }
Switch(
checked = enabled,
onCheckedChange = { enabled = it },
modifier = Modifier.semantics {
contentDescription = "Powiadomienia o odbiorze"
}
)
}Dodaj widoczną etykietę wyboru w ekranie. Standardowy Switch zapewnia rolę, stan i akcję, a contentDescription nazwę. Przy własnym wierszu użyj toggleable z Role.Switch i wspólnym stanem; nie dubluj akcji rodzica i dziecka. Dokumentacja: sprawdzona; kompilacja, Android i TalkBack: niewykonane.
React Native
import React, { useState } from 'react';
import { Switch } from 'react-native';
export function PickupNotifications() {
const [enabled, setEnabled] = useState(false);
return (
<Switch
accessibilityLabel="Powiadomienia o odbiorze"
value={enabled}
onValueChange={setEnabled}
/>
);
}Callback aktualizuje sterowane value. Własna kontrolka wymaga właściwej accessibilityRole, akcji i accessibilityState.checked z tego samego modelu. accessibilityValue opisuje wartość, np. zakres suwaka. Grupowanie accessible rodzica może ukryć niezależne dzieci. Dokumentacja: sprawdzona; typecheck, build i runtime: niewykonane.
WWW / HTML i JavaScript
<label>
<input type="checkbox" />
Powiadomienia o odbiorze
</label>
<label for="pickup-code">Kod odbioru</label>
<input id="pickup-code" type="text" />Checkbox udostępnia checked, pole tekstowe value, a etykiety nazwy. Jawne ARIA nie jest tu wymagane. Własny źródłowy switch miał role=switch, aria-labelledby, aktualizowany aria-checked i działające Space/Enter/click. Nie kopiuj celowych błędów. Dokumentacja oraz działanie własnego WWW: sprawdzone; minimalny zapis powyżej jest objaśnieniem tego wzorca.
Jak sprawdzić
- Dla każdej postrzeganej kontrolki ustal funkcję, nazwę, rolę, wymagane stany/wartości oraz właściwą akcję.
- Odczytaj rzeczywiście udostępnioną semantykę przed wejściem; pobliski tekst i ID testowy nie zastępują dostępnej nazwy.
- Aktywuj tę samą kontrolkę, edytuj pole i porównaj aktualną informację z UI. Zbadaj kolejne cykle i reset; dobry stan off nie ujawnia stale false po włączeniu.
- Osobno wykonaj dostępną akcję przez docelową AT i sprawdź odbiór informacji o zmianie. Monitor zdarzeń jest potrzebny, gdy oceniasz ich emisję niezależnie od mowy.
- Zachowaj zakres, metodę, stany i niewykonane próby. Uwzględnij czas mostu, animację, ukryte elementy i wirtualizację.
Weryfikacja i ograniczenia
| Sprawdzenie źródłowe 2026-10-04 | Wynik i zakres |
|---|---|
| WWW/macOS | Good 0 → 1 → 0; name bez nazwy; role jako container; bad stale 0 przy Włączone; natywny checkbox i pole poprawne w badanych stanach. 7 JPEG i 15 AX/DOM. |
| Flutter host | 5 nowych testów PASS; po końcowej poprawce testu analiza bez uwag. Ponowienie: 56 testów PASS w zestawie filtrowanym według nazw Androida. |
| Pierwszy build iOS | Przerwany bez wyniku; starszy Runner nie dowodził tej kompilacji. |
| Ponowienie iOS | Świeży build, zgodność 65 plików bundle, końcowy XCTest 1 test / 0 failures. 30 próbek native AX, 48 wejść i 10 PNG. Good, name, bad i control oraz pole, cykl/reset i nieznane warianty. |
| VoiceOver, akcje AT i monitor zmian | Niewykonane. Tap/typeText XCTest nie są akcjami AT. |
| Człowiek / niezależny zaślepiony walidator | Niewykonane. |
Pierwsza próba ponowienia iOS miała błąd sterownika: tap w środek scalonego wiersza nie trafił w wizualny switch control. Po zmianie punktu sterownika końcowe próby przeszły; nie była to naprawa stanu produktu. Przyczyna wcześniejszego zawieszenia buildu pozostała nieustalona. To historia istotna dla interpretacji wyniku, bez powielania surowych logów.
Drzewo przed/po potwierdza zawartość semantyki, bez dowodu emisji zdarzenia, odbioru czytnikiem lub obsługi głosem. Nie ma filmu ani audio czytnika. Screenshot nie zawiera niewidocznej semantyki. AI może oceniać zgodność nazwy z funkcją, ale to interpretacja. Standardowe API również wymaga kontroli rzeczywistego mostu. Checker znanych wariantów bada integralność i oczekiwania demonstracji, bez pomiaru skuteczności walidatora.
Jak sprawdza Clearship
Katalog z 2026-10-07 określa ocenę częściową. Reguły drzewa wskazują m.in. kontrolkę bez nazwy lub wymaganej informacji o stanie; Android może też wskazać akcję dotyku bez roli. Porównanie dotkniętej kontrolki przed/po szuka zmiany wyglądu bez zmiany semantyki, z ograniczonymi danymi zdarzeń Androida. Pomiar na fixture Androida nie jest pomiarem iOS.
Audyty platformowe i wskazówki AI dostarczają innych kandydatów. Żadna z tych metod nie potwierdza programowego ustawienia przez AT ani odbioru powiadomień. Niedotknięte kontrolki, nieobserwowalne dane i iOS bez zdarzeń wymagają dalszej oceny. Wynik nie potwierdza pełnego 4.1.2; niewykonane próby pozostają jawne.