Dostępność

Współczynniki kontrastu WCAG wyjaśnione: praktyczny przewodnik projektanta

Zespół colorPaletteFinder8 min czytania

Oto liczba, do której wciąż wracam: w raporcie WebAIM Million z 2025 roku tekst o niskim kontraście był najczęstszym pojedynczym błędem dostępności w sieci, obecnym na 79,1% z miliona najpopularniejszych stron głównych. Nie brak tekstu alternatywnego. Nie nieopisane przyciski. Kontrast. Najczęściej wykrywany problem z dostępnością na świecie to dwa zbyt podobne do siebie kolory, a niemal każdy zespół, który go wypuszcza, nie ma o tym pojęcia.

Sam wypuściłem ten błąd. Lata temu zbudowałem „premium” dashboard z eleganckim szarym tekstem #9CA3AF na bieli, zaakceptowany przez wszystkich w pokoju, bo wyglądał wyrafinowanie na fabrycznie nowym ekranie Retina w ciemnej sali konferencyjnej. Tydzień później przyszło zgłoszenie od użytkownika w zalanym słońcem pociągu, który dosłownie nie mógł odczytać etykiet. Tekst był na poziomie około 2,6:1. WCAG prosi o 4,5:1. Ta różnica to cały temat tego artykułu.

Czym naprawdę jest współczynnik kontrastu WCAG

Współczynnik kontrastu WCAG to pojedyncza liczba opisująca, jak bardzo dwa kolory różnią się jasnością, wyrażona jako stosunek od 1:1 do 21:1. Biel na bieli to 1:1 (niewidoczne). Czysta czerń na czystej bieli to 21:1 (maksimum). Wszystko, co projektujesz, mieści się gdzieś pomiędzy, a WCAG ustala próg, poniżej którego nie wolno ci zejść.

Kluczowa rzecz do przyswojenia wcześnie: kontrast dotyczy luminancji, a nie tego, czy kolory „wyglądają na różne”. Czerwony i zielony wyglądają dla większości ludzi diametralnie inaczej, ale nasycony czerwony (#FF0000) na nasyconym zielonym (#008000) plasuje się zaledwie na około 1,3:1, bo niosą niemal tę samą jasność. Dla osoby z daltonizmem czerwono-zielonym albo dla każdego rzucającego okiem na kiepskiej jakości ekran ta para to breja. Twoje oko daje się oszukać odcieniowi; wzór na kontrast nie.

Wzór, prościej mówiąc

Współczynnik oblicza się jako (L1 + 0.05) / (L2 + 0.05), gdzie L1 to luminancja względna jaśniejszego koloru, a L2 to luminancja ciemniejszego. Niemal nigdy nie będziesz tego liczyć ręcznie, ale zrozumienie dwóch etapów mówi, dlaczego twoja intuicja cię myli.

Najpierw luminancję względną każdego koloru znajduje się, biorąc jego kanały czerwony, zielony i niebieski, „linearyzując” je (cofając krzywą gamma, którą nakładają ekrany, według reguły, że kanały o wartości 0.03928 lub niższej dzieli się przez 12.92, a wyższe przepuszcza przez ((c + 0.055) / 1.055) ^ 2.4), a następnie ważąc: 0,2126 dla czerwonego, 0,7152 dla zielonego i 0,0722 dla niebieskiego. Te wagi nie są przypadkowe. Ludzkie oczy są nadzwyczaj czułe na zielony i w porównaniu niemal ślepe na niebieski.

To najużyteczniejszy wniosek z całej matematyki: zielony niesie mniej więcej dziesięciokrotnie większą postrzeganą jasność niż niebieski. Dlatego czysty niebieski tekst na czerni jest bolesny i ledwo przechodzi, podczas gdy ta sama „ciemność” zieleni czyta się dobrze. Dlatego twoje niebieskie linki na ciemnym tle wydają się słabe, niezależnie od tego, jak nasycone je zrobisz. Jeśli masz zapamiętać o wzorze jedną rzecz, zapamiętaj wagi.

Dodatek + 0.05 we współczynniku to stała modelująca światło otoczenia odbijające się od ekranu, dzięki czemu nawet teoretycznie idealne czernie nigdy nie dają nieskończonego współczynnika. To powód, dla którego współczynniki kontrastu zatrzymują się na 21:1.

Trzy progi, które musisz znać

WCAG (Wytyczne dotyczące dostępności treści internetowych, utrzymywane przez W3C) definiuje niewielki zestaw liczb. Zapamiętaj je, a pokryjesz zdecydowaną większość realnej pracy.

Zauważ schemat: każdy poziom to z grubsza ten następny wyżej. Duży-AA i nietekstowy dzielą 3:1; normalny-AA i duży-AAA dzielą 4,5:1. Do zapamiętania mniej, niż się wydaje.

AA kontra AAA: który właściwie jesteś winien?

AA to standard realnego świata. To do niego odwołuje się Europejski Akt o Dostępności, ugody napędzane ADA w USA, Sekcja 508 i zasadniczo każda umowa przetargowa. Gdy prawnik lub audytor mówi „zgodny z WCAG”, ma na myśli AA. AAA to złoty poziom, a same wytyczne wprost mówią, że zgodność z AAA nie jest wymagana jako ogólna polityka dla całych witryn, częściowo dlatego, że pewne treści po prostu nie są w stanie osiągnąć 7:1 bez wyglądania na zepsute.

Moje szczere zdanie po latach: projektuj tekst zasadniczy tak, by przechodził AA z komfortem, a potem traktuj AAA jako cel, który trafiasz dla treści najważniejszych — głównej kolumny czytelniczej artykułu, komunikatów o błędach, wszystkiego, co zestresowany użytkownik lub osoba ze słabym wzrokiem musi przeanalizować pod presją. Pogoń za 7:1 na każdym podpisie i wyłączonej etykiecie to przegrana bitwa, która spłaszcza całą paletę do czerni na bieli.

Tekst normalny kontra duży — i pułapka w środku

WCAG taryfuje tekst duży łagodniej (3:1 zamiast 4,5:1), bo większe, cięższe kształty liter są czytelne przy niższym kontraście. Ale definicja „dużego” jest precyzyjna, a ludzie wciąż się mylą.

Przelicznik, który wszystkich zwodzi, to 1 pt = 1,333 px, dlatego 18 pt staje się 24 px, a 14 pt staje się ~18,5 px. A więc zwykły nagłówek 19 px to nie tekst duży według definicji WCAG — wciąż jest winien pełne 4,5:1. Pogrubiona etykieta 16 px też nie jest duża. Widziałem projekty, które „przechodziły” w czyjejś głowie, bo nagłówek „wyglądał na duży”, podczas gdy w pikselach plasował się tuż pod progiem i potrzebował surowszego współczynnika. W razie wątpliwości trzymaj tekst zasadniczy i podnagłówki przy 4,5:1, a ulgę 3:1 przyznawaj tylko naprawdę dużej czcionce wystawowej.

Kontrast nietekstowy: kryterium, o którym wszyscy zapominają (1.4.11)

Tu właśnie zawodzi większość skądinąd ostrożnych zespołów. WCAG 2.1 dodało kryterium sukcesu 1.4.11, Kontrast elementów nietekstowych, wymagające 3:1 dla dwóch kategorii niemających nic wspólnego z czytaniem:

Klasyczne naruszenie: pole wyszukiwania będące po prostu pudełkiem #FFFFFF z jasnoszarym obramowaniem #E5E7EB o grubości 1 px na białej stronie. To obramowanie ma około 1,2:1. Widzący użytkownicy ze słabym wzrokiem dosłownie nie potrafią znaleźć, gdzie kliknąć. Blady tekst zastępczy i kontury przycisków-duchów zawodzą w ten sam sposób. Czysta dekoracja jest zwolniona, podobnie jak tekst wewnątrz komponentu (ten podlega 1.4.3) — ale to, co sygnalizuje „to jest interaktywne”, musi osiągnąć 3:1 względem tego, co sąsiaduje obok.

Jak to zmierzyć — i jak to naprawić

Kontrastu nie oceniasz na oko. Mierzysz go. Mój codzienny tryb pracy:

Gdy coś nie przechodzi, oprzyj się pokusie poprawiania odcienia. Zmiana nasycenia ledwo rusza kontrast; zmiana jasności rusza go mocno. Konkretnie:

Błędy, które widuję w prawdziwych zespołach

Słowo o przyszłości: WCAG 3 bada model percepcyjny zwany APCA, który ocenia kontrast bardziej tak, jak robi to ludzkie oko, uwzględniając rozmiar i grubość tekstu łącznie, a nie płaski współczynnik. Jest obiecujący i warto go obserwować, ale na dziś to współczynniki z tego artykułu — poparte przez Understanding 1.4.3 od W3C — czynią cię zgodnym prawnie i praktycznie. Buduj do nich, zostaw sobie margines i mierz, zamiast zgadywać. Te 79,1% witryn, które zawiodły, zawiodły głównie dlatego, że nikt nie sprawdził. Sprawdzanie to cała robota.

Najczęściej zadawane pytania

Jaki jest minimalny współczynnik kontrastu WCAG dla tekstu normalnego?

Normalny tekst zasadniczy potrzebuje współczynnika kontrastu co najmniej 4,5:1 względem tła, aby spełnić WCAG na poziomie AA, który jest standardem, do jakiego odwołuje się większość przepisów i umów. Tekst duży (18 pt / 24 px zwykły lub 14 pt / ~18,5 px pogrubiony) wymaga jedynie 3:1. Surowszy poziom AAA podnosi tekst normalny do 7:1, a tekst duży do 4,5:1.

Jaka jest różnica między kontrastem WCAG AA a AAA?

AA to praktyczny, przywoływany prawnie standard: 4,5:1 dla tekstu normalnego i 3:1 dla tekstu dużego. AAA to podwyższony poziom dla użytkowników ze słabym wzrokiem: 7:1 dla tekstu normalnego i 4,5:1 dla dużego. W3C nie wymaga AAA w obrębie całej witryny, więc większość zespołów buduje tekst zasadniczy do AA z zapasem, a AAA rezerwuje dla najbardziej krytycznych treści czytelniczych.

Co liczy się jako duży tekst według WCAG?

Tekst duży to 18 pt i więcej (24 px) przy zwykłej grubości, lub 14 pt i więcej (około 18,5 px), jeśli jest pogrubiony. Przelicznik wynosi 1 pt = 1,333 px. Częstym błędem jest założenie, że nagłówek, który po prostu wygląda na duży, się kwalifikuje — zwykły nagłówek 19 px czy 20 px wciąż jest poniżej 24 px i musi spełniać pełne 4,5:1 dla tekstu normalnego.

Czy WCAG wymaga kontrastu dla przycisków i ikon, a nie tylko tekstu?

Tak. Kryterium sukcesu 1.4.11 (Kontrast elementów nietekstowych), dodane w WCAG 2.1, wymaga współczynnika 3:1 dla granic komponentów UI, które wskazują stan — obramowań pól, pierścieni fokusu, konturów pól wyboru — oraz dla obiektów graficznych, takich jak kształty ikon i elementy wykresów potrzebne do ich zrozumienia. Czysta dekoracja jest zwolniona.

Jak naprawić tekst, który nie przechodzi sprawdzenia kontrastu?

Reguluj jasność, a nie odcień czy nasycenie — te ledwo ruszają współczynnik. Przyciemnij pierwszy plan lub rozjaśnij tło, aż przekroczysz próg; w przypadku jasnego tekstu na kolorowym przycisku zwykle najszybciej jest pogłębić kolor tła. Zmierz wynik za pomocą sprawdzarki kontrastu, zamiast oceniać na oko, ponieważ różnice odcienia oszukują oko, ale nie wzór na luminancję.

Chcesz poeksperymentować z kolorami?

Wypróbuj nasz darmowy generator palet kolorów, aby znaleźć idealną harmonię — z wbudowanym sprawdzaniem kontrastu WCAG.

Otwórz generator