Co oznacza to kryterium
Gdy prezentacja mówi „to nagłówek”, „te pola należą do jednej grupy” lub „ta cena dotyczy tej dostawy”, znaczenie powinno pozostać dostępne przy innym sposobie odbioru. Udostępnij właściwą strukturę i relacje programowo albo wyjaśnij je jednoznacznym tekstem. Duży font, ramka i położenie obok siebie nie wystarczą, jeśli trzeba z nich odgadnąć związek.
Pomaga to osobom niewidomym i odbiorcom brajla zachować kontekst, osobom słabowidzącym czytającym zmienioną prezentację oraz części osób z trudnościami czytania i orientacji w treści. Kryterium obejmuje również znaczenie przekazywane formatowaniem dźwiękowym. Motoryka nie jest bezpośrednim warunkiem przedstawionego przykładu.
Przykłady błędów i poprawek
Ten sam cennik, inna semantyka
Własna „Pracownia” prezentuje dwa syntetyczne rekordy: Punkt odbioru — 9,90 zł — 2 dni; Kurier — 14,90 zł — 1 dzień. Wersje bad/good zachowują dane, fonty, układ i kolejność. Ich PNG są identyczne bajtowo, dlatego jeden obraz pokazuje wspólny wygląd. Różnicę wyznacza porównanie prezentacji z kodem i natywnym API.

Surowy PNG good z Flutter/Cupertino, iOS Simulator, 2026-10-02. Bad ma identyczne bajty obrazu. Zdjęcie pokazuje kontekst, bez dowodu relacji, roli nagłówka lub odczytu czytnikiem.
| Informacja | Błędna wersja | Poprawiona wersja |
|---|---|---|
| „Koszty dostawy” | Duży tekst bez flagi nagłówka Fluttera | Nagłówek w semantyce Fluttera |
| Punkt odbioru | Oddzielne teksty „Punkt odbioru”, „9,90 zł”, „2 dni” | „Dostawa: Punkt odbioru. Cena: 9,90 zł. Czas: 2 dni.” |
| Kurier | Oddzielne teksty „Kurier”, „14,90 zł”, „1 dzień” | „Dostawa: Kurier. Cena: 14,90 zł. Czas: 1 dzień.” |
XCTest potwierdził pełne etykiety dwóch rekordów. Natywne drzewo nie wypisuje tu jawnego traitu Header; Other zamiast StaticText samo nie potwierdza działania rotora Nagłówki. Flaga nagłówka była przedmiotem testu semantyki Fluttera, a VoiceOver pozostał niewykonany.
- Problem
- Kolumny wzrokowo przypisują cenę i czas do dostawy, ale API przekazuje osobne liczby bez tego znaczenia.
- Skutek
- Odbiorca bez układu wizualnego musi odgadywać, której dostawy dotyczą 9,90 zł i 2 dni.
- Poprawka
- Dla tych nieinteraktywnych rekordów udostępnij pełne zdania z nazwami danych i rolę nagłówka. W większej macierzy zapewnij relacje do właściwych nagłówków i dogodną nawigację.
To mały widok danych z tekstową informacją w API, bez implementacji nawigowalnej tabeli z rolami komórek i nagłówków. Nie przenoś jednej długiej etykiety całej tabeli do rozbudowanego zestawu danych ani kontenera z oddzielnymi przyciskami lub polami.
Kontrola: pełne zdania zamiast kolumn
Stan text pokazuje te same dwa rekordy jako widoczny zwykły tekst i zachowuje semantykę nagłówka. Brak tabeli nie jest tu błędem: prezentacja nie wymaga odtwarzania relacji kolumn, a przypisania są zapisane w zdaniach.

Surowy PNG kontrolnego wariantu text, 2026-10-02. Pełne zdania widoczne na ekranie; natywne etykiety i reset sprawdzono osobno w XCTest.
Relacje w nagłówkach, polach i tabelach
Poniższe scenariusze tekstowe nie mają osobnych uruchomień. Nie są statystyką występowania ani obowiązkową listą technik.
| Prezentacja i problem | Poprawka | Przypadek bez tej usterki |
|---|---|---|
| Nagłówki, listy i znaczące wyróżnienia tylko fontem lub odstępami | Właściwe role i struktura; znaczenie wyróżnienia można zapisać np. słowem „Uwaga” | Pogrubienie estetyczne nie wymaga roli nagłówka |
| „Adres e-mail” obok nienazwanego pola | Powiąż widoczną etykietę z polem; HTML label/for lub właściwa nazwa natywna | Jawna etykieta nie wymaga dodatkowej ramki |
| Dwie grupy „Tak/Nie” bez pytania w kontekście | Nazwana grupa albo kontekst w nazwach opcji; HTML fieldset/legend | Dekoracyjna ramka akapitów nie czyni ich formularzem |
| Zwykłe komórki zamiast nagłówków albo błędna kolumna | Poprawne relacje; HTML th/scope, przy złożoności id/headers | Układ pozycjonujący nie potrzebuje fałszywych nagłówków tabeli |
| Kolumny spacjami, usunięta struktura albo role niezgodne z treścią | Zachowaj znaczenie; nie usuwaj relacji rolą prezentacyjną | Zwykły tekst może używać rozpoznawalnych list i akapitów, bez wymogu HTML |
Kiedy obowiązuje i gdzie są wyjątki
Wymaganie obejmuje informacje, strukturę i związki przekazywane prezentacją, również dźwiękiem, np. sygnałem początku działu. Nie każda geometria lub ozdobny styl niesie znaczenie. Kryterium nie ma listy zwolnień ze względu na małą liczbę wierszy lub koszt implementacji.
Relacja to znaczący związek części treści, a struktura ich organizacja oraz organizacja zbioru stron. Dane dostępne programowo muszą pozwalać oprogramowaniu i technologiom asystującym wyodrębnić znaczenie oraz przedstawić je w innej formie. Obiekt w kodzie, identyfikator testowy lub pozycja na ekranie tego nie zapewniają.
Dopuszczony tekst jest programowo rozpoznawalnym ciągiem znaków w języku naturalnym. Obraz tekstu lub screenshot nie spełnia tej definicji. Tekst musi wyjaśniać przypisanie i zachować kontekst także przy liniowym odczycie. Same nazwy kolumn i oddzielne liczby nie są jeszcze takim opisem.
Preferuj semantyczną strukturę tam, gdzie technologia ją wspiera. Droga tekstowa jest dopuszczona, bez uzasadnienia kasowania poprawnych relacji. Nie trzeba tworzyć nagłówków tam, gdzie ich nie ma; gdy treść rzeczywiście jest nagłówkiem, zachowaj rolę i hierarchię. Oznaczanie zwykłego zdania jako nagłówka tylko dla stylu może fałszować strukturę.
Znaczenie koloru może wymagać tekstu, ale nie trzeba udostępniać wartości RGB ani samej nazwy koloru. 1.4.1 osobno wymaga widocznej alternatywy; nazwa stanu wyłącznie dla czytnika nie rozwiązuje tamtej bariery. Kolejność, opisowość nagłówków, instrukcje pól oraz nazwa/rola/stan kontrolek mają też odrębne wymagania.
Platformy
Przegląd AI z 2026-10-02: WCAG 2.2 dla WWW i interpretacja WCAG2ICT bez zmiany wymagania dla dokumentów i oprogramowania. Draft nie podaje daty wydania WCAG2ICT. Klasyfikacja nie ustala obowiązków prawnych ani dostępności sprzętu.
| Środowisko | Warunek i adaptacja | Wykonanie źródłowe |
|---|---|---|
| WWW, także telefon | Struktura HTML, listy, tabele i relacje formularzy | Bez uruchomienia odbiornika |
| Mobilne | Dane autora trafiają do usług dostępności albo przekazują znaczenie tekstem | Flutter/Cupertino na iOS Simulator; Android i czytnik niewykonane |
| Desktop | Relacje i struktura programu | Bez uruchomienia |
| Dokument | Zachowanie nagłówków, list, tabel i pól w wynikowym eksporcie; standardowe mapowanie jako fallback dla niestandardowych ról | Bez testu PDF/DOCX |
| Kiosk lub telewizor | Przy zamknięciu dostępny sposób odbioru znaczenia, np. wbudowany odczyt; samo niedostępne API nie wystarczy | Konkretny odbiornik niewykonany |
W hybrydzie rozdziel WebView i część natywną. Brak tabeli nie wyłącza nagłówków i innych relacji.
Rozwiązania w technologiach
Przegląd oficjalnych API: 2026-10-02. Kod pokazuje tylko statyczne dane oraz nagłówek; nie jest pełnym formularzem ani walidatorem tabel. Nie scalaj w jedną etykietę kontenera z przyciskami lub edytowalnymi polami — utraciłbyś ich oddzielną obsługę.
Flutter
Fragment umieść w Column aplikacji Cupertino. Semantics.header oznacza nagłówek, a excludeSemantics usuwa powtórny odczyt wyłącznie statycznych tekstów wiersza. container rozdziela rekordy. To droga jawnego tekstu w API; samo MergeSemantics skleja teksty, ale nie dopisuje znaczenia kolumn.
import 'package:flutter/cupertino.dart';
Widget deliveryRow(String name, String price, String time) => Semantics(
container: true,
excludeSemantics: true,
label: 'Dostawa: $name. Cena: $price. Czas: $time.',
child: Row(children: [Text(name), Text(price), Text(time)]),
);
Widget deliveryPricesView() => Column(children: [
Semantics(header: true, child: const Text('Koszty dostawy')),
deliveryRow('Punkt odbioru', '9,90 zł', '2 dni'),
deliveryRow('Kurier', '14,90 zł', '1 dzień'),
]);Pełny działający układ z elastycznymi szerokościami, wariantami i resetem: main.dart. Tę implementację analizowano, testowano i uruchomiono na iOS. Sam skrócony fragment jest edukacyjnym wyciągiem, bez osobnego builda. Prostszą alternatywą jest Text z pełnym zdaniem, pokazany w stanie text.
iOS / SwiftUI
accessibilityAddTraits(.isHeader) przekazuje rolę nagłówka. Dla nieinteraktywnego wiersza można zastąpić odczyt dzieci kompletną etykietą. Poniższy fragment jest całym widokiem:
import SwiftUI
struct DeliveryPrices: View {
var body: some View {
VStack(alignment: .leading, spacing: 16) {
Text("Koszty dostawy").font(.title)
.accessibilityAddTraits(.isHeader)
HStack {
Text("Punkt odbioru")
Text("9,90 zł")
Text("2 dni")
}
.accessibilityElement(children: .ignore)
.accessibilityLabel("Dostawa: Punkt odbioru. Cena: 9,90 zł. Czas: 2 dni.")
HStack {
Text("Kurier")
Text("14,90 zł")
Text("1 dzień")
}
.accessibilityElement(children: .ignore)
.accessibilityLabel("Dostawa: Kurier. Cena: 14,90 zł. Czas: 1 dzień.")
}
}
}PASS: swiftc -typecheck, Xcode 27.0 / SDK Simulator 27.0, target arm64 / iOS 17.0. Bez aplikacji SwiftUI i bez VoiceOver. .combine może scalać statyczne dzieci, ale nie tworzy relacji tabeli ani brakujących nazw kolumn. Prostszą drogą dla dwóch rekordów jest widoczny Text z pełnym zdaniem.
Android / Compose
Minimalna wersja tekstowa tych samych rekordów nie potrzebuje niestandardowej tabeli. W aplikacji Compose, wewnątrz jej motywu:
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.semantics
@Composable
fun DeliveryPrices() {
Column {
Text("Koszty dostawy", Modifier.semantics { heading() })
Text("Dostawa: Punkt odbioru. Cena: 9,90 zł. Czas: 2 dni.")
Text("Dostawa: Kurier. Cena: 14,90 zł. Czas: 1 dzień.")
}
}Text udostępnia tekst, heading() rolę. Przy zachowaniu kolumn można zastosować pełny opis nieinteraktywnego rekordu, lecz samo mergeDescendants nie definiuje związków komórek z nagłówkami. NOT-RUN: bez kompilacji Compose, Androida i TalkBack; dokumentacja sprawdzona, wersji wykonania nie deklarujemy.
React Native
W ekranie aplikacji React Native:
import React from 'react';
import { Text, View } from 'react-native';
export function DeliveryPrices() {
return (
<View>
<Text accessibilityRole="header">Koszty dostawy</Text>
<Text>Dostawa: Punkt odbioru. Cena: 9,90 zł. Czas: 2 dni.</Text>
<Text>Dostawa: Kurier. Cena: 14,90 zł. Czas: 1 dzień.</Text>
</View>
);
}Pełny tekst zachowuje przypisania, rola header strukturę. Nie dodawaj accessible na całym ekranie, scalając wszystkie rekordy i działania. Dla pola powiązanie accessibilityLabelledBy ma ograniczenie platformowe Android; nie uznawaj go za identyczne API iOS. NOT-RUN: bez kompilacji React Native i uruchomienia; dokumentacja sprawdzona.
Dla WWW preferować natywne nagłówki, listy, label, grupy formularza i prawdziwe tabele danych z poprawnymi nagłówkami; dla dokumentów sprawdzić tagi w wynikowym pliku. Nie dostarczono nowej demonstracji webowej ani dokumentowej, ponieważ mobilny przykład wystarcza do odtworzenia wybranej bariery.
Jak sprawdzić
- Ustal, co prezentacja przekazuje o strukturze i przypisaniu danych. Oczekiwany wynik dotyczy znaczenia, nie obecności słowa table.
- Porównaj widoczny nagłówek i kolumny z semantyką. W bad oczekiwany jest brak flagi nagłówka Fluttera i osobne wartości bez relacji w API.
- W good sprawdź bez zmiany wyglądu dwie pełne etykiety, właściwe ceny/czasy oraz nagłówek. W text sprawdź te same przypisania widoczne zdaniami. Reset ma odtworzyć początkowy wariant trasy.
- Osobno użyj rzeczywistego VoiceOver i rotora Nagłówki, odczytaj rekordy oraz sprawdź brak duplikatów. Zapisz wypowiedzi, ustawienia i wynik; to niewykonany plan źródłowy.
- Dla innych formatów skontroluj właściwy odbiornik i wynikowy dokument, bez wnioskowania o nich z mobilnego screenshotu.
Weryfikacja i ograniczenia
| Źródłowe sprawdzenie, 2026-10-02 | Wynik i granica |
|---|---|
| Treść i oficjalne API | Przegląd AI; człowiek niewykonany |
| Flutter | Analiza PASS, 12 testów PASS: nagłówek, granice semantyki, tekst, zmiana/reset. Material w starszych regresjach bez uruchomienia Androida |
| iOS | Build/instalacja PASS, 1 XCTest / 0 błędów; bad/good/text, etykiety, zmiana/reset |
| Obrazy i drzewa | AI obejrzało 3 PNG i porównało relacje; identyczny obraz bad/good, bez potwierdzenia rotora z traitu XCTest |
| SwiftUI | Typecheck PASS, SDK Simulator 27.0 / cel iOS 17, bez runtime |
| VoiceOver, brajl, fizyczny iPhone, człowiek | Niewykonane; urządzenie było offline; brak nagrania lub transkrypcji czytnika |
| Android, WWW, desktop, dokumenty, Compose i React Native | Runtime/kompilacja odpowiednich fragmentów niewykonane |
Wykonanie: Flutter 3.44.9 / Dart 3.12.2, iPhone 17 / iOS Simulator 26.5, Cupertino. Screenshoty zapewniają kontekst, widget testuje flagę i granice, a XCTest natywne etykiety. Żadne z nich nie jest testem rzeczywistego czytnika. Film zmiany wariantu nie potwierdziłby sam znaczenia relacji.
Reguła może wykryć brak znanego powiązania lub flagi, lecz obecność atrybutu nie potwierdza trafności. AI może porównać wizualną strukturę z API, bez pewności co do intencji ramki lub hierarchii całego procesu. Relacja może być poprawnie zapisana zdaniem. Bez potrzebnych danych wynik jest nierozstrzygnięty. Znane oczekiwania demonstracji muszą pozostać poza wejściem badanego walidatora; nie stanowią niezależnego dowodu jego skuteczności.
Jak sprawdza Clearship
Katalog z 2026-10-08 wymaga oceny człowieka. Reguła drzewa dostarcza kandydatów: nagłówek udostępniony tylko wyglądem, nienazwane pole bez powiązanej etykiety oraz opcje z widocznym pytaniem bez kontenera grupy. Sygnał nagłówka sondy Androida pomaga sprawdzić rolę; brak sygnału pozostaje do oceny. To ograniczone przypadki, bez ogólnego porównania prezentacji z całą programową strukturą lub równoważnym tekstem.
Pomiar reguły opisano dla Androida; iOS pozostaje niezmierzony. Drzewo nie potwierdza doświadczenia czytnika, a brak tabeli lub nagłówka w pojedynczym stanie nie rozstrzyga wymagania. Człowiek ocenia znaczące relacje i dopuszczoną drogę tekstową; bez tej oceny kryterium nie ma pełnego wyniku.