2.2.2Poziom A

Wstrzymaj, zatrzymaj, ukryj

Pause, Stop, Hide

Automatyczny ruch ponad pięć sekund i automatyczne aktualizacje obok innych treści wymagają odpowiedniej kontroli, chyba że są niezbędne.

Komu pomaga
Pamięć i koncentracjaSłabowidzenieNiewidzenie
Zastosowanie
WWWAplikacje mobilneAplikacje desktopoweDokumenty cyfroweInne urządzenia

Warunki i wyjątki opisano w artykule.

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

Co oznacza to kryterium

Automatyczny ruch, miganie lub przewijanie trwające ponad pięć sekund obok innych treści wymagają możliwości wstrzymania, zatrzymania lub ukrycia. Automatyczne aktualizacje obok innych informacji wymagają kontroli bez progu pięciu sekund; można też pozwolić ustawić częstotliwość. Wyjątek dotyczy niezbędnej części czynności.

Pauza pomaga osobom z trudnościami koncentracji i pamięci oraz osobom słabowidzącym, które potrzebują spokojnie odczytać treść. Zastępowanie informacji może też utrudniać pracę czytnikiem osobom niewidomym. To uzasadnienie potrzeby, bez wyniku VoiceOver z opisanej demonstracji.

Przykłady błędów i poprawek

Dwie niezależne pauzy i dalsza praca

Własna „Pracownia” pokazuje syntetyczne zamówienie #1042, godziny pon.–pt. 9:00–17:00 i adres ul. Przykładowa 10. Obok godzin przesuwa się „Odbierz paczkę do piątku”, a co około 2 sekundy zmienia się odczyt liczby paczek, zaczynając od 4. Ruch obejmuje 80 pt w jedną stronę przez 4 s, potem powrót, bez błysków lub zmian jasności.

Problem
W bad komunikat i licznik zmieniają się automatycznie, bez dostępnej pauzy i bez niezbędności.
Skutek
Ruch rozprasza podczas odczytu godzin, a zmieniany tekst narzuca tempo czytania.
Poprawka
Dodaj działające kontrole ruchu i aktualizacji. Pauza ma trwać po odejściu od kontrolki, pozwalając nadal używać adresu.

Good ma te same dane i źródła zmian, lecz dwie nazwane kontrole. W bad wybór wariantu i reset są zablokowane do naturalnego końca, aby nie tworzyły ukrytej pauzy. Koniec po 90 s nie usuwa bariery ponad pięciu sekund; zakończenie procesu w laboratorium nie jest kontrolą treści.

  1. Po wejściu do good ruch i aktualizacje zaczynają się automatycznie. Obserwacja źródłowa potwierdziła zmiany również po ponad 6 s.
  2. „Wstrzymaj ruch” zatrzymuje pozycję, a licznik nadal rośnie.
  3. „Wstrzymaj aktualizacje” zatrzymuje odczyt. „Pokaż adres” nadal ujawnia adres, bez wznowienia któregokolwiek źródła zmian.
  4. Ponad 7 s później oba stany nadal są wstrzymane. Użytkownik nie trzyma palca ani fokusu na pauzie.
  5. „Wznów ruch” uruchamia kartę, pozostawiając licznik zatrzymany. Osobne „Wznów aktualizacje” kontynuuje przyrost bez nadrabiania.

Kadry i cichy film pochodzą z rzeczywistego Flutter/Cupertino na iPhone 17 Simulator / iOS 26.5, 2026-10-02. Odczyty są lokalną symulacją, bez aktualnego stanu punktu.

Pracownia good przy automatycznych zmianach: odczyt 4, kontrole Wstrzymaj ruch i Wstrzymaj aktualizacje.

Stan początkowy. Nieruchomy kadr nie dowodzi ruchu; dowód jest w sekwencji, filmie i pomiarze.

Good po obu pauzach: odczyt 12, przyciski wznowienia i ujawniony adres ul. Przykładowa 10.

Po co najmniej 7 s odczyt i pozycja pozostały stałe. Sam PNG nie jest pomiarem czasu.

Pracownia bad: odczyt 7, brak pauz i nieaktywne ustawienia przykładu.

Te same dane oraz logika zmian. Numer odczytu różni się przez czas przechwycenia; kadry nie są atomową parą.

Pełny opis cichego filmu

Istniejący eksport H.264, 37,866667 s, bez audio. Film pokazuje ruch i dotknięcia, bez nagrania czytnika. Normalizacja do 60 fps nie odzyskuje brakujących klatek.

  • 0–15 s: komunikat przesuwa się nad kontrolami, liczba paczek rośnie, godziny pozostają stałe.
  • Około 15 s: dotknięcie „Wstrzymaj ruch” zatrzymuje kartę; licznik nadal się zmienia.
  • Około 21 s: „Wstrzymaj aktualizacje” zachowuje odczyt 12 i 16 paczek; tekst informuje o wstrzymaniu.
  • Około 22 s: „Pokaż adres” ujawnia ul. Przykładową 10. Reszta interfejsu działa, obie pauzy trwają.
  • Około 30 s: „Wznów ruch” uruchamia kartę; licznik pozostaje zatrzymany.
  • Około 32 s: „Wznów aktualizacje” przywraca przyrost; końcowy odczyt to 13 i 17 paczek.

Czasy są orientacyjne względem filmu, bez pomiaru opóźnienia dotknięcia. Źródło ma 37,861667 s i 1221 rzeczywistych klatek z nierównymi PTS. Eksport powiela lub usuwa klatki bez interpolacji. W początkowych 0–14 s ruchu mediana odstępu wynosiła 16,667 ms, P95 20 ms, maksimum 200 ms. W pełnej pauzie recorder rzadziej zapisuje nieruchome klatki; największa przerwa to 8,025 s. Czas i trwałość pauz potwierdza zegar XCTest, nie film. Brak mowy nie wymaga transkrypcji wypowiedzi; powyższa sekwencja jest pełną alternatywą tekstową.

Świadomy start

Control początkowo ma nieruchomy komunikat, odczyt 0 i 4 paczki. Przez co najmniej 7,006130 s nic się nie zmienia. Dopiero „Uruchom podgląd” świadomie uruchamia ruch i aktualizacje; reset przywraca spoczynek. To kontrola warunku automatycznego startu, bez zalecenia pomijania pauzy w produkcie.

Pracownia control przed startem: odczyt 0, 4 paczki i Uruchom podgląd.

Nieruchomy stan przed świadomym uruchomieniem; brak zmian potwierdzono osobnymi odczytami.

W good ograniczony ruch systemu powoduje początkową pauzę ruchu, ale licznik ma własną kontrolę. Bad celowo pomija tę preferencję. Sama preferencja nie dowodzi kontroli każdej aktualizacji.

Kiedy obowiązuje i gdzie są wyjątki

Dwie gałęzie wymagania

Gałąź Warunki łączne Dopuszczalna kontrola
Ruch, miganie, przewijanie Start automatyczny, ponad 5 s i inna równoległa treść. Pauza, zatrzymanie lub ukrycie.
Automatyczne aktualizacje Start automatyczny i inna równoległa treść. Bez progu 5 s. Pauza, zatrzymanie, ukrycie lub częstotliwość.

Zatrzymanie ruchu najwyżej po 5 s usuwa warunek czasu tej gałęzi, bez pozwolenia na niebezpieczne błyski. Fokus, hover lub pojawienie się elementu w widoku mogą pośrednio uruchomić zachowanie automatyczne. Wejście na ekran nie jest świadomym startem jego animacji; osobny nazwany przycisk zmienia warunek startu.

Pauza ma pozwalać nadal korzystać z ekranu. Trzymanie palca, hover lub pozostawanie fokusu, gdy odejście od razu wznawia ruch, nie zapewniają tej kontroli. Zmiana etykiety bez zatrzymania źródła, zatrzymanie animacji przy działającym liczniku oraz samoczynnie cofana pauza pozostawiają barierę.

Dane okresowe lub transmitowane nie muszą odtwarzać wszystkich pominiętych wartości. Określ, czy wznowienie kontynuuje od miejsca, czy pokazuje aktualny stan. Oznacz zatrzymany odczyt jako wstrzymany, aby nie udawał bieżących danych.

Niezbędność i niezakłócanie

Wyjątek wymaga utraty informacji lub funkcji po usunięciu zachowania, bez równoważnej zgodnej drogi. Chęć przyciągnięcia uwagi i etykieta „na żywo” nie wystarczają. Animacja ładowania może być niezbędna w fazie bez możliwości korzystania z interfejsu, gdy brak wskaźnika sugerowałby awarię; spinner obok działającego formularza nie otrzymuje automatycznie wyjątku.

Dekoracje, reklamy i osadzone treści też mogą zakłócać zadanie. Wymóg niezakłócania WWW i informacyjna nota WCAG2ICT mają odrębny status. W Pracowni godziny i adres pozostają dostępne, więc ruch i licznik nie są niezbędne.

F16/F112/F50 opisują pomocnicze wzorce przewijania i migania bez kontroli. Dawny blink/F47 jest obsolete; nie jest współczesną regułą Fluttera. G4/G186/G11 podają możliwe rozwiązania, bez obowiązku konkretnego API. Wspólna kontrola wszystkich zmian jest dobrą praktyką; osobne skuteczne kontrole też realizują wymaganie. Usunięcie niepotrzebnego ruchu i ręczne odświeżanie są prostymi alternatywami.

Platformy

Interpretacja AI z 2026-10-02: WCAG 2.2 Recommendation 2024-12-12 oraz informacyjne WCAG2ICT Group Note 2025-12-11. Poza WWW odniesienie do strony zastępuje oprogramowanie lub dokument. Nie ustalano zastosowania EN 301 549 ani obowiązku prawnego.

Środowisko Warunek i adaptacja Wykonanie źródłowe
WWW, także telefon Dwie gałęzie, również treści osadzone i dekoracyjne. Niewykonane.
Mobile Te same warunki w oprogramowaniu poza środowiskiem webowym. Flutter/iOS Simulator; Android niewykonany.
Desktop Np. ruch obok edytora lub zmieniany panel danych. Niewykonane.
Dokumenty Automatyczna prezentacja obok innych treści; statyczny PDF nie tworzy warunku. Niewykonane.
Wizualny kiosk Ruch/aktualizacja przy odczycie instrukcji; sprzęt i inne urządzenia wymagają własnego zakresu. Niewykonane.

W hybrydzie oddziel część webową i natywną. Control nie spełnia warunku automatycznego startu tej czynności, bez wyłączenia kategorii mobile.

Rozwiązania w technologiach

Fragmenty pokazują trwałe wstrzymanie aktualizacji bez blokowania ekranu. Osobną animację trzeba objąć kontrolą albo usunąć. Oficjalne API sprawdzono w źródle 2026-10-02.

Flutter

Timer? updates;
int count = 4;
bool paused = false;
void resume() {
  updates = Timer.periodic(const Duration(seconds: 2), (_) {
    setState(() => count++);
  });
}
void toggle() => setState(() {
  paused = !paused;
  updates?.cancel();
  if (!paused) resume();
});
// W build: CupertinoButton(onPressed: toggle,
//   child: Text(paused ? 'Wznów aktualizacje' : 'Wstrzymaj aktualizacje'))
// Start w initState; updates?.cancel() w dispose.

Osadź wewnątrz State z importami dart:async oraz package:flutter/cupertino.dart. Pełny ekran zatrzymuje AnimationController.stop(canceled: false) i wznawia repeat(reverse: true) od bieżącej wartości; kierunek może wrócić do początkowego kierunku cyklu. Timer.cancel zatrzymuje aktualizacje; nowy periodic kontynuuje bez nadrabiania i nie gwarantuje dokładnie 2 s. Dispose usuwa timer/controller. Pełna demonstracja Flutter 3.44.9 / Dart 3.12.2: analiza, host, build i iOS PASS; skrót nie był osobno uruchamiany.

Android / Compose

import androidx.compose.runtime.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.foundation.layout.Column
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive

@Composable fun PickupCount() {
    var paused by remember { mutableStateOf(false) }
    var count by remember { mutableStateOf(4) }
    LaunchedEffect(paused) {
        if (!paused) while (isActive) {
            delay(2000)
            count++
        }
    }
    Column {
        Text("Paczki w punkcie: $count")
        Button(onClick = { paused = !paused }) {
            Text(if (paused) "Wznów aktualizacje" else "Wstrzymaj aktualizacje")
        }
    }
}

Zmiana klucza LaunchedEffect anuluje poprzednią coroutine; wyjście z kompozycji także ją anuluje. Odczyt pozostaje w stanie. Do osobnego ruchu użyj zatrzymywalnego animatora albo go usuń; samo rememberInfiniteTransition nie daje pauzy. Dokumentacja sprawdzona; kompilacja i Android niewykonane.

iOS / SwiftUI

import SwiftUI

struct PickupCount: View {
    @State private var paused = false
    @State private var count = 4
    var body: some View {
        VStack {
            Text("Paczki w punkcie: \(count)")
            Button(paused ? "Wznów aktualizacje" : "Wstrzymaj aktualizacje") {
                paused.toggle()
            }
        }
        .task(id: paused) {
            guard !paused else { return }
            while !Task.isCancelled {
                do { try await Task.sleep(for: .seconds(2)) }
                catch { return }
                guard !Task.isCancelled else { return }
                count += 1
            }
        }
    }
}

task(id:) zastępuje/anuluje zadanie przy zmianie pauzy i opuszczeniu widoku. Błąd anulowanego sleep kończy pętlę; API sleep wymaga iOS 16. TimelineView z pozycją od bieżącej daty może skoczyć po wznowieniu, więc kontynuacja potrzebuje utrzymanej fazy. Dokumentacja sprawdzona; ten fragment nie miał typecheck ani runtime. Flutter/iOS go nie potwierdza.

React Native

import React, { useEffect, useState } from 'react';
import { Button, Text, View } from 'react-native';

export function PickupCount() {
  const [paused, setPaused] = useState(false);
  const [count, setCount] = useState(4);
  useEffect(() => {
    if (paused) return;
    const timer = setInterval(() => setCount((c) => c + 1), 2000);
    return () => clearInterval(timer);
  }, [paused]);
  return (
    <View>
      <Text>Paczki w punkcie: {count}</Text>
      <Button
        title={paused ? 'Wznów aktualizacje' : 'Wstrzymaj aktualizacje'}
        onPress={() => setPaused((p) => !p)}
      />
    </View>
  );
}

Cleanup usuwa interwał przy zmianie pauzy i unmount. Dla ruchu Animated.Value.stopAnimation(callback) pozwala uzyskać pozycję i rozpocząć od niej nową animację. Zmiana napisu nie zatrzymuje Animated.loop. Dokumentacja sprawdzona; typecheck, build i runtime niewykonane.

Jak sprawdzić

  1. Zinwentaryzuj ruch i aktualizacje, źródło startu, równoległą treść oraz uzasadnienie niezbędności. Mierz ruch także po 5 s; nie stosuj tego progu do aktualizacji.
  2. Wstrzymaj samo źródło ruchu, obserwując dalsze aktualizacje. Potem wstrzymaj aktualizacje i użyj innej funkcji ekranu.
  3. Potwierdź trwałość obu pauz po odejściu od kontrolki. Wznów je osobno i sprawdź niezależne skutki.
  4. Dla braku kontroli potwierdź warunki i wyjątek; naturalny koniec po 90 s nie rozwiązuje warunku ruchu ponad 5 s.
  5. Dla świadomego startu obserwuj stan przed przyciskiem, uruchom, potem sprawdź reset. W docelowym audycie zbadaj dostępność kontrolek właściwymi wejściami i asystą.

Weryfikacja i ograniczenia

Historyczne wykonanie 2026-10-02: Flutter 3.44.9 / Dart 3.12.2, Xcode 27.0 / SDK Simulator 27.0 i iPhone 17 Simulator / iOS 26.5. Próby dotykowe były wykonane w zainstalowanym buildzie.

Sprawdzenie Wynik i granica
Analiza, host, build iOS PASS; 17 testów hostowych, build Xcode 7,5 s. Host używa wirtualnego czasu.
XCTest PASS, 2 testy, 0 failures, 93,078 s.
Automatyczne good/bad Zmiany po co najmniej 6,306668 / 6,310020 s. Bad odtwarza FAIL 2.2.2; test odtworzenia ma PASS.
Pauza samego ruchu Co najmniej 3,008409 s stałej pozycji przy rosnącym liczniku.
Obie pauzy Co najmniej 7,005268 s; x=70,133316 pt, odczyt 12 i 16 paczek, adres ujawniony. Wznowienia niezależne.
Control Co najmniej 7,006130 s bez zmian, x=16 pt i odczyt 0; po starcie obie zmiany działają.
Materiały 4 PNG, 17 próbek, 9 wejść i 4 drzewa; surowy film i eksport. AI obejrzała kadry i sekwencje klatek.
Inne drogi, asysta i człowiek Stop/ukrycie/częstotliwość, transmisja, fizyczny iPhone, VoiceOver, klawiatura/FKA i pozostałe frameworki niewykonane.

Dolne granice czasu pochodzą z różnicy początku i końca osobnych odczytów na zegarze XCTest, bez mieszania z timerem Fluttera. Odczyt stanu, frame i label nie jest atomowy: podczas ruchu licznik zdążył zmienić się między nimi; po pauzie teksty są zgodne. UTC nie mierzy ekspozycji PNG. Ostateczne wyniki dotyczą kodu po poprawkach hosta, Semantics.enabled i drivera.

Snapshot lub kilka pozycji nie dowodzą ciągłości wszystkich klatek, źródła startu i niezbędności. Live region nie zatrzymuje zmian. Instrumentację, etykiety good/bad/control i oczekiwania należy wyłączyć z wejścia niezależnego walidatora; takiego klasyfikatora nie uruchomiono. Brak ruchu w jednym kadrze nie oznacza spełnienia wymagania.

Jak sprawdza Clearship

Metoda z 2026-10-08, z pomiarem iOS 2026-10-09, analizuje ruch w klatkach około sześciu sekund czekania bez akcji. Szuka automatycznego ruchu obok treści i kontroli rozpoznanej z etykiety. Android spełnił próg kontrolny: 6/6 usterek, 0 fałszywych alarmów na 44 poprawnych ekranach. iOS ma 5/6 i 0/44, więc pozostaje poniżej progu i wymaga człowieka.

Analizator nie sprawdza skutku pauzy ani gałęzi automatycznych aktualizacji. Rozpoznana kontrolka, czas przy progu, brak równoległej treści, nagrania lub dekodera pozostają nierozstrzygnięte. Ruch po akcji, później niż okno i poza trasą nie jest badany; ocena niezbędności potrzebuje kontekstu. Dekoder jest dostępny w ponownej analizie na stacji, ale obecne hosty i usługa analizy mogą zwracać brak dekodera. Wyniki demonstracji tego artykułu są odrębne od pomiarów produktu.

Powiązane kryteria