1.4.11Poziom AA

Kontrast elementów nietekstowych

Non-text Contrast

Wskazówki potrzebne do rozpoznania kontrolek i ich stanów oraz istotne części grafik wymagają kontrastu co najmniej 3:1 względem sąsiednich kolorów, z określonymi wyjątkami.

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

Warunki i wyjątki opisano w artykule.

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

Co oznacza to kryterium

Znacznik wyboru, potrzebna ikona i istotna część diagramu muszą odcinać się od kolorów, z którymi sąsiadują. Minimalny kontrast wynosi 3:1. Porównujemy element niosący informację z jego rzeczywistym otoczeniem: znak wyboru może leżeć wewnątrz kontrolki, a obrys fokusu na karcie wokół niej. Wyjątki obejmują nieaktywne kontrolki, określony niezmieniony wygląd platformy i niezbędną prezentację grafiki.

To pomaga osobom słabowidzącym. Czytelny podpis nie zawsze wystarcza, by zobaczyć zaznaczenie opcji, uchwyt suwaka lub kierunek strzałki. Samo rozróżnianie barw i nazwa dostępna dla czytnika to odrębne zagadnienia.

Przykłady błędów i poprawek

Znacznik wyboru i strzałka planu

Własna demonstracja „Pracownia” pokazuje odbiór P-104. W obu wersjach wybrano „Odbiór przy ogrodzie”, a strzałka prowadzi do wejścia B. Dane, kształty i obsługa pozostają takie same. Zmieniamy kolor znaku i strzałki, sąsiadujących z bielą.

Błąd · 2,3231230535045992:1
Pracownia na iOS Simulator: wybrana opcja ma jasnoszary checkmark, a jasna strzałka wskazuje wejście B.
#AAAAAA na #FFFFFF. Stan selected jest prawdziwy, lecz wizualna wskazówka jest zbyt jasna.
Poprawka · 16,729619093590486:1
Ta sama Pracownia: ciemny checkmark wskazuje wybór, a ciemna strzałka prowadzi do wejścia B.
#15201C na #FFFFFF. Podpis, dane, kierunek i działanie nie zmieniają się.

Surowe zrzuty własnej demonstracji Flutter/Cupertino, iPhone 17 Simulator, iOS 26.5, z 2026-10-04. Wartości pochodzą z odczytów źródłowych. Para dokumentuje te trwałe stany; nie potwierdza dostępności całej aplikacji ani testu VoiceOver.

Problem
Jasny checkmark i strzałka znikają na białym tle. Ciemna ramka pola oraz poprawna rola i stan w drzewie dostępności nie zastępują tych wskazówek.
Skutek
Osoba może przeczytać opcję, ale nie zobaczyć, czy ją wybrała. Bez strzałki same etykiety A i B nie wskazują wejścia.
Poprawka
Zastosuj #15201C zamiast #AAAAAA, zachowując białe tło, znak wyboru, geometrię i obsługę. Zbadaj potrzebny fragment w każdym używanym stanie.

Kontrola: opcja rzeczywiście nieaktywna

Pracownia: nieaktywna opcja ma jasny checkmark i tekstowy powód niedostępności; strzałka planu pozostaje ciemna.

Surowy zrzut iOS Simulator z 2026-10-04. XCTest odczytał isEnabled=false; normalne dotknięcie nie zmieniło wyboru. Wyjątek obejmuje tę kontrolkę. Potrzebna strzałka nadal ma 16,729619093590486:1.

W aktywnych wariantach zwykłe dotknięcie usuwało i przywracało checkmark wraz ze stanem selected. To odróżnia faktyczne działanie od samej nazwy wariantu. Nie nagrywano filmu ani audio; trwałe stany, wejścia i odczyty kolorów dokumentują tę parę.

WWW: autorski fokus

Błąd fokusu
Pracownia WWW po wejściu klawiaturą: jasny zewnętrzny obrys fokusu, jasny checkmark i strzałka.
#AAAAAA względem białej karty: 2,3231230535045992:1.
Poprawka fokusu
Ta sama Pracownia WWW: ciemny obrys fokusu, checkmark i strzałka.
#15201C względem białej karty: 16,729619093590486:1.

Rzeczywiste JPEG z IAB na macOS, 2026-10-04. Fokus uzyskano Tab i Shift+Tab; obrysy mają 3 CSS px i odstęp 4 px. To pomiar względem sąsiedniej karty, bez porównywania focused z unfocused.

Normalne Space i kliknięcie zmieniały wybór. Nieaktywna opcja nie reagowała na kliknięcie i była pomijana przez Tab. Dekoracyjny jasny cień hover nie służył do wskazywania wyboru; białe tło pozostawało takie samo. Odczyty hover dotyczyły odznaczonej opcji, więc nie dowodzą kontrastu widocznego checkmarka podczas hover.

Kiedy obowiązuje i gdzie są wyjątki

Kontrolki, sąsiednie kolory i stany

Wymaganie obejmuje wizualną informację potrzebną do rozpoznania kontrolki lub jej stanu. Obrys całego obszaru dotyku nie jest obowiązkowy, jeżeli akcję wystarczająco identyfikuje podpis lub ikona. Czytelny podpis opcji nie oznacza jednak, że widać jej zaznaczenie. W przykładzie sąsiadem checkmarka jest białe wnętrze, a nie ciemna ramka. Przy kilku kolorach ustal, które części razem przekazują informację i które granice trzeba ocenić.

Nie wymagamy 3:1 między następującymi po sobie, nieprzylegającymi stanami, np. default i hover albo linkiem odwiedzonym i nieodwiedzonym. Dodatkowy efekt hover może być dekoracyjny. Po najechaniu nadal musi być rozpoznawalna potrzebna informacja kontrolki, wyboru i fokusu.

Autorski wskaźnik fokusu oceniamy w stanie focused względem sąsiadującego koloru. Zewnętrzny obrys może sąsiadować z kartą, a wewnętrzny z wypełnieniem. Kryterium AAA 2.4.13 osobno opisuje powierzchnię i zmianę focused/unfocused; 2.4.7 dotyczy widoczności fokusu. Ta demonstracja nie jest pełną oceną żadnego z nich.

Nieaktywność i wygląd platformy

Wyjątek nieaktywnej kontrolki oznacza, że widoczny element jest rzeczywiście niedostępny do interakcji. Sam szary kolor, tekst „wyłączone”, aria-disabled lub stan w drzewie nie zatrzymują działania. W demonstracji użyto onPressed=null i HTML disabled oraz sprawdzono zwykłe wejście. Powód niedostępności jest czytelnym tekstem.

Drugi wyjątek dotyczy wyglądu nadanego przez odbiornik i niezmienionego przez autora. WCAG2ICT uwzględnia też oprogramowanie platformowe. Własny kolor, obrys lub painter jest zmianą autorską. Nazwa „Cupertino” i natywny build Fluttera same nie dowodzą zastosowania wyjątku.

Grafika, równoważny tekst i niezbędna prezentacja

Oceniamy części potrzebne do zrozumienia: grot strzałki, linię serii czy istotne granice segmentów. Dekoracja nie uruchamia wymagania. Równoważna widoczna informacja tekstowa może usunąć potrzebę polegania na grafice; ogólna nazwa obrazu i ukryty opis dostępności nie zastępują jej dla osoby słabowidzącej. W planie same A/B i zdanie „strzałka wskazuje wejście” nie podają celu. Nazwa dla technologii asystującej podaje B, ale jej użycia tutaj nie testowano.

Wyjątek niezbędnej prezentacji dotyczy sytuacji, gdy zmiana wyglądu zasadniczo zmieniłaby informację i nie da się przekazać jej inaczej w sposób zgodny, np. fotografii rzeczywistej sceny, flagi lub wymaganych barw logo. Przygaszenie logo dla stylistyki nie tworzy takiego wyjątku. Interaktywne logo trzeba też ocenić jako kontrolkę, uwzględniając równoważną widoczną akcję. Ciemniejsza strzałka „Pracowni” zachowuje znaczenie, więc wyjątek jej nie obejmuje.

Gradienty, warstwy i cienkie kreski

Nie oceniaj mechanicznie każdego antyaliasowanego piksela. Wyznacz istotne części i ich faktyczne sąsiedztwo; uwzględnij gradient, alpha, opacity i warstwy. Po pominięciu fragmentów o słabym kontraście obiekt musi nadal przekazywać potrzebną informację. Drobne przecięcie linii może zachować ciągłość, a znikający grot zniszczyć kierunek. Nominalny wynik koloru nie gwarantuje czytelności bardzo cienkiej kreski.

Ta demonstracja ma płaskie, nieprzezroczyste kolory. Jej wyniki nie potwierdzają gradientów, nakładania, rasterów, cieni jako koniecznej granicy ani innego profilu barw.

Platformy

Interpretację źródłową opracowano przez AI 2026-10-04. Dla WWW podstawą jest WCAG 2.2 / 1.4.11; dla oprogramowania i dokumentów poza WWW użyto WCAG2ICT 2.2, Group Note z 2025-12-11. Ta nota jest wskazówką interpretacyjną. Klasyfikacja poniżej nie rozstrzyga obowiązku prawnego ani nie oznacza wykonanego testu.

Środowisko Warunek i adaptacja Faktyczne wykonanie
WWW Potrzebna wskazówka kontrolki, stanu lub część grafiki; bez zmiany wymagania. Przeglądarka telefonu też należy do stron internetowych. Własny minimalny przykład w IAB na macOS.
Aplikacje mobilne Autorskie kontrolki, zaznaczenie lub diagram; „user agent” rozszerzony o oprogramowanie platformowe. Flutter/Cupertino na iOS Simulator. Android, natywny SwiftUI i React Native nieuruchomione.
Aplikacje desktopowe Kontrolki, stany, ikonowe narzędzia i istotne części wykresów; ta sama adaptacja. Natywne macOS, Windows i Linux nieuruchomione. WWW na macOS nie jest tym testem.
Dokumenty cyfrowe Potrzebna grafika lub kontrolki interaktywnego dokumentu. Statyczny dokument także może mieć istotny diagram. Dokument i jego czytnik niesprawdzone.
Wizualne oprogramowanie kiosku lub telewizora WCAG2ICT dla części poza WWW, WCAG dla webowej. Nota nie określa kontrastu sprzętu. Przy closed functionality lub kontraście narzuconym sprzętowo autor może nie mieć możliwości zmiany. Nieuruchomione; ograniczenie zastosowania wymaga oceny konkretnego interfejsu.

Nieaktywna kontrolka korzysta z wyjątku w swoim stanie; nie wyłącza platformy ani grafiki całego ekranu. W aplikacji hybrydowej rozdziel część webową i natywną. Źródło nie mapowało tutaj EN 301 549 ani wymagań prawnych.

Rozwiązania w technologiach

Fragmenty pokazują zmianę w istniejącym ekranie. Kolory, sąsiednie tło, motyw i stany sprawdź w docelowej aplikacji. Przegląd API w źródle pochodzi z 2026-10-04. Build Fluttera nie potwierdza pozostałych frameworków.

Flutter

import 'package:flutter/cupertino.dart';

// W build() StatefulWidget; selected i setState są stanem ekranu.
Semantics(
  button: true, selected: selected, label: 'Odbiór przy ogrodzie',
  excludeSemantics: true,
  child: CupertinoButton(
    onPressed: () => setState(() => selected = !selected),
    child: Row(children: [
      Container(
        color: const Color(0xFFFFFFFF), width: 32, height: 32,
        child: selected
          ? const Icon(CupertinoIcons.check_mark, color: Color(0xFF15201C))
          : const SizedBox(),
      ),
      const Text('Odbiór przy ogrodzie',
        style: TextStyle(color: Color(0xFF15201C))),
    ]),
  ),
)

Widoczny znacznik przekazuje wybór niezależnie od Semantics.selected. Ten fragment zamienia painter na Icon i nie był osobno kompilowany. Rzeczywista demonstracja używa CustomPaint, linii 4 logical px i tego samego koloru; jej analiza, testy hostowe, build i działanie na iOS Simulator zakończyły się pozytywnie. To nie jest test VoiceOver ani UIKit color getter.

iOS / SwiftUI

import SwiftUI

struct PickupOption: View {
    @State private var selected = true
    private let ink = Color(red: 21.0/255, green: 32.0/255, blue: 28.0/255)
    var body: some View {
        Button { selected.toggle() } label: {
            HStack {
                Image(systemName: selected ? "checkmark.square" : "square")
                    .foregroundStyle(ink)
                Text("Odbiór przy ogrodzie").foregroundStyle(ink)
            }
            .padding().background(Color.white)
        }
        .buttonStyle(.plain)
        .accessibilityLabel("Odbiór przy ogrodzie")
        .accessibilityAddTraits(selected ? .isSelected : [])
    }
}

foregroundStyle ustala kolor symbolu i tekstu, a białe tło wskazuje sąsiedztwo. Widoczny znak i trait selected to odrębne informacje. Przegląd API wykonano 2026-10-04; kompilacja/typecheck i działanie niewykonane. Driver XCTest nie potwierdza tego fragmentu ani konkretnego SF Symbol na urządzeniu.

Android / Compose

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color

@Composable
fun PickupOption(checked: Boolean, onCheckedChange: (Boolean) -> Unit) {
    Row(Modifier.background(Color.White)) {
        Checkbox(
            checked = checked, onCheckedChange = onCheckedChange,
            colors = CheckboxDefaults.colors(
                checkedColor = Color(0xFF15201C),
                uncheckedColor = Color(0xFF4A5550),
                checkmarkColor = Color.White
            )
        )
        Text("Odbiór przy ogrodzie", color = Color(0xFF15201C))
    }
}

Tutaj biały checkmark leży na ciemnym wypełnieniu Checkbox, więc jego sąsiadem nie jest biała karta. Osobno oceń granicę kontrolki, powiązanie etykiety, fokus, stany i motywy. Przegląd API wykonano 2026-10-04; kompilacja i działanie niewykonane, Androida nie uruchomiono. Nie przypisano nieużytej wersji pakietu.

React Native

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

export function PickupOption() {
  const [selected, setSelected] = useState(true);
  return (
    <Pressable
      accessibilityRole="button"
      accessibilityLabel="Odbiór przy ogrodzie"
      accessibilityState={{ selected }}
      onPress={() => setSelected((v) => !v)}
      style={{ backgroundColor: '#FFFFFF', padding: 12, flexDirection: 'row' }}
    >
      <View
        accessible={false}
        style={{ width: 28, height: 28, marginRight: 12 }}
      >
        {selected && (
          <View
            style={{
              width: 12,
              height: 20,
              borderRightWidth: 4,
              borderBottomWidth: 4,
              borderColor: '#15201C',
              transform: [{ rotate: '45deg' }],
            }}
          />
        )}
      </View>
      <Text style={{ color: '#15201C' }}>Odbiór przy ogrodzie</Text>
    </Pressable>
  );
}

Widoczny znak jest rysowaną grafiką. accessibilityState.selected nie zwiększa kontrastu; wyłączenie wymaga także faktycznego disabled. Przegląd API wykonano 2026-10-04; typecheck, kompilacja i działanie niewykonane. Obrót, geometria i sąsiednie piksele wymagają oceny w rzeczywistym React Native.

WWW / HTML i CSS

<button id="pickup" aria-pressed="true">
  <svg aria-hidden="true" width="28" height="28" viewBox="0 0 28 28">
    <path d="M6 14 L12 20 L23 7" />
  </svg>
  Odbiór przy ogrodzie
</button>
<style>
  #pickup {
    color: #15201c;
    background: #fff;
  }
  #pickup path {
    stroke: #15201c;
    fill: none;
    stroke-width: 4;
  }
  #pickup[aria-pressed='false'] path {
    visibility: hidden;
  }
  #pickup:focus-visible {
    outline: 3px solid #15201c;
    outline-offset: 4px;
  }
</style>
<script>
  const pickup = document.querySelector('#pickup');
  pickup.addEventListener('click', () =>
    pickup.setAttribute(
      'aria-pressed',
      pickup.getAttribute('aria-pressed') === 'true' ? 'false' : 'true',
    ),
  );
</script>

Pełny przykład źródłowy dodaje białą kartę pod fokusem, pudełko, kontrolę disabled, plan, cykl i reset. Przegląd HTML/CSS/SVG oraz składni JS wykonano 2026-10-04. DOM/CSS/AX, zwykłe wejścia i obrazy potwierdzono dla pełnej demonstracji; fragment nie ma osobnego wykonania. Nie ustalono wersji silnika przeglądarki i nie testowano wymuszonych kolorów.

Jak sprawdzić

  1. Ustal, co element przekazuje, kto musi to zobaczyć i czy ta wskazówka jest potrzebna. Rozdziel kontrolkę, znacznik stanu i części grafiki. Sprawdź wyjątki oraz równoważną widoczną informację.
  2. Odtwórz zwykłe stany wyboru, fokusu, rozwinięcia i hover, jeśli występują. Potwierdź niedostępność nieaktywnego elementu normalnym wejściem.
  3. Odczytaj rozwiązany kolor z renderera lub API i faktyczne sąsiednie tła. Uwzględnij obrys, warstwy, alpha i opacity. Nie zakładaj bieli ani koloru ramki jako właściwego tła.
  4. Oblicz luminancję sRGB ze współczynnikami 0,2126 / 0,7152 / 0,0722 i punktem linearyzacji 0,04045. Stosunek wynosi (Ljaśniejsze + 0,05) / (Lciemniejsze + 0,05). Porównaj pełny wynik z 3: 2,99:1 nie spełnia progu. Obejrzyj rozpoznawalność potrzebnych fragmentów.
  5. Zapisz stan, kolory, geometrię, środowisko i zakres. Brak danych nie oznacza wyniku pozytywnego. Screenshot nie potwierdza czytnika, a drzewo dostępności nie zastępuje wskazówki wizualnej.

Oczekiwany wynik dotyczy każdej wymaganej wskazówki w ocenianym stanie. Nie zgłaszaj automatycznie błędu dla dekoracji ani rzeczywiście nieaktywnej kontrolki.

Obserwacje źródłowe z 2026-10-04

Element i sąsiedztwo Pełny wynik / znaczenie
Ciemny checkmark lub strzałka / biel 16,729619093590486:1; próg spełniony w tych stanach demonstracji.
Jasny aktywny checkmark lub potrzebna strzałka / biel 2,3231230535045992:1; poniżej progu.
Jasny checkmark nieaktywnej opcji / biel 2,3231230535045992:1; wyjątek dotyczy tej nieaktywnej kontrolki.
Fokus WWW / biała karta Ciemny 16,729619093590486:1; jasny 2,3231230535045992:1.
Wspólna ramka #4A5550 / biel 7,759366710298236:1; nie zastępuje kontrastu checkmarka.

Wykonano natywny XCTest: 1 test, 0 błędów, 43,963 s. Zachowano 14 stanów i 21 wejść; dla WWW 16 odczytów i 15 wejść. Rdzenie kreski w surowych PNG potwierdziły odczytane kolory i biel; nie retuszowano zrzutów. Renderer i screenshot były kolejnymi odczytami trwałego stanu, a nie atomowym pomiarem. Nie badano profilu fizycznego ekranu.

Weryfikacja i ograniczenia

Analiza, 63 testy hostowe, build i działanie źródłowej aplikacji Flutter 3.44.9 / Dart 3.12.2 na iOS Simulator zakończyły się pozytywnie. Dla WWW potwierdzono DOM/CSS/AX, wejścia i obrazy w opisanym zakresie. Pierwsza próba wrappera Dart nie miała dostępu do cache SDK, a pierwsza próba serwera WWW nie mogła otworzyć portu w sandboxie. Późniejsze uprawnione wykonania dały powyższe dowody; problemy środowiska nie były awarią produktu.

Nie sprawdzono VoiceOver ani innych technologii asystujących, fizycznego iPhone’a, ustawień kontrastu, wyglądu i Dynamic Type, natywnego fokusu klawiaturą/FKA, native hover, forced colors, innych motywów, gradientów, dokumentów i pozostałych natywnych frameworków. Brak wykonania nie jest wynikiem negatywnym ani zwolnieniem z wymagania. Redakcja tego artykułu nie uruchamiała ponownie demonstracji.

Reguła może policzyć znaną parę nieprzezroczystych kolorów sRGB. Sama nie rozstrzyga, czy fragment jest potrzebny, jakie sąsiedztwo niesie informację i czy zachodzi wyjątek. Może pomylić dekoracyjny cień z granicą, pominąć jasny checkmark przy poprawnym selected lub zmierzyć go względem ramki. Przy brakujących warstwach i stylach wynik pozostaje nieustalony.

W źródle sprawdzono techniki G207 i G209 dla ikon oraz granic grafiki, G195 i C40 dla fokusu, G174 dla pełnej wersji alternatywnej oraz błąd F78. Nie są dodatkowymi zwolnieniami z normatywnego progu. Cykl wariantów demonstracji nie jest zgodną wersją alternatywną produktu. Jasny rysowany obrys nie dowodzi wszystkich warunków F78. Nie wykonano pełnego testu C40 ani wykresu segmentowego. W sprawdzonym katalogu ACT brakowało dedykowanej reguły 1.4.11; reguła kontrastu tekstu afw4f7 nie obejmuje checkmarka, SVG ani natywnego Fluttera i nie była uruchamiana.

Jak sprawdza Clearship

  • Pomiar na Androidzie: detektor grafiki mierzy PNG opisanych aktywnych ImageButton/ImageView bez dzieci i porównuje wynik z 3:1. ImageContrastCheck z ATF także dostarcza kandydatów. Konieczność grafiki, właściwe sąsiedztwo i wyjątek nadal wymagają oceny; uruchomienie silnika nie dowodzi sprawdzenia wszystkich stanów.
  • Wskazówka AI na Androidzie i iOS: ocena obrazu może wskazać podejrzane ikony i tekst. Nie podaje wiarygodnego stosunku 3:1 ani samodzielnego rozstrzygnięcia tego kryterium. Dostępny audyt kontrastu iOS w opisanym scenariuszu dotyczy tekstu.
  • Braki pokrycia: własny detektor nie obejmuje grafiki iOS, kontrolek z tekstem, wszystkich obrysów, checkmarków, custom paint i grafiki bez węzła. Pełna kwalifikacja części, stanów i rzeczywistych sąsiednich kolorów pozostaje niepełna.

Wyniki badań „Pracowni” nie potwierdzają ogólnego wykonawcy Clearship. Dla nieosiągniętych stanów, brakujących danych i awarii zachowujemy odrębny status. Pusta lista lub brak kandydata nie uzasadniają komunikatu, że nie znaleziono problemów. Katalog wymaga zachowania surowego stosunku, konfliktów i tolerancji prototypu 0,01; nie daje to prawa do zaokrąglenia 2,99 do 3.

Powiązane kryteria

Wróć do bazy wiedzy.