Цветовой контраст WCAG: формула, требования и инструменты
Полный гайд по контрасту: формула luminance, требования WCAG 2.1/2.2 (4.5:1, 3:1), 7 частых ошибок, инструменты Chrome DevTools и WebAIM Checker.
Андрій Вдовин
Найпоширеніша WCAG-помилка
За даними WebAIM Million 2025, 83.6% сайтів мають проблеми з контрастом тексту. Це найбільш масова помилка доступності — і одна з найпростіших у виправленні. Не потрібен ARIA, не потрібен рефакторинг JS — лише правильна палітра кольорів.
Що таке коефіцієнт контрасту
Контраст у WCAG вимірюється як співвідношення відносної яскравості (relative luminance) двох кольорів. Формула задана у специфікації:
contrast ratio = (L1 + 0.05) / (L2 + 0.05)
де L1 — яскравість світлішого кольору,
L2 — яскравість темнішого.
Діапазон: від 1:1 (однакові кольори) до 21:1 (чорний на білому).Це не суб'єктивна оцінка «світліший/темніший», а математичне співвідношення. Тому два кольори що візуально здаються близькими можуть давати 4.5:1, а два «контрастні» — лише 2.1:1.
Вимоги WCAG 2.1 / 2.2
| Елемент | Level AA | Level AAA |
|---|---|---|
| Звичайний текст (< 18pt або < 14pt bold) | 4.5:1 | 7:1 |
| Великий текст (≥ 18pt або ≥ 14pt bold) | 3:1 | 4.5:1 |
| Бордюр кнопок, інпутів, іконок (нетекстові елементи) | 3:1 | — |
| Focus indicator (WCAG 2.2) | 3:1 | — |
| Декоративний текст, лого | Без вимог | Без вимог |
Критерії: 1.4.3 Contrast (Minimum), 1.4.6 Contrast (Enhanced), 1.4.11 Non-text Contrast, 2.4.11 Focus Not Obscured (WCAG 2.2).
7 поширених помилок контрасту
- 1Сірий текст на білому (#999 / #fff) — контраст 2.85:1. Виглядає «легко», але провалює WCAG AA. Заміна на #767676 дає рівно 4.54:1.
- 2Placeholder text занадто блідий — більшість UI-фреймворків ставить placeholder #ccc на #fff (1.6:1). За WCAG 2.1, якщо placeholder містить інформацію — він має задовольняти 4.5:1.
- 3Текст на градієнті або фото — контраст потрібно перевіряти в найсвітлішій точці фону. Часто рятує темне напівпрозоре оверлей (rgba(0,0,0,0.4)) або text-shadow.
- 4Disabled-стани кнопок — за WCAG disabled-елементи виключаються з вимог 1.4.3. Але якщо ваш «disabled» виглядає так, що користувач намагається натиснути — це accessibility проблема UX-рівня.
- 5Колір як єдиний носій інформації — «червоне = помилка, зелене = успіх». Не працює для дальтоніків (8% чоловіків). Додавайте іконку, текст або pattern.
- 6Іконки без бордюру — світло-сіра іконка search без контейнера може провалити 1.4.11. Або підвищіть контраст іконки, або дайте їй фон-плашку 3:1.
- 7Темна тема забута — якщо у вас є light/dark switch, контраст потрібно перевіряти окремо для кожного режиму. Часто dark mode «з коробки» інвертується нерівномірно.
Інструменти для перевірки
- Chrome DevTools — Inspect element, на вкладці Styles натисніть на color → відкриється Contrast ratio з оцінкою AA/AAA.
- WebAIM Contrast Checker — онлайн-калькулятор з двома полями, миттєвий результат і всі чотири WCAG-перевірки.
- InclusiveWeb Contrast Checker — наш безкоштовний інструмент із підтримкою HEX/RGB/HSL, перевірки для текстових і нетекстових елементів за WCAG 2.1/2.2.
- axe DevTools / Lighthouse — сканують сторінку повністю і знаходять усі контрастні провали разом з пораженими селекторами.
- Figma plugins (Stark, A11y) — перевірка контрасту прямо у дизайні до того, як код буде написаний.
Як побудувати accessible-палітру з нуля
Замість того щоб ловити порушення по сторінках, легше відразу визначити дизайн-токени з гарантованим контрастом:
- 1Виберіть текстові токени — text-primary (4.5:1+ на фоні), text-secondary (4.5:1+ на фоні), text-muted (3:1+ для великого тексту або декоративного).
- 2Перевірте brand-колір — основний колір бренду (для кнопок, посилань, акцентів) повинен давати 4.5:1 з фоном для текстових ситуацій. Якщо ні — створіть «AA-варіант» (трохи темніший для тексту).
- 3Документуйте у дизайн-системі — кожен токен має пояснення: де його можна використовувати, де ні. «text-muted ❌ не для важливої інформації».
- 4Інтегруйте перевірки у CI — pa11y або axe-core у GitHub Actions: PR з контрастним провалом автоматично не зливаються у main.
Швидкий старт
Скористайтесь нашим контраст-чекером щоб перевірити пару кольорів за секунду — він показує і WCAG-оцінки, і пропозиції найближчого AA-сумісного кольору.
Часті питання
Як перевірити контраст для тексту на фото або градієнті?
Найбільш суворо — взяти найсвітлішу точку фону за тестовою областю тексту. Практично простіше — додати темне напівпрозоре оверлей (rgba(0,0,0,0.4–0.6)) між фоном і текстом, тоді ви контролюєте фоновий колір. Інший варіант — text-shadow з протилежним кольором для виділення країв.
Чи можна використовувати opacity замість зміни кольору?
Можна, але обережно. opacity: 0.6 на text-primary над білим фоном візуально перетворить його у text-muted з реальним контрастом ~5.4:1 замість 9:1. Перевіряйте остаточний візуальний результат, а не CSS-токени.
Як виправити контраст на тисячах сторінок?
Якщо проблема в дизайн-токенах — централізована заміна змінних CSS виправляє весь сайт. Якщо колір захардкоджений inline у HTML/CMS — InclusiveWeb Автофікс через DNS-проксі переписує style-атрибути на льоту, не торкаючись вихідного коду.
Що з контрастом у WCAG 3.0?
WCAG 3.0 (на стадії робочого драфту) пропонує нову формулу APCA (Accessible Perceptual Contrast Algorithm), яка краще моделює реальне сприйняття. APCA враховує розмір шрифту і товщину. Поки що це дослідницький інструмент: офіційно WCAG 2.1/2.2 діятимуть до кінця 2027 року як мінімум.
Джерела та посилання
- WCAG 2.1 — 1.4.3 Contrast (Minimum)
- WCAG 2.1 — 1.4.11 Non-text Contrast
- WebAIM Contrast Checker
- WebAIM Million Report 2025
- APCA — нова формула контрасту для WCAG 3.0
Останнє оновлення: 09.05.2026