Co oznacza to kryterium
Gdy kolejność przechodzenia między kontrolkami wpływa na znaczenie lub wykonanie zadania, fokus powinien zachować te związki. Po otwarciu szczegółów następne przejście ma prowadzić do ich obsługi w logicznym miejscu. Kolejność może różnić się od układu wizualnego lub odczytu czytnika, jeżeli nadal zachowuje znaczenie i funkcjonalność.
Przewidywalna droga pomaga osobom korzystającym z klawiatury i przełączników dostarczających klawisze, osobom niewidomym, które nie obserwują układu, oraz słabowidzącym, gdy skok oddala fokus od powiększonego kontekstu. Ogranicza też dezorientację przy trudnościach z koncentracją. Swobodny odczyt czytnika pozostaje osobną sekwencją; tych korzyści nie badano na użytkownikach demonstracji.
Przykłady błędów i poprawek
Panel niemodalny: otwarcie, funkcja, zamknięcie
Własna demonstracja „Pracownia” we Flutterze ma dane #1042, ul. Przykładowa 10, kod 1042 i godziny 10:00–18:00. Good/bad zachowują tekst, UI, akcje i semantykę. Zmienia się priorytet przejścia klawiaturą: kontrolki panelu mają order 2/3 w good i 8/9 w bad; wyzwalacz 1, godziny 4, wybór 6, reset 7. Brak numeru 5 nie ma znaczenia normatywnego.
- Tab osiąga „Otwórz szczegóły odbioru”, Space ujawnia niemodalny panel. Fokus pozostaje na wyzwalaczu.
- W good następny Tab osiąga „Pokaż kod odbioru”, kolejny zamknięcie. Shift+Tab odtwarza drogę przez kod do wyzwalacza.
- Space na kodzie ujawnia 1042. Space na zamknięciu wraca do wyzwalacza; następny Tab omija zamknięty panel i osiąga godziny.

Surowy PNG iOS Simulator 26.5 z 2026-10-03. Kadr jest stanem sekwencji z historycznym logiem wejść.

Zamknięte kontrolki zniknęły z sekwencji Fluttera; bez dowodu fokusu FKA lub VoiceOver.
Panel osiągany dopiero po niezwiązanych kontrolkach
Bad po otwarciu pozostawia fokus na wyzwalaczu. Następne Tab prowadzą do godzin, wyboru wariantu i resetu; dopiero czwarty do kodu panelu, potem do zamknięcia. Użytkownik traci bezpośrednią drogę do wywołanej treści. Poprawka przywraca sąsiedztwo kontrolek panelu w sekwencji. Dotyk lub dojście po kilku niezwiązanych kontrolkach nie usuwa odtworzonej bariery.

Ten sam panel i dane, odmienna droga wejścia do kodu. Obraz sam nie mierzy tej drogi.
Bad nadal pozwala ujawnić kod, przejść wstecz close → code i zamknąć z powrotem do open. Nie tworzy celowej pułapki ani utraty funkcji; wybór/reset są kontrolkami laboratorium, bez alternatywnego dostępu do panelu. To własne odtworzenie bariery opisanej w F85, bez danych o jej częstości.
Inna kolejność niezależnych informacji
Control nie ma otwieranego panelu. Kod i godziny są stale dostępne jako niezależne funkcje. Wizualnie kod jest pierwszy, a Tab osiąga najpierw godziny, potem kod; oba działania ujawniają właściwe informacje, Shift+Tab wraca do godzin. Według oceny AI znaczenie i obsługa są zachowane. Sama różnica pozycji nie stanowi błędu.

Niezależne funkcje działają w obu kierunkach. Różna kolejność jest oceną kontekstu, bez przeglądu człowieka.
Kiedy obowiązuje i gdzie są wyjątki
Wymaganie ma dwa warunki: nawigacja sekwencyjna jest możliwa, a jej kolejność wpływa na znaczenie lub obsługę. Nie podaje osobnej listy wyjątków. Nawigacja sekwencyjna przechodzi do następnego elementu według porządku interfejsu klawiatury, np. Tab/Shift+Tab; nie obejmuje automatycznie każdej nawigacji przestrzennej strzałkami w siatce lub drzewie.
Fokus wejścia, kolejność odczytu/nawigacji czytnika i układ wizualny są odrębnymi danymi. W tabeli możliwy jest logiczny porządek wierszami lub kolumnami. Rozbieżność sama nie daje negatywnego wyniku; zbadaj relacje i wykonanie zadania. 1.3.2 dotyczy kolejności odczytu treści, a 2.4.3 elementów otrzymujących fokus.
Kryterium nie zakazuje fokusu na statycznym tekście. Nadmiarowe zatrzymania lub zagnieżdżone cele mogą jednak tworzyć mylącą sekwencję. Całkowicie pominięta funkcja wymaga również oceny 2.1.1.
Panel niemodalny może zachować fokus na wyzwalaczu, gdy następne przejście prowadzi do panelu. Modal wymaga właściwego wejścia do środka i wyłączenia tła z interakcji do zamknięcia; nie przenoś tego ograniczenia na panel niemodalny. Powrót ma być logiczny, bez wymogu wracania do usuniętego wyzwalacza.
G59 dotyczy relacji w interakcji, C27 zgodności DOM z układem, SCR26/SCR27 wstawienia lub przestawienia treści, H102 dialogu HTML, a PDF3 struktury i tab order dokumentu. To pomocnicze techniki, bez obowiązkowego API. F44 opisuje ręczny tabindex naruszający relacje; każda dodatnia wartość nie przesądza automatycznie wyniku. F85 obejmuje niedostępne wejście do nowego panelu lub błędny powrót. Nasza demonstracja jest własnym natywnym odtworzeniem pierwszej bariery.
Platformy
Klasyfikacja AI z 2026-10-03: WCAG 2.2 Recommendation 2024-12-12 dla stron, informacyjne WCAG2ICT Group Note 2025-12-11 poza kontekstem webowym. Adaptacja zastępuje stronę dokumentem lub oprogramowaniem; nie dodaje warunku zbioru ani wyjątku dla telefonu. Nie ustalano EN 301 549 ani obowiązków prawnych.
| Środowisko | Warunek | Wykonanie źródłowe |
|---|---|---|
| WWW, także telefon | Nawigacja sekwencyjna i wpływ kolejności na znaczenie lub obsługę. | Niewykonane. |
| Natywne mobile | Ten sam warunek w oprogramowaniu; telefon może odbierać klawisze bez własnej klawiatury fizycznej. | Tylko Flutter/iOS Simulator. |
| Desktop | Przejścia między polami, panelami i oknami zachowują zadanie. | Niewykonane. |
| Dokumenty | Sekwencja linków/pól, np. PDF, jeżeli wpływa na znaczenie lub obsługę; właściwy odbiornik. | Niewykonane. |
| Kiosk webowy lub natywny | Ten sam warunek, z podstawą właściwą części interfejsu; zamknięta funkcjonalność/sprzęt osobno. | Niewykonane. |
Brak nawigacji sekwencyjnej lub zależności od porządku może wyłączać konkretny scenariusz, bez wyłączenia platformy. Kontrola niezależnych informacji nie wyłącza całej aplikacji. Hybrydę oceniaj osobno w części webowej i natywnej; brak testu nie jest brakiem odpowiednika w normie.
Rozwiązania w technologiach
Flutter
import 'package:flutter/cupertino.dart';
// Fragment builda StatefulWidget; open/node/action są stanem istniejącego ekranu.
Column(children: [
CupertinoButton(focusNode: trigger, onPressed: showDetails,
child: const Text('Otwórz szczegóły odbioru')),
if (open) ...[
CupertinoButton(onPressed: showCode, child: const Text('Pokaż kod odbioru')),
CupertinoButton(onPressed: closeDetails, child: const Text('Zamknij szczegóły')),
],
CupertinoButton(onPressed: showHours, child: const Text('Pokaż godziny punktu')),
]);
// Po zamknięciu: trigger.requestFocus(); trigger jest trwałym FocusNode,
// tworzonym poza buildem i zwalnianym w dispose.Fragment builda StatefulWidget korzysta ze stanu i akcji istniejącego ekranu. Wstawienie panelu obok wyzwalacza zwykle wystarcza przy domyślnej polityce. Trwały trigger FocusNode twórz poza buildem i zwalniaj w dispose; po zamknięciu przywróć nim fokus. W pełnej demonstracji FocusTraversalOrder/NumericFocusOrder pod OrderedTraversalPolicy izolują priorytety, z resetem i dispose. Semantics.sortKey steruje inną sekwencją. Dokumentacja, analiza/build pełnej demonstracji i jej iOS PASS 2026-10-03; powyższy skrót nie jest samodzielną aplikacją.
Android / Compose
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@Composable
fun PickupDetails(open: Boolean, show: () -> Unit, code: () -> Unit,
close: () -> Unit, hours: () -> Unit) {
Column {
Button(onClick = show) { Text("Otwórz szczegóły odbioru") }
if (open) {
Button(onClick = code) { Text("Pokaż kod odbioru") }
Button(onClick = close) { Text("Zamknij szczegóły") }
}
Button(onClick = hours) { Text("Pokaż godziny punktu") }
}
}Osadź ze stanem i callbackami ekranu. Tab/Shift+Tab są jednowymiarowe; D-pad/strzałki to osobna geometria. W niestandardowym układzie trwały FocusRequester i focusProperties next/previous mogą ustawić oba kierunki. Po usunięciu kontrolki przywróć wyzwalacz po aktualizacji drzewa. traversalIndex dostępności nie naprawia klawiatury. Dokumentacja PASS; kompilacja i działanie niewykonane.
iOS / SwiftUI
import SwiftUI
struct PickupDetails: View {
@State private var open = false
let code: () -> Void
let hours: () -> Void
var body: some View {
VStack {
Button("Otwórz szczegóły odbioru") { open = true }
if open {
Button("Pokaż kod odbioru", action: code)
Button("Zamknij szczegóły") { open = false }
}
Button("Pokaż godziny punktu", action: hours)
}
}
}VStack porządkuje drzewo, lecz nie dowodzi Tab w docelowym trybie iOS. Sprawdź fokus po wstawieniu/usunięciu i powrót. FocusState/focused, AccessibilityFocusState i accessibilitySortPriority dotyczą różnych aspektów, bez jednej uniwersalnej sekwencji; ostatnia właściwość ustawia elementy dostępności na tym samym poziomie, wyższa wartość wcześniej. Modal prezentuj właściwym mechanizmem systemowym. Dokumentacja PASS; SwiftUI nie kompilowano ani nie uruchamiano. XCTest tego researchu sterował Flutterem.
React Native
import React, { useState } from 'react';
import { View, Button } from 'react-native';
export function PickupDetails({
code,
hours,
}: {
code: () => void;
hours: () => void;
}) {
const [open, setOpen] = useState(false);
return (
<View>
<Button title="Otwórz szczegóły odbioru" onPress={() => setOpen(true)} />
{open && (
<View>
<Button title="Pokaż kod odbioru" onPress={code} />
<Button title="Zamknij szczegóły" onPress={() => setOpen(false)} />
</View>
)}
<Button title="Pokaż godziny punktu" onPress={hours} />
</View>
);
}Drzewo zachowuje sąsiedztwo. Nie scalaj interaktywnego panelu przez accessible=true; zbadaj rzeczywistą sekwencję i powrót w hoście. Core nie daje uniwersalnego webowego tabindex. experimental_accessibilityOrder jest eksperymentalne, odradzane produkcyjnie i wyczerpujące: pominięte elementy tracą dostęp AT. Nie używaj go jako naprawy Tab. Dokumentacja PASS; typecheck i działanie niewykonane.
Jak sprawdzić
- Ustal funkcje, stan początkowy i związki wymagające kolejności. Przejdź w przód i w tył, zapisując klawisz, cel fokusu i efekt. Nie wymuszaj automatycznie porządku geometrycznego.
- Otwórz panel klawiaturą. Sprawdź fokus po otwarciu i następny krok; w tej demonstracji pozostaje wyzwalacz, a następny Tab ma osiągnąć kod.
- Wykonaj funkcję, zamknij i sprawdź logiczny powrót oraz usunięcie zamkniętych celów. Zbadaj też przejścia wstecz w otwartym panelu; reset nie zastępuje zamknięcia.
- Osobno zbadaj niezależną kontrolę i docelowy tryb sterowania. Jeżeli deklarujesz odbiór AT/FKA/przełączników, potrzebujesz rzeczywistego przebiegu tych trybów. Fokus Fluttera ani snapshot drzewa go nie potwierdzają.
Weryfikacja i ograniczenia
Historyczne wykonanie 2026-10-03: iPhone 17 Simulator, runtime iOS 26.5, Flutter 3.44.9 / Dart 3.12.2, Xcode 27.0 (27A266a), SDK Simulator 27.0. Pion, light/large odczytane z simctl, PNG 1206 × 2622. SDK i runtime mają różne wersje. Bez fizycznego iPhone’a lub Androida.
| Sprawdzenie | Rzeczywisty wynik źródła |
|---|---|
| Analiza/host/build | Analiza PASS, 18 testów hostowych PASS, build aplikacji i drivera iOS PASS. |
| XCTest | Dwa testy PASS, zero failures, 287,386 s; 00:39:50.885–00:44:38.277 CEST. |
| Good | Open → code → close; reverse close → code → open; działający kod, zamknięcie → open, Tab → hours. PASS przepływu. |
| Bad | Hours → variant → reset → code → close po otwarciu; reverse i zamknięcie działają. Bariera wejścia odtworzona. |
| Control | Hours → code, oba stany ujawnione, reverse do hours. PASS działania; sens kolejności oceniony przez AI. |
| Wejście i dowody | 46 instrumentowanych żądań Tab/Shift+Tab/Space z niesyntetyzowanym odbiorem HID, 29 próbek primary focus/przejść; sześć PNG i sześć drzew XCTest, kontrola hashów PASS. |
| Reset/fallback i wcześniejszy smoke | Natywny wybór/reset PASS; fallback hostowy do good, reset hosta z pomocniczym tap. Smoke 2.1.1 Tab/Space ma dwa dodatkowe klawisze poza ledgerem tej próby. |
Pierwszy build wywołano z root repo bez pubspec; zachowany FAIL polecenia nie jest awarią aplikacji. Po zmianie katalogu build przeszedł. Dostęp CoreSimulator wymagał eskalacji sandboxu; nie instalowano SDK ani nie zmieniano ustawień dostępności. Czasy końca logów z mtime nie są pomiarem trwania XCTest.
PNG i debugDescription pokazują stany, bez dowodu kolejności Tab lub wypowiedzi VoiceOver. Sekwencję wiążą żądania wejścia, odebrane klawisze i FocusManager.primaryFocus. Ten fokus należy do Fluttera, bez potwierdzenia systemowego FKA/AT. Zegary procesu XCTest i odczyty Fluttera nie mierzą opóźnienia użytkowego ani płynności; UTC próbki zapisano przed tree/PNG.
Deterministyczna kontrola zna oczekiwania tej demonstracji. Drzewo i geometria mogą wskazać podejrzany porządek, bez oceny znaczenia zadania. AI może błędnie odrzucić niezależne sekcje, inny logiczny porządek tabeli lub prawidłowe miejsce powrotu. Wyklucz węzeł obserwatora, wariant trasy, metadane i oczekiwania testu z niezależnej walidacji; obserwator HardwareKeyboard tylko czyta i zwraca false.
Jak sprawdza Clearship
Metoda z 2026-10-07 porównuje na Androidzie rzeczywistą sekwencję Tab z celami osiągalnymi Shift+Tab i grupami pól pod wspólnym nagłówkiem. Wskazuje przedwczesne powtórzenie, przeplot grup oraz odwrócony porządek pól grupy. Inne różnice względem układu, np. niezależne przyciski, trafiają do człowieka.
Pomiar kontrolny wykrył 5 z 6 usterek, bez fałszywych alarmów na 74 poprawnych ekranach; próg niespełniony, wynik wymaga człowieka. iOS nie ma przejścia klawiatury P4 ani pomiaru tej metody. Researchowa próba iOS nie jest wykonaniem analizatora produktu.
Grupy wynikają z tekstów i geometrii. Zależności bez nagłówków, związki pola z przyciskiem, dynamiczne panele i powroty poza trasą mogą pozostać niewykryte. Sekwencja zgodna z układem nie potwierdza odczytu czytnika. Brak fokusu, błąd klawisza, przerwana lub ograniczona seria pozostają luką pokrycia.