4.1.2Poziom A

Nazwa, rola, wartość

Name, Role, Value

Udostępnij programowo nazwę i rolę kontrolek, ustawiane stany i wartości, możliwość ich zmiany oraz informacje o zmianach dla technologii asystujących.

Komu pomaga
NiewidzenieOgraniczenia ruchoweSłabowidzenie
Zastosowanie
WWWAplikacje mobilneAplikacje desktopoweDokumenty cyfroweInne urządzenia

Warunki i wyjątki opisano w artykule.

Wersja
WCAG 2.2, wprowadzone w 2.0
Zasada / wytyczna
Solidność / 4.1
Stan researchu
Draft AI. Bez przeglądu człowieka.
Redakcja artykułu
· wersja robocza
Na tej stronie

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.
Nieaktualny stan
Pracownia WWW: powiadomienia wizualnie Włączone po kliknięciu, lecz stan AX pozostaje 0.
Nazwa i rola są obecne; aria-checked pozostał false mimo zmiany UI.
Aktualny stan
Ta sama Pracownia: powiadomienia Włączone po Space, a AX przekazuje 1.
Stan semantyczny odpowiada zmianie wyglądu; Enter przywrócił 0.

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ć

  1. Dla każdej postrzeganej kontrolki ustal funkcję, nazwę, rolę, wymagane stany/wartości oraz właściwą akcję.
  2. Odczytaj rzeczywiście udostępnioną semantykę przed wejściem; pobliski tekst i ID testowy nie zastępują dostępnej nazwy.
  3. 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.
  4. 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.
  5. 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.

Powiązane kryteria