Co oznacza to kryterium
Osoba korzystająca z klawiatury musi widzieć, na jaki element właśnie przeszła. Automatyczny banner lub nakładka nie może całkowicie zakryć tego elementu. W AA wystarczy, że część komponentu pozostaje widoczna; dobrą praktyką jest odsłonięcie go w całości. Sam widoczny obrys poza całkowicie ukrytym przyciskiem nie usuwa tego błędu.
| Potrzeba / ID | Bariera i korzyść |
|---|---|
Ograniczenia ruchowe / motor |
Osoba korzystająca z klawiatury, przełączników lub innego interfejsu klawiaturowego widzi miejsce następnej aktywacji. |
Słabowidzenie / low-vision |
Nakładki zabierają istotną część powiększonego widoku; widoczny komponent pozwala odnaleźć bieżący punkt interakcji. |
Pamięć i koncentracja / cognitive |
Znikający cel może wyglądać jak brak reakcji aplikacji; jego widoczność ogranicza konieczność zapamiętywania kolejności kontrolek. |
Przykłady błędów i poprawek
Pracownia pokazuje informację „Odbiór dzisiaj do 18:00.” i przyciski „Pokaż adres” oraz „Pokaż godziny” dla P-104. Space na adresie zwiększa licznik i wyświetla „P-104: ul. Przykładowa 12. Wyświetlenia: 1.” Dane, cel, callbacki i kolejność kontrolek są wspólne; istotna różnica to umieszczenie powiadomienia względem treści.
| Wariant | Bariera / poprawka | Oczekiwana ocena celu |
|---|---|---|
bad |
Nieprzezroczysta nakładka autora jest nad przyciskiem; klawiatura nadal ustawia fokus i uruchamia akcję. | Cały komponent ukryty — błąd 2.4.11 |
good |
iOS: banner w zwykłej kolumnie przesuwa przyciski. WWW: miejsce pod stopką i scroll-padding pozwalają przeglądarce odsłonić cel. |
Komponent całkowicie widoczny |
control |
Niższa/przesunięta nakładka pozostawia część tego samego komponentu widoczną. | 2.4.11 AA przechodzi w tym stanie; 2.4.12 AAA nie |
Powiadomienie pojawia się od początku, bez aktywnego otwarcia regionu. Uwaga 2 nie ma zastosowania. Nie dodano pułapki, usuwania fokusu ani blokady Space w bad. Kontrola nie demonstruje prawidłowego wyglądu całego ekranu: pozostaje celowo częściowo zasłonięta.

Good po Tab: powiadomienie ma osobne miejsce nad przyciskiem, a cały Pokaż adres pozostaje widoczny. Surowy screenshot XCTest z 2026-10-04; Flutter/iOS Simulator.

Bad po Tab: przycisk jest całkowicie zakryty. Fragment zewnętrznego obrysu po bokach i nazwa w drzewie nie odsłaniają komponentu. Surowy kadr iOS Simulator z 2026-10-04.

Control po Tab zachowuje górną połowę przycisku, z zakrytym dołem. Surowy kadr iOS Simulator z 2026-10-04 ilustruje minimum AA; częściowe odsłonięcie nie jest celem projektowym.
Dodatkowe scenariusze, opisane bez wykonania: automatyczny toast nad celem — przenieść powiadomienie lub przewinąć cel przed zasłonięciem; panel narzędzi — poprawić pozycję początkową; chat otwarty przez użytkownika — sprawdzić odsłonięcie przez Escape przy zachowanym fokusie; dialog — rzeczywiście przejąć fokus do widocznej zawartości. Nie przypisujemy im PASS na podstawie bieżącego fixture.
Przewinięcie ponad stopkę

Good po rzeczywistym Tab: przeglądarka przewinęła adres nad stopkę. JPEG Codex/macOS z 2026-10-04; pozostałe narzędzia demonstracji pod stopką nie są objęte wynikiem.
Kiedy obowiązuje i gdzie są wyjątki
Oceniany jest komponent przy otrzymaniu fokusu klawiatury, czyli postrzegana pojedyncza kontrolka pełniąca odrębną funkcję. Nie utożsamiaj komponentu z dowolnym węzłem DOM/AX. Jego widoczna treść, tło i granica pomagają ustalić obszar. Zewnętrzny wskaźnik nie wchodzi do komponentu w tym sprawdzeniu; wskaźnik wewnętrzny albo zmiana wyglądu samego komponentu może się do niego zaliczać.
Całkowite zasłonięcie narusza AA. Częściowe zasłonięcie może spełniać 2.4.11, choć nie spełnia AAA 2.4.12 — Focus Not Obscured (Enhanced). AA nie ustanawia tu progu procentowego widocznej powierzchni. Widoczna niewielka część nie jest rekomendowanym celem projektowym ani dowodem spełnienia innych kryteriów.
Uwaga 1 — regiony przemieszczane przez użytkownika: oceniamy początkowe położenie takich regionów w konfigurowalnym interfejsie. Nie oceniamy każdej pozycji, do której użytkownik sam przeciągnie panel. Nie jest to zwolnienie dla źle umieszczonego panelu początkowego ani każdej nakładki.
Uwaga 2 — treść aktywnie otwarta przez użytkownika: region celowo pozostający otwarty może zasłonić kolejny cel, jeżeli użytkownik może go odsłonić bez przesuwania fokusu dalej i bez powrotu do kontrolki zamknięcia. Przykładowo Escape zamyka chat, klawisze przewijają widok przy zachowanym celu albo polecenie zmienia kolejność warstw. Nie rozszerzamy tego na automatycznie wyświetloną stopkę, banner lub ostrzeżenie; ich cel musi być niecałkowicie ukryty już przy otrzymaniu fokusu. Nieprzetrwałe menu, combobox czy tooltip powinny odpowiednio znikać po zakończeniu interakcji; samo nazwanie ich „otwartymi przez użytkownika” nie uzasadnia pozostawienia zasłaniającej warstwy.
Poprawny modal przejmuje rzeczywisty fokus do widocznego komponentu i utrzymuje interakcję w swojej treści do zamknięcia. Sama nazwa modal lub rola dialog nie dowodzi tego zachowania. W tej demonstracji nie ma modalu, przemieszczalnego panelu ani wyjątku uwagi 2 — te przypadki opisano, ale nie odtworzono.
Przezroczystość, przyciemnienie i blur wymagają oceny rzeczywistego obrazu. Jeżeli komponent nadal widać, nie jest całkowicie ukryty z samego powodu nakładania ramek; kontrast może jednak wymagać osobnego sprawdzenia. Klawiatura ekranowa OS i nakładka user agenta nie są automatycznie treścią autora; rozróżnij pochodzenie warstwy i właściwą odpowiedzialność poza kontekstem webowym.
Brak obrysu sam w sobie należy do 2.4.7 — Widoczny fokus, a nie automatycznie do 2.4.11. AAA 2.4.13 — Focus Appearance opisuje wygląd fokusu. 1.4.11 ma własny zakres kontrastu. Dostępność aktywacji i wyjścia oceniają także 2.1.1 i 2.1.2.
Technika, błąd i ACT
Understanding sprawdzono w całości: aktualizacja 2026-06-15. Techniki i opis błędu są pomocnicze, nie normatywne:
- C43, aktualizacja 2025-09-25:
scroll-paddingwyznacza obszar dla odsłaniania komponentu. Potrzebne jest również rzeczywiste miejsce na przewijanie, np. padding dokumentu, i wysokość dostosowana do nakładki. Dekoracyjne CSS bez takiego miejsca nie wystarcza. Przykład W3C przechodzi z fixed do przepływu przy małym widoku około 800 px; nasz próg obejmuje szerokości do 800 px włącznie. Test #1 dotyczy całkowitego zasłonięcia/AA; test #2 również częściowego/AAA. - F110.html, aktualizacja 2025-07-15: sticky nagłówek lub stopka całkowicie ukrywa komponent otrzymujący fokus. Procedura przechodzi klawiaturą w obie strony. Własny WWW odtwarza stopkę fixed; mobilna nakładka jest analogią tego zasłaniania, nie identycznym CSS.
- ACT: aktualny katalog sprawdzony 2026-10-04 nie zawiera reguły dla 2.4.11. Reguła widocznego fokusu dla 2.4.7 nie staje się regułą zasłonięcia 2.4.11. Nasz checker bada fixture i integralność materiału; nie jest wykonaniem ACT ani niezależnym walidatorem.
Platformy
| Środowisko / ID | Podstawa, wersja, kryterium | Stan i adaptacja | Warunek, zakres, uzasadnienie | Weryfikacja |
|---|---|---|---|---|
WWW / web |
WCAG 2.2 Recommendation 2024-12-12, 2.4.11 | dotyczy warunkowo / bez zmiany wymagania | Komponent otrzymuje fokus klawiatury; dotyczy również przeglądarki telefonu. Treść autora może go zasłonić niezależnie od nazwy użytej biblioteki. | AI, 2026-10-04; wykonany minimalny WWW |
Aplikacje mobilne / mobile |
WCAG2ICT 2.2 Group Note 2025-12-11, 2.4.11 | dotyczy warunkowo / bez zmiany wymagania | Natywna aplikacja z fokusem klawiatury, np. podłączona klawiatura lub odpowiedni interfejs sterowania. Dotykowy charakter telefonu nie wyłącza kryterium. | AI, 2026-10-04; wykonany Flutter/iOS Simulator |
Aplikacje desktopowe / desktop |
WCAG2ICT 2.2 Group Note 2025-12-11, 2.4.11 | dotyczy warunkowo / bez zmiany wymagania | Panele i paski narzędzi autora nie mogą całkowicie ukrywać komponentu otrzymującego fokus. Dla przemieszczalnych regionów uwaga 1 ogranicza ocenę do pozycji początkowej. | AI, 2026-10-04; runtime NOT-RUN |
Dokumenty cyfrowe / document |
WCAG2ICT 2.2 Group Note 2025-12-11, 2.4.11 | dotyczy warunkowo / bez zmiany wymagania | Link, pole formularza lub inna kontrolka dokumentu otrzymuje fokus; oceniamy zasłonięcie treścią dokumentu. Statyczny akapit nie jest takim komponentem; nakładka czytnika dokumentu wymaga ustalenia odpowiedzialnej warstwy. | AI, 2026-10-04; odbiornik dokumentu NOT-RUN |
Inne urządzenia / other |
WCAG2ICT 2.2 Group Note 2025-12-11, 2.4.11 | dotyczy warunkowo / bez zmiany wymagania | Oprogramowanie wizualnego kiosku z przemieszczanym fokusem. Najpierw ustalamy, czy istnieje taki fokus i komponent, oraz kto tworzy nakładkę; tabela nie ocenia sprzętu. | AI, 2026-10-04; runtime NOT-RUN |
WCAG2ICT stosuje 2.4.11 bez zmiany brzmienia, jako informacyjną interpretację poza WWW, nie osobną normę zgodności. Nie analizowano EN 301 549 ani obowiązków prawnych. Brak testu innej platformy nie oznacza jej wyłączenia; w hybrydzie rozróżniamy część natywną i webową.
Rozwiązania w technologiach
Przegląd oficjalnej dokumentacji: AI 2026-10-04. Fragmenty edukacyjne zakładają lokalny podgląd adresu, a nie wysłanie zamówienia. Sama poprawna geometria przykładu nie potwierdza wszystkich kombinacji tekstu, rozmiaru okna i dynamicznych powiadomień.
Flutter
Umieść powiadomienie w przepływie, zamiast rysować je nad kontrolkami w Stack. Poniżej kontekst CupertinoApp; onShow jest callbackiem tej samej funkcji.
import 'package:flutter/cupertino.dart';
Widget pickup(VoidCallback onShow) => SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Text('Odbiór dzisiaj do 18:00.'),
CupertinoButton(
onPressed: onShow,
child: const Text('Pokaż adres'),
),
],
),
);Powiadomienie zajmuje własną wysokość. W ekranie z paskiem fixed można również ograniczyć viewport przewijania do obszaru nad paskiem albo prawidłowo zarezerwować jego zmienną wysokość; samo systemowe SafeArea nie mierzy każdej nakładki autora. Dokumentacja/przegląd lokalnego SDK wykonane; pełna demonstracja analizowana, zbudowana i testowana na iOS. Fragment MD nie był osobnym buildem. Android NOT-RUN.
iOS / SwiftUI
import SwiftUI
struct PickupView: View {
let onShow: () -> Void
var body: some View {
VStack(spacing: 12) {
Text("Odbiór dzisiaj do 18:00.")
ScrollView {
Button("Pokaż adres", action: onShow)
}
}
}
}VStack przydziela osobne miejsce powiadomieniu i przewijanej treści. Alternatywą dla nakładki jest poprawnie dobrany safeAreaInset, który zmniejsza dostępną przestrzeń, zamiast samo overlay; sprawdź docelowe zachowanie fokusu klawiatury i zmiany tekstu. Dokumentacja: sprawdzona. Kompilacja/typecheck i runtime tego fragmentu NOT-RUN; build Fluttera nie potwierdza SwiftUI ani Full Keyboard Access.
Android / Compose
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@Composable
fun Pickup(onShow: () -> Unit) {
Scaffold(bottomBar = { Text("Odbiór dzisiaj do 18:00.") }) { insets ->
Column(Modifier.padding(insets).verticalScroll(rememberScrollState())) {
Button(onClick = onShow) { Text("Pokaż adres") }
}
}
}Zastosuj przekazane przez Scaffold PaddingValues do korzenia treści. Inaczej sam bottomBar nie zapobiega rysowaniu kontrolki pod nim. Dodatkowe warstwy autora, fokus i przewijanie wymagają sprawdzenia w docelowym produkcie. Dokumentacja: sprawdzona; kompilacja i runtime NOT-RUN, bez osobnej aplikacji Androida i wersji zależności, której nie użyto.
React Native
import { Button, ScrollView, Text, View } from 'react-native';
export function Pickup({ onShow }: { onShow: () => void }) {
return (
<View style={{ flex: 1 }}>
<ScrollView style={{ flex: 1 }}>
<Button title="Pokaż adres" onPress={onShow} />
</ScrollView>
<View>
<Text>Odbiór dzisiaj do 18:00.</Text>
</View>
</View>
);
}Kontekst: rodzic ekranu ma ograniczoną wysokość. Powiadomienie pozostaje zwykłym sąsiadem ScrollView, zajmuje miejsce i zmniejsza jego viewport. Systemowe contentInset/automatyczne insets klawiatury nie są samodzielnym pomiarem nakładki autora. Sprawdź obsługę klawiatury przez użyty komponent docelowej platformy. Dokumentacja: sprawdzona; kompilacja/typecheck i runtime NOT-RUN.
HTML / CSS / JavaScript
:root {
--notice-height: 180px;
--space: calc(var(--notice-height) + 20px);
}
body {
padding-bottom: var(--space);
}
html {
scroll-padding-bottom: var(--space);
}
.notice {
position: fixed;
inset: auto 0 0;
}
@media (max-width: 800px) {
.notice {
position: static;
}
body {
padding-bottom: 0;
}
html {
scroll-padding-bottom: 0;
}
}Kontekst: przycisk w przewijanym dokumencie, nakładka .notice; wysokość --notice-height aktualizowana rzeczywistym ResizeObserver, jak w pełnym fixture. Stałe 180 px w samym skrócie nie są rozwiązaniem dowolnie wysokiego banneru. Padding zapewnia miejsce, scroll-padding odpowiedni obszar przewijania; nie zastępują testu Tab/Shift+Tab, końca dokumentu i breakpointów. Wykonano pełny HTML/CSS/JS przez rzeczywistą przeglądarkę; składnia JS sprawdzona, bez oddzielnego procesu kompilacji HTML.
Jak sprawdzić
- Ustal komponent, pochodzenie nakładki, warunek klawiatury i wyjątki. Nie porównuj tylko prostokątów AX ani samego obrysu.
- Otwórz scenariusz w początkowym układzie. Przejdź rzeczywistymi Tab i Shift+Tab, zapisując fokus, ramki, warstwy oraz obraz przy otrzymaniu fokusu. Nie ustawiaj celu testowym setterem po jego odsłonięciu.
- Dla każdego badanego celu ustal, czy jest całkowicie ukryty przez treść autora. Częściowe zasłonięcie oddziel od AA i AAA. Uwzględnij opacity, z-order, clipping, blur i widoczną treść komponentu.
- Gdy rozważasz uwagę 2, potwierdź aktywne otwarcie utrzymującego się regionu przez użytkownika i odsłonięcie bez zmiany celu fokusu. Sam możliwy powrót Tab do zamknięcia nie wystarcza.
- Dla poprawki przewijania sprawdź prawdziwe miejsce na końcu treści, zmienną wysokość powiadomienia, oba kierunki i breakpoint. CSS deklaracja bez obserwacji nie jest PASS.
- Uruchom zwykłą akcję celu oraz sprawdź wyjście, cykl i reset. Zapisz oczekiwany oraz faktyczny wynik osobno; bad może pozostawać operowalny, a mimo to naruszać zasłonięcie.
Zaobserwowany zakres: przycisk adresu w trzech wariantach, oba kierunki i aktywacja; godziny jako następny cel, reset/fallback; dodatkowo WWW 800 px. Nie badano wszystkich okien, systemowych ustawień ani konfiguracji powiększenia. Przebadany good spełnia warunek w zapisanych otrzymaniach fokusu; nie oznacza zgodności całej aplikacji.
Weryfikacja i ograniczenia
Wyniki, pochodzenie i nieudane próby
| Sprawdzenie | Zaobserwowany wynik i zakres |
|---|---|
| Analiza Flutter | PASS |
| Istniejąca host suite bez Androida | PASS, 67 testów; nie zastępuje testu tego komponentu na iOS |
| Build aplikacji iOS | PASS |
| Build świeżego drivera | PASS; ukończony przed install |
| Jedyny XCTest iOS | PASS, 1 test/0 failures, 68,998 s; całość 167,877 s; marker runtime potwierdzony |
| WWW | Rzeczywiste good/bad/control, oba kierunki, Space, cykl/reset/fallback i width 800; ocena AI wybranego zasłonięcia, bez deklaracji zgodności całej strony |
| Integralność, RGB, linki | Kontrola integralności i pomiarów znanej pary; nie ACT |
| Człowiek / zaślepiony walidator | NOT-RUN |
Jedna natywna próba: 2026-10-04, iPhone 17 Simulator / iOS 26.5, Flutter 3.44.9 / Dart 3.12.2, Xcode 27.0; SDK 27.0 jest odrębne od runtime 26.5. XCTest wysłał Tab, Shift+Tab i Space, odebrane przez aplikację jako KeyDown/KeyUp bez synthesized. Obserwowano rzeczywisty primary focus oraz geometrię przy otrzymaniu fokusu. Wszystkie warianty pozwoliły uruchomić adres; bad izolował zasłonięcie, bez pułapki i blokady klawisza.
Good miał przycisk 24,321,354,52 i banner 24,233,354,80 logical px. Bad: przycisk 24,241,354,52 pod nieprzezroczystym bannerem 24,233,354,68. Control zasłaniał dolne 26 logical px. W testowanym pasie PNG bad miał 13 104 piksele banneru; control połowę tego pasa, a good zachował tło przycisku. To kontrola konkretnej pary, nie próg WCAG ani ogólna segmentacja komponentów.
W przeglądarce 1280×720 good rezerwował 200 CSS px pod stopką o wysokości 180 px oraz scroll-padding 200 px. Pierwszy Tab przewinął scrollY 0 → 359 i odsłonił cel nad nakładką. Bad pozostał całkowicie ukryty; control zachował 7,25 CSS px wysokości komponentu. Oba kierunki i Space odtworzono. Przy szerokości 800 px stopka przechodziła do przepływu, padding i scroll-padding wynosiły 0. Po przywróceniu szerokości zachowano późniejsze zasłonięcie istniejącego fokusu, bez nowego otrzymania fokusu i bez rozszerzania wyniku na każdy resize.
pointer-events:none przepuszczał wejście, a hit-test wskazywał przycisk również w bad. Nie dowodzi to widoczności: wymagane są warstwy, style i obraz. paintOrder pozostało puste; kolejność potwierdzają kod Stack i obraz, bez przypisywania nieistniejącego pomiaru.
Nie było FAIL lub przerwania XCTest. Dwa odczyty webowe miały AX i obraz bez DOM z powodu niepełnego callbacku; zachowano je jako historię, nie kompletne próbki. Ograniczenia sandboxu/cache SDK, odczytu ps i nieobsługiwanej jakości obrazu były błędami przygotowania, nie wynikiem aplikacji. Końcowe 19 stanów/drzew i 18 wejść iOS oraz 28 AX (26 DOM) i 25 akcji webowych nie są testem czytnika ani ciągłą obserwacją między próbkami. Filmu i audio nie wykonano.
Granice oceny
Deterministyczny checker może porównać known fixture, zdarzenia, ramki, piksele i hashe. Nie ustala automatycznie pochodzenia każdej nakładki, postrzeganej granicy komponentu lub wyjątku aktywnie otwartego regionu. Drzewo to przybliżenie: całkowicie zakryty przycisk nadal istnieje w AX, a hit-test może go zwracać. Ocena AI obrazu jest oddzielna od pomiaru i przeglądu człowieka. Niepełny obraz/stan oznacza brak danych, nie spełnienie kryterium.
Manifest oczekiwanych wariantów jest poza wejściem przyszłego badanego walidatora. Obecny fixture/checker nie jest zaślepiony ani niezależnym benchmarkiem. Wynik kontroli dotyczy integralności i tej pary, nie skuteczności wykrywania dowolnej aplikacji.
NOT-RUN: przegląd człowieka; zaślepiony walidator; AT/VoiceOver/przełączniki; fizyczny iPhone i sprzętowa klawiatura; Android, desktop, kiosk i odbiornik dokumentu; własne fragmenty SwiftUI/Compose/RN i niewykonane ustawienia OS; modal, użytkownikowe przemieszczanie i aktywnie otwarty region z uwagi 2. Nie są to FAIL ani wyłączenia platform. Brak buildów innych frameworków jest uzgodnionym zakresem, nie automatycznym TODO.
Jak sprawdza Clearship
Clearship sprawdza na Androidzie element otrzymujący fokus w przejściu klawiaturowym. Łączy pokrycie jego ramy innymi węzłami z porównaniem obrazu; osobno rozpoznaje region otwarty przez użytkownika i odsłonięty przez Escape bez zmiany fokusu. Progi techniczne analizatora są heurystyką, a nie procentowym minimum WCAG.
Metoda spełniła próg kontrolny Androida 7 października 2026 r. w ograniczonym zbiorze przypadków. Nie obejmuje wszystkich stanów, pozycji przemieszczanych paneli, osobnej treści webowej ani nakładek poza drzewem aplikacji. Nieosiągnięte komponenty, brak obrazu i niepotwierdzone warstwy wymagają człowieka. iOS nie ma dostępnego przejścia klawiaturowego produktu i jest niezbadany. Wynik bez problemów dotyczy jedynie faktycznie ocenionego zakresu bez pominięć.