Читаемость цветовой пары текста и фона определяет, насколько отчётливо буквы и символы различаются на выбранной подложке при просмотре с экрана. Инструмент проверяет визуальную совместимость двух заданных оттенков и рассчитывает точную разницу в их яркости. Для выполнения расчёта используются два входных параметра: цвет переднего плана, которым оформлен текст, и цвет заднего плана, выступающий в роли фона. Такая проверка позволяет заранее исключить сливание шрифта с подложкой при вёрстке веб-страниц, разработке интерфейсов и подготовке графических макетов.
Визуальная оценка оттенков на глаз часто приводит к ошибкам из-за индивидуальных настроек монитора или внешнего освещения. Математический расчёт заменяет субъективное восприятие точным числовым показателем.
После ввода исходных оттенков инструмент вычисляет контрастное соотношение и формирует сводку по проверяемому сочетанию:
- численный коэффициент контрастности в диапазоне от 1:1 до 21:1, отражающий соотношение яркости между передним и задним планом;
- оценку читаемости выбранной цветовой пары применительно к тексту стандартного и крупного размера;
- статус прохождения проверки по базовым и расширенным нормативам визуальной доступности WCAG.
Полученные данные показывают, подходит ли выбранная комбинация для основного текстового массива, заголовков или элементов управления. Если итоговый коэффициент оказывается ниже допустимого порога, один из входных цветов корректируют по светлоте до достижения нужного уровня читаемости.
Порядок проверки контраста и исходные цветовые параметры
Для выполнения расчёта требуется определить точные цветовые значения двух соприкасающихся элементов макета. В качестве первого параметра выступает цвет текста, формирующий передний план композиции. Вторым параметром задаётся цвет подложки или контейнера, непосредственно на котором размещаются текстовые символы. Источником этих значений служат свойства таблиц стилей, параметры графических редакторов или спецификации дизайн-системы.
Способы цифрового представления цветов
В веб-разработке и проектировании интерфейсов за базовый стандарт отображения на экранах принято цветовое пространство sRGB. Внутри этого пространства любой оттенок для переднего и заднего плана описывается с помощью нескольких математических моделей и форматов записи.
При подготовке данных для проверки используются следующие форматы цветовых кодов:
- Шестнадцатеричный код HEX - компактная строка из шести символов после знака решётки, где каждые два знака попарно кодируют интенсивность красного, зелёного и синего свечения в диапазоне от 00 до FF. При совпадении соседних символов внутри каждой пары допускается сокращённая трёхзначная запись.
- Модель RGB - прямое указание интенсивности трёх базовых цветовых каналов с помощью десятичных чисел от 0 до 255. Нулевые значения во всех каналах дают чёрный цвет, а максимальные формируют чистый белый.
- Модель HSL - описание оттенка через три интуитивно понятные координаты: цветовой тон на круге от 0 до 360 градусов, насыщенность в процентах и светлоту в процентах. Изменение третьего параметра напрямую сдвигает цвет к белому или чёрному полюсу, что упрощает подбор читаемых пар.
- Модель HSB - схема, широко применяемая в графических редакторах, где помимо цветового тона и насыщенности используется показатель яркости свечения в процентах.
Независимо от выбранной формы записи один и тот же оттенок в пределах пространства sRGB имеет идентичные физические характеристики свечения. В таблице ниже показано, как базовые и составные оттенки записываются в различных системах координат.
| Визуальное описание | Формат HEX | Каналы RGB | Координаты HSL | Координаты HSB |
|---|---|---|---|---|
| Чистый чёрный | #000000 | 0, 0, 0 | 0°, 0%, 0% | 0°, 0%, 0% |
| Чистый белый | #FFFFFF | 255, 255, 255 | 0°, 0%, 100% | 0°, 0%, 100% |
| Тёмно-синий | #1A365D | 26, 54, 93 | 215°, 56%, 23% | 215°, 72%, 36% |
| Светло-бежевый | #F7FAFC | 247, 250, 252 | 204°, 45%, 98% | 204°, 2%, 99% |
Принцип парного сопоставления и инверсия оттенков
Контрастность не является собственным свойством отдельного цвета. Невозможно оценить читаемость шрифта в отрыве от конкретной подложки, поскольку зрительное восприятие контуров букв зависит исключительно от перепада светлоты между двумя соприкасающимися областями. Один и тот же нейтрально-серый оттенок со значением #767676 будет достаточно отчётливым на белом фоне #FFFFFF, но практически полностью сольётся с тёмно-серой плашкой #555555.
По этой причине проверка всегда проводится строго для конкретной пары: текст плюс фон. При замене одного из цветов палитры процедуру вычисления повторяют заново для новой комбинации.
Важным свойством математического сопоставления двух цветов является симметричность результата при их взаимной перестановке. Инвертирование цветовой пары - когда цвет текста назначается фону, а исходный цвет фона передаётся тексту - никак не меняет итоговый коэффициент контрастности. Разница в яркости между двумя заданными точками цветового пространства остаётся постоянной величиной независимо от того, какой именно оттенок формирует линии шрифта, а какой заполняет окружающее пространство.
Это свойство используется при разработке альтернативных цветовых схем оформления. Если тёмный текст #1A365D на светлой подложке #F7FAFC даёт определённый числовой коэффициент, то при создании инвертированного блока со светлым текстом #F7FAFC на тёмной подложке #1A365D расчётное соотношение останется прежним.
Математическая формула расчёта контрастного соотношения и относительной яркости
Симметричность результата при перестановке цветов текста и фона обусловлена устройством формулы, утверждённой спецификацией W3C. Математический алгоритм оценивает не ролевое назначение оттенков в макете, а физическую разницу их светового излучения. В основе вычисления лежит сопоставление показателей относительной яркости двух цветов.
Коэффициент контрастности рассчитывается по следующей формуле:
Contrast Ratio = (L1 + 0.05) / (L2 + 0.05)
Переменные и константы в этом выражении имеют строгое распределение:
- L1 - относительная яркость более светлого цвета из рассматриваемой пары;
- L2 - относительная яркость более тёмного цвета из пары;
- 0.05 - фиксированное слагаемое, которое компенсирует фоновую засветку экрана от внешних источников освещения и предотвращает математическое деление на ноль, когда один из цветов является абсолютно чёрным.
Поскольку большее значение всегда помещается в числитель, а меньшее - в знаменатель, итоговый коэффициент никогда не бывает дробным числом меньше единицы. Результат принято записывать в виде пропорции, например 4.5:1 или 12.6:1, где вторая часть всегда равна единице.
Понятие и вычисление относительной яркости
Относительная яркость (relative luminance) представляет собой нормированную величину светового потока в пространстве sRGB. Показатель изменяется в диапазоне от 0 для абсолютно чёрного цвета до 1 для эталонного белого цвета.
Человеческий глаз неодинаково реагирует на волны разной длины: зрительные рецепторы наиболее восприимчивы к зелёному спектру, умеренно чувствительны к красному и хуже всего улавливают синий цвет. Из-за этой особенности чистый синий цвет #0000FF визуально кажется значительно темнее чистого зелёного #00FF00, хотя в цифровом выражении оба канала заполнены на максимум (255). Чтобы математическая оценка совпадала с реальным зрительным восприятием, при расчёте яркости используются специальные весовые коэффициенты.
Перевод цифровых координат цвета в показатель относительной яркости L выполняется в три этапа:
- Нормализация каналов. Исходные восьмибитные значения каналов R, G и B из диапазона 0-255 делятся на 255. В результате получаются промежуточные коэффициенты RsRGB, GsRGB и BsRGB в пределах от 0 до 1.
- Линеаризация значений (коррекция гамма-кривой). Цветовое пространство sRGB нелинейно, поэтому к каждому нормализованному каналу применяется кусочная функция со степенной кривой. Если значение канала меньше или равно 0.04045, оно делится на 12.92. Если значение превышает 0.04045, к нему прибавляется 0.055, сумма делится на 1.055, а затем возводится в степень 2.4.
- Суммирование с учётом спектральных весов. Полученные линейные значения каналов R, G и B умножаются на константы чувствительности зрения и складываются по формуле: L = 0.2126 × R + 0.7152 × G + 0.0722 × B.
Сумма весовых коэффициентов (0.2126 + 0.7152 + 0.0722) в точности равна единице. Доля зелёного канала составляет более 71% от общей яркости оттенка, красного - около 21%, а синего - чуть более 7%. Именно поэтому изменение синей составляющей в палитре почти не влияет на итоговую читаемость текста, тогда как корректировка зелёного канала радикально меняет контрастность.
Пошаговый пример расчёта цветовой пары
Для демонстрации работы алгоритма рассмотрим сопоставление тёмно-синего цвета #1A365D и светло-серого оттенка #F7FAFC. Ниже приведена таблица промежуточных преобразований для обоих цветов от шестнадцатеричного кода до линейных компонентов.
| Этап преобразования | Цвет 1 (#1A365D) | Цвет 2 (#F7FAFC) |
|---|---|---|
| Десятичные значения (R, G, B) | 26, 54, 93 | 247, 250, 252 |
| Нормализация (деление на 255) | 0.1020, 0.2118, 0.3647 | 0.9686, 0.9804, 0.9882 |
| Линеаризация (применение степени 2.4) | 0.0103, 0.0369, 0.1094 | 0.9301, 0.9560, 0.9734 |
| Умножение на веса (0.2126, 0.7152, 0.0722) | 0.0022 + 0.0264 + 0.0079 | 0.1977 + 0.6837 + 0.0703 |
| Относительная яркость (L) | 0.0365 | 0.9517 |
После получения показателей относительной яркости большее значение (0.9517) назначается переменной L1, а меньшее (0.0365) - переменной L2. Подстановка данных в основную формулу даёт итоговое соотношение:
Contrast Ratio = (0.9517 + 0.05) / (0.0365 + 0.05) = 1.0017 / 0.0865 ≈ 11.58
Полученный результат записывается как 11.58:1 (или округляется до 11.6:1).
Диапазон шкалы контрастных соотношений
Математическая модель жёстко ограничивает шкалу возможных результатов значениями от 1:1 до 21:1. Нижняя граница 1:1 возникает при полном совпадении относительной яркости двух цветов. Это происходит не только при выборе двух идентичных кодов (например, #FFFFFF на #FFFFFF), но и при сочетании разных оттенков с одинаковой расчётной светлотой L. В такой ситуации контуры символов полностью сливаются с фоном.
Верхний предел 21:1 достигается исключительно при сопоставлении чистого белого цвета #FFFFFF (L1 = 1) и чистого чёрного цвета #000000 (L2 = 0). При подстановке этих значений в формулу числитель становится равен 1.05, а знаменатель - 0.05, что при делении даёт ровно 21. Все остальные цветовые комбинации в пространстве sRGB располагаются внутри этого числового интервала.
Интерпретация результатов по нормативам доступности WCAG
Само по себе численное значение контрастного соотношения является лишь математическим показателем. Для определения фактической пригодности цветовой пары к использованию в интерфейсах или документах полученный коэффициент сопоставляется с установленными нормативами цифровой доступности. Базовым отраслевым стандартом выступает руководство WCAG в редакциях 2.0, 2.1 и 2.2, где зафиксированы строгие минимальные пороги для визуального различения символов на фоне.
Соблюдение этих критериев имеет не только прикладное, но и юридическое значение. Требования WCAG лежат в основе национальных и международных законодательных актов, регулирующих безбарьерную цифровую среду: американских стандартов ADA и Section 508, европейского норматива EN 301 549 и директивы EAA. Государственные порталы, банковские сервисы, образовательные платформы и коммерческие сайты обязаны обеспечивать нормативный контраст для предотвращения правовых рисков и судебных исков о дискриминации пользователей.
Принцип бинарной оценки Pass и Fail
Проверка по стандартам доступности работает по жёсткому пороговому принципу. Полученный результат получает статус Pass (пройдено) только в том случае, если расчётный коэффициент равен контрольному значению или превышает его. Любое отклонение в меньшую сторону переводит цветовую пару в статус Fail (не пройдено) по выбранному критерию.
В нормативной практике не допускается математическое округление недостающих сотых долей в пользу прохождения теста. Если для выполнения требования необходим показатель 4.5:1, а проверка выдаёт результат 4.48:1, такая комбинация цветов признаётся несоответствующей стандарту. При проектировании палитры рекомендуется закладывать небольшой запас по светлоте (например, ориентироваться на 4.6:1 вместо пограничных 4.5:1), чтобы исключить ошибки при конвертации цветовых профилей.
Уровни соответствия AA и AAA
Стандарт разделяет требования к текстовому контрасту на два целевых уровня, а также учитывает размерную категорию шрифта (обычный или крупный текст). В таблице ниже приведены контрольные пороговые значения для успешного прохождения каждого уровня:
| Категория текста | Уровень AA (минимальный) | Уровень AAA (усиленный) |
|---|---|---|
| Обычный текст | 4.5:1 | 7:1 |
| Крупный текст | 3:1 | 4.5:1 |
Уровень соответствия AA
Уровень AA (критерий 1.4.3 в документации стандарта) определяет минимальную достаточную доступность. Именно этот порог закреплён в качестве обязательного в большинстве законодательных актов (включая Section 508 и EN 301 549) и служит рабочим ориентиром для подавляющего большинства веб-проектов и мобильных приложений.
Базовый порог 4.5:1 для основного массива текста рассчитан с учётом возрастных изменений зрения и снижения чувствительности к контрасту. Для крупного текста планка снижена до 3:1, так как широкие и высокие штрихи символов содержат больше пикселей и легче распознаются глазом даже при меньшей разнице в яркости с фоном.
Уровень соответствия AAA
Уровень AAA (критерий 1.4.6) задаёт требования усиленного контраста. Для обычного текста минимальное соотношение возрастает до 7:1, а для крупного - до 4.5:1. Такой запас яркости необходим для людей с выраженными нарушениями зрения, которые ещё не используют программы экранного доступа (скринридеры), но испытывают серьёзные трудности при чтении стандартных интерфейсов.
Достижение уровня AAA на всех элементах страницы существенно сужает доступную цветовую палитру, исключая большинство средне-насыщенных оттенков. Поэтому данный норматив редко применяется ко всему дизайну целиком, но активно используется для специализированных медицинских, социальных и справочных ресурсов, а также для длинных текстовых статей, предполагающих долгое непрерывное чтение.
Интерпретация диапазонов контрастности на практике
В зависимости от того, в какой интервал шкалы попадает расчётный коэффициент, цветовая пара получает однозначную оценку применимости для текстового контента:
- Диапазон от 1:1 до 2.99:1 (статус Fail по всем категориям). Контраст недостаточен для чтения любого текста. Подобные сочетания не могут использоваться для передачи смысловой текстовой информации, заголовков, подписей или навигации.
- Диапазон от 3:1 до 4.49:1 (частичное соответствие). Цветовая пара проходит минимальный порог AA только для крупного текста. Использовать такое сочетание для обычного наборного шрифта нельзя - он будет трудночитаемым.
- Диапазон от 4.5:1 до 6.99:1 (полное соответствие AA). Рабочий диапазон для большинства цифровых продуктов. Обычный текст проходит стандарт AA, а крупный текст одновременно выполняет норматив усиленного контраста AAA.
- Диапазон от 7:1 до 21:1 (полное соответствие AAA). Максимальная степень читаемости. Цветовая пара проходит все существующие проверки доступности без ограничений по размеру символов.
При анализе результатов важно проверять всю матрицу состояний. Если пара цветов набирает 5.2:1, она подходит для любого текста по стандарту AA, но при попытке применить её в проекте с жёстким требованием AAA для мелких подписей такая комбинация потребует замены или дополнительного затемнения/осветления одного из тонов.
Зависимость требуемого контраста от кегля и начертания шрифта
Сама по себе цветовая пара даёт только одно математическое значение соотношения контрастности, но решение о пригодности этого показателя напрямую зависит от параметров типографики. При проверке читаемости весь текстовый контент делится на две категории: обычный наборный текст и крупный текст (Large Scale Text). Для каждой группы действуют свои пороговые значения прохождения нормативов AA и AAA, поэтому один и тот же коэффициент может одновременно получить статус отказа для мелкой подписи и статус успешного прохождения для заголовка.
Технические критерии крупного текста по стандарту W3C
Спецификация W3C устанавливает точные числовые границы, при достижении которых шрифт переходит в категорию крупного и получает право на сниженный порог контрастности. Изначально в правилах используются типографские пункты (pt), которые при вёрстке веб-интерфейсов и цифровых макетов переводятся в CSS-пиксели (px) по стандартному коэффициенту пересчёта 1pt = 1.333px (при базовом разрешении 96 DPI).
Для классификации текста по размеру и насыщенности применяются следующие пороговые параметры:
| Категория и начертание шрифта | Размер в пунктах (pt) | Эквивалент в CSS-пикселях (px) | Минимальный порог AA | Усиленный порог AAA |
|---|---|---|---|---|
| Обычный текст (любое стандартное начертание) | Менее 18pt | Менее 24px | 4.5:1 | 7:1 |
| Обычный текст в полужирном начертании (bold) | Менее 14pt | Менее 18.66px | 4.5:1 | 7:1 |
| Крупный текст обычного начертания (regular) | От 18pt и выше | От 24px и выше | 3:1 | 4.5:1 |
| Крупный текст полужирного начертания (bold, от 700) | От 14pt и выше | От 18.66px и выше | 3:1 | 4.5:1 |
При практической вёрстке дробное значение 18.66px для полужирного шрифта обычно округляют в большую сторону - до 19px. Если задать в стилях размер 18px при свойстве font-weight: bold, такой текст формально не дотянет до норматива Large Scale Text и будет проверяться по строгим требованиям обычного текста (от 4.5:1 для уровня AA).
Снижение минимального порога с 4.5:1 до 3:1 для крупных символов связано с пространственной частотой и площадью восприятия. Крупный глиф и широкий штрих полужирного начертания занимают на экране значительно больше физических пикселей. За счёт широкой площади закрашивания глазу проще отделить форму буквы от окружающего фона даже при умеренной разнице в относительной яркости. У мелкого шрифта толщина линий вплотную приближается к ширине одного пикселя, поэтому без запаса по яркости контуры символов начинают сливаться с подложкой.
Влияние геометрии шрифта и сглаживания на фактическую читаемость
Математический расчёт контрастности опирается исключительно на коды цветов переднего и заднего плана и не знает, какой именно гарнитурой набран текст. При пограничных коэффициентах (например, в районе 3.1:1 для заголовков или 4.6:1 для основного текста) геометрические особенности конкретного шрифта могут сделать текст нечитаемым даже при формальном прохождении проверки.
На реальную разборчивость символов влияют три технических фактора:
- Сверхтонкие начертания (hairline, thin, extra-light, light с весом от 100 до 300). Даже если заголовок имеет размер 28px или 32px, при тонком начертании ширина основного штриха остаётся минимальной - зачастую в 1-1.5 пикселя. Формально такой кегль попадает в категорию крупного текста и проходит проверку при коэффициенте 3:1, но из-за отсутствия достаточной массы штриха символы выглядят бледными и плохо считываются.
- Контрастные антиквы и мелкие засечки. Шрифты с выраженной разницей между основными и соединительными штрихами, а также гарнитуры с тонкими засечками теряют целостность контура при невысоком контрасте. Тонкие перемычки и засечки визуально растворяются в фоне быстрее, чем основные вертикальные штамбы букв, что затрудняет распознавание слов при беглом чтении.
- Алгоритмы рендеринга и субпиксельного сглаживания в операционных системах. Чтобы наклонные и округлые линии букв не выглядели ступенчатыми на пиксельной сетке монитора, системы отрисовки применяют сглаживание (anti-aliasing). Граничные пиксели глифа окрашиваются не в исходный цвет текста, а в промежуточные полутона между цветом шрифта и цветом фона.
Эффект сглаживания сильнее всего сказывается на мелком кегле и тонких линиях. Если штрих буквы имеет толщину всего в один пиксель, алгоритм растеризации в попытке сгладить края может превратить всю линию в цепочку полупрозрачных усреднённых пикселей. В результате в центральной части штриха вообще не остаётся пикселей чистого исходного цвета, который подавался на вход при расчёте. Фактический локальный контраст таких символов на экране оказывается заметно ниже расчётного значения. Для компенсации этого эффекта при использовании шрифтов начертания light, гарнитур со сложной геометрией или малого кегля (12-14px) рекомендуется закладывать запас по контрастности выше минимального порога AA, ориентируясь на значения от 5.5:1 до 7:1 и выше.
Применение расчёта контрастности к UI-компонентам и состояниям интерфейса
При проектировании интерфейсов и настройке CSS-свойств расчёт контрастного соотношения применяется не только к статичным абзацам текста, но и ко всей системе дизайн-токенов. Каждый интерактивный элемент - кнопка, поле формы, переключатель или пункт меню - состоит из набора цветовых пар, которые меняются в зависимости от действий пользователя. Чтобы интерфейс оставался доступным и понятным, проверке подлежат фоновые заливки, текстовые метки, контуры, иконки и визуальные отклики на взаимодействие.
Требования к нетекстовому контрасту и порог 3:1
Помимо чтения текстовых блоков, пользователю необходимо визуально распознавать сами элементы управления, определять их границы и считывать графические символы. Согласно спецификации WCAG (критерий 1.4.11 Non-text Contrast), ко всем значимым нетекстовым элементам интерфейса и графическим объектам предъявляется минимальное требование контрастности 3:1 по отношению к прилегающему фону.
Проверка по порогу 3:1 выполняется для следующих категорий интерфейсных элементов:
-
Границы полей ввода и форм. Если текстовое поле (
input,textarea,select) имеет тот же цвет фона, что и окружающая страница, единственным ориентиром для определения его габаритов служит рамка (border). Цвет этой рамки должен иметь контраст не менее 3:1 к фону страницы. Если же само поле залито контрастным фоном (отличающимся от внешнего контейнера минимум на 3:1), дополнительная контрастная обводка не требуется. - Активные UI-компоненты и контролы. Чекбоксы, радиокнопки, ползунки (слайдеры) и тумблеры переключения должны чётко выделяться на фоне контейнера. Кроме того, визуальный маркер выбранного состояния (например, галочка внутри чекбокса или положение кружка в переключателе) должен контрастировать с внутренним фоном самого компонента минимум на 3:1.
- Иконки и функциональные пиктограммы. Если иконка используется самостоятельно без текстовой подписи (кнопка закрытия модального окна, иконка поиска, корзины или меню), её цвет сопоставляется с цветом подложки. При коэффициенте ниже 3:1 контуры пиктограммы сливаются с фоном, и пользователь не может распознать назначение кнопки.
- Информационная графика и диаграммы. В графиках, гистограммах, круговых диаграммах и прогресс-барах цветовые сегменты, линии трендов и шкалы деления несут смысловую нагрузку. Соседние сегменты диаграммы или линия графика относительно поля координат проверяются на соответствие коэффициенту 3:1, чтобы данные оставались различимыми без чтения текстовых легенд.
-
Индикаторы клавиатурного фокуса. При навигации по странице с помощью клавиши
Tabвокруг активного элемента появляется контур фокуса (CSS-свойствоoutlineилиbox-shadow). Этот индикатор должен иметь контраст не менее 3:1 как к фону, на котором он отрисован, так и (при примыкании вплотную) к границе самого элемента.
Проверка динамических состояний элементов
В дизайн-системах цвета задаются через семантические токены для разных состояний компонента: покой (
default
), наведение курсора (
:hover
), фокус (
:focus
) и момент нажатия (
:active
). Частая ошибка проектирования - проверка контраста только для базового состояния кнопки или ссылки, в то время как при взаимодействии цвета меняются и читаемость падает ниже допустимой нормы.
Например, кнопка в состоянии покоя имеет синий фон
#0056B3
и белый текст
#FFFFFF
, что даёт надёжный коэффициент 7.05:1. Для состояния
:hover
дизайнер решает высветлить фон кнопки до голубого оттенка
#5CA8FF
, оставив текст белым. В момент наведения курсора контраст падает до 2.45:1 - надпись внутри кнопки становится трудночитаемой именно тогда, когда пользователь собирается совершить целевое действие.
При формировании палитры дизайн-токенов проверка цветовой пары проводится отдельно для каждой комбинации состояний по следующей схеме:
| Состояние компонента | Проверяемая цветовая пара | Целевой порог WCAG AA |
|---|---|---|
Базовое состояние (
default
)
|
Текст метки / Фон компонента | 4.5:1 (3:1 для крупного шрифта) |
Наведение (
:hover
)
|
Текст в состоянии hover / Фон в состоянии hover | 4.5:1 (3:1 для крупного шрифта) |
Нажатие (
:active
)
|
Текст в состоянии active / Фон в состоянии active | 4.5:1 (3:1 для крупного шрифта) |
Клавиатурный фокус (
:focus
,
:focus-visible
)
|
Цвет линии обводки (outline) / Цвет внешнего фона вокруг элемента | 3:1 |
Выбранный элемент (
:checked
,
selected
)
|
Маркер выбора или фон активной вкладки / Прилегающий фон | 3:1 (для графики) и 4.5:1 (для текста внутри) |
Проблема читаемости текста в плейсхолдерах
Сложным участком при вёрстке форм остаются подсказки внутри полей ввода - атрибут
placeholder
(стилизуемый через псевдоэлемент
::placeholder
). Сложившаяся визуальная практика предполагает окрашивание замещающего текста в светло-серый цвет, чтобы пользователь визуально отличал пустое поле с подсказкой от поля с уже введёнными данными. Во многих браузерах стандартные таблицы стилей по умолчанию задают для плейсхолдера цвет с коэффициентом контрастности к белому фону в районе 2.1:1 - 2.8:1.
С точки зрения нормативов доступности, если текст в
placeholder
содержит важную инструкцию (например, требуемый формат даты, правила создания пароля или само название поля при отсутствии тега
label
), он приравнивается к обычному тексту и обязан выдерживать контраст не менее 4.5:1. На практике это решается выбором средне-серого оттенка: на чисто белом фоне
#FFFFFF
самым светлым ахроматическим цветом, проходящим порог 4.5:1, является
#767676
(коэффициент 4.54:1). При этом основной вводимый пользователем текст делается почти чёрным (например,
#1A1A1A
с контрастом 17.4:1), за счёт чего сохраняется заметная визуальная разница между подсказкой и реальным вводом.
Исключения из стандартов контрастности
Нормативы WCAG предусматривают три категории элементов интерфейса, на которые минимальные пороги контрастности не распространяются и для которых получение статуса Fail при проверке цветовой пары не считается ошибкой вёрстки:
-
Неактивные элементы управления (
disabled-контролы). Кнопки, поля ввода и пункты меню, которые в данный момент заблокированы для взаимодействия (имеют HTML-атрибутdisabledилиaria-disabled="true"), намеренно лишаются контраста. Снижение яркости текста и границ до значений 1.5:1 - 2.5:1 служит визуальным сигналом того, что функция недоступна. - Декоративные элементы и графическое оформление. Фоновые узоры, разделительные линии между блоками, иллюстрации, не несущие информационной нагрузки, а также иконки, которые полностью дублируются стоящим рядом читаемым текстом, не требуют соблюдения порога 3:1. Если пользователь с ослабленным зрением не увидит такую деталь, функциональность страницы и понимание контента не пострадают.
- Логотипы и элементы брендинга. Текст, являющийся частью логотипа или слогана торговой марки, освобождён от требований к контрасту. Это позволяет компаниям использовать фирменные цветовые сочетания в знаках без принудительного перекрашивания бренда, однако исключение не распространяется на обычный навигационный или коммерческий текст, оформленный в корпоративных цветах.
Проверка цветовых пар на сложных фонах и при наличии прозрачности
Базовая формула вычисления контрастного соотношения работает исключительно с двумя фиксированными сплошными цветами. В современной вёрстке текст часто размещается поверх полупрозрачных плашек, градиентных заливок, фотографий или блоков с размытием заднего плана. Поскольку у неоднородной подложки нет единого цветового кода, перед выполнением расчёта необходимо определить, какие именно значения переднего и заднего плана должны выступать в качестве входных параметров.
Влияние альфа-канала и сведение полупрозрачных цветов
Когда цвет текста или фоновой плашки задан в форматах RGBA или HSLA (либо через 8-значный HEX-код с альфа-каналом), его визуальная яркость зависит от нижележащего слоя. Если подставить в расчёт контрастности базовые каналы полупрозрачного цвета, отбросив значение прозрачности, результат окажется ошибочным. Например, чисто чёрный текст
rgba(0, 0, 0, 0.5)
на белом фоне
#FFFFFF
визуально воспринимается не как чёрный с контрастом 21:1, а как средне-серый.
Перед проверкой контрастной пары необходимо выполнить операцию смешивания цветов (color blending) - вычислить результирующий сплошной цвет, который фактически отображается на экране после наложения полупрозрачного слоя на непрозрачную подложку. Для каждого цветового канала (R, G и B) вычисление итогового значения при стандартном альфа-композитинге производится по линейной формуле:
C_result = C_foreground × α + C_background × (1 - α)
В этом выражении используются следующие переменные:
-
C_result- итоговое значение канала (от 0 до 255) видимого сплошного цвета, которое после перевода в нужный формат передаётся для проверки контраста; -
C_foreground- исходное значение канала верхнего полупрозрачного слоя (текста или плашки); -
C_background- значение канала сплошного непрозрачного фона, лежащего ниже; -
α- коэффициент непрозрачности (альфа-канал) в диапазоне от 0.0 (полная прозрачность) до 1.0 (полная непрозрачность).
В таблице ниже показано, как изменение альфа-канала чёрного текста
rgb(0, 0, 0)
поверх светло-серой карточки
#F0F0F0
(значения каналов R, G, B равны 240) меняет фактический видимый цвет и итоговый коэффициент контрастности:
| Заданный CSS-цвет текста | Значение альфа-канала (α) | Расчёт канала: 0 × α + 240 × (1 - α) | Результирующий сплошной цвет | Фактический контраст с фоном #F0F0F0 | Статус WCAG AA (обычный текст) |
|---|---|---|---|---|---|
rgba(0, 0, 0, 0.85)
|
0.85 | 0 + 240 × 0.15 = 36 |
#242424
|
13.61:1 | Pass |
rgba(0, 0, 0, 0.65)
|
0.65 | 0 + 240 × 0.35 = 84 |
#545454
|
6.63:1 | Pass |
rgba(0, 0, 0, 0.50)
|
0.50 | 0 + 240 × 0.50 = 120 |
#787878
|
3.95:1 | Fail (ниже 4.5:1) |
rgba(0, 0, 0, 0.35)
|
0.35 | 0 + 240 × 0.65 = 156 |
#9C9C9C
|
2.40:1 | Fail (ниже 3.0:1) |
Если полупрозрачность применена и к промежуточной подложке, и к самому тексту, сведение цветов выполняется последовательно снизу вверх: сначала вычисляется сплошной цвет подложки относительно основного фона страницы, а затем - цвет текста относительно полученного цвета подложки.
Правило наихудшего участка для градиентов, изображений и размытия
При размещении текста поверх неоднородного фона контрастность меняется от одного символа к другому. В таких случаях действует правило оценки по наименее контрастному участку: чтобы текстовый блок считался читаемым, норматив WCAG должен выполняться в самой неблагоприятной точке соприкосновения глифов с фоном. Если хотя бы часть слова сливается с подложкой, вся текстовая строка теряет читаемость.
Линейные и радиальные CSS-градиенты
В градиентных заливках (
linear-gradient
,
radial-gradient
) переход между опорными точками (color stops) создаёт множество промежуточных оттенков. Для достоверной проверки недостаточно протестировать только начальный и конечный цвет градиента, если текст растянут по всей ширине блока:
- При размещении светлого текста на градиенте для расчёта берётся самая светлая точка градиента, непосредственно над которой проходят штрихи букв.
- При размещении тёмного текста входным параметром фона служит самый тёмный участок градиента под текстовым контейнером.
- Если градиент переходит через контрастные противоположные тона (например, от тёмно-синего к светло-жёлтому), подобрать единый цвет текста без дополнительной подложки зачастую невозможно: белый текст не пройдёт проверку на светлом крае, а чёрный - на тёмном.
Фоновые фотографии и видео
Растровые изображения и видеоролики содержат тысячи пикселей разной светлоты, а при адаптивной вёрстке положение текста относительно деталей картинки постоянно смещается в зависимости от ширины экрана устройства. Определение входного цвета фона по среднему арифметическому оттенку картинки не гарантирует читаемости: светлые буквы легко попадут на блик, облако или светлый предмет в кадре.
Для стабильного соблюдения нормативов контрастности поверх медиафайлов применяются защитные приёмы оформления, позволяющие зафиксировать предсказуемый цвет фона для расчёта:
-
Наложение тонирующего оверлея (затемняющей или высветляющей полупрозрачной вуали) поверх изображения. В этом случае для проверки контраста со светлым текстом берётся самый светлый возможный цвет исходной фотографии (в предельном случае - чисто белый
#FFFFFF), смешивается с цветом оверлея по формуле альфа-канала, и полученный результат сопоставляется с цветом шрифта. - Локальная плашка непосредственно под текстовым контейнером со сплошной или плотной полупрозрачной заливкой.
-
Текстовая тень (CSS-свойство
text-shadow) или плотная контрастная обводка глифов. Тень с минимальным размытием создаёт вокруг букв собственный контур, поэтому цвет текста проверяется на контраст относительно цвета самой тени, которая изолирует символы от пёстрого фона.
Эффекты размытия и glassmorphism
Интерфейсные панели в стиле glassmorphism используют свойство
backdrop-filter: blur()
в сочетании с полупрозрачным фоном, пропуская сквозь себя размытое содержимое страницы при прокрутке. Хотя размытие сглаживает мелкие резкие детали и шум нижележащих фотографий, оно не устраняет общие перепады яркости: крупные белые блоки или тёмные баннеры под панелью по-прежнему меняют светлоту полупрозрачного слоя.
При проверке цветовой пары для «стеклянных» панелей необходимо учитывать все сценарии прокрутки страницы. Если под плавающей шапкой или модальным окном с размытием могут оказаться как тёмные, так и чисто белые секции сайта, цвет полупрозрачной плашки должен быть сведён в сплошной цвет в двух крайних состояниях: при наложении на самый светлый фон страницы и при наложении на самый тёмный. Выбранный цвет текста должен обеспечивать прохождение минимального порога контрастности с обоими полученными оттенками фона.
Зрительное восприятие контраста и особенности светлых и тёмных тем
Даже при полном отказе от полупрозрачных слоёв и переходе к сплошным цветам математическое прохождение минимального порога контрастности не всегда гарантирует одинаковый комфорт чтения во всех сценариях. Численный коэффициент отражает отношение яркостей в идеальных лабораторных условиях, однако фактическая читаемость интерфейса зависит от особенностей человеческого зрения, цветовой модели, качества дисплея и выбранной цветовой темы.
Влияние контраста на когнитивную нагрузку и доступность
Достаточный перепад светлоты между текстом и фоном позволяет глазу мгновенно выделять контуры букв, не затрачивая дополнительные усилия на распознавание символов. При заниженном контрасте скорость чтения падает, а когнитивная нагрузка возрастает: пользователю приходится дольше фокусироваться на строках, что быстро приводит к зрительному утомлению при работе с большими объёмами текста или таблицами данных.
Для слабовидящих людей и пользователей с возрастными изменениями зрения высокий контраст является базовым условием распознавания интерфейса. Не менее критичен перепад яркости для людей с различными формами дальтонизма и нарушениями цветовосприятия. Когда человек не различает определённые части спектра (например, красный и зелёный оттенки) или воспринимает страницу преимущественно в оттенках серого, цветовой тон перестаёт работать как визуальный разделитель. Если зелёный текст размещён на красном фоне равной светлоты, для пользователя с цветовой слепотой оба оттенка сольются в однородное серое пятно с коэффициентом около 1:1. Проверка контрастного соотношения защищает интерфейс от подобных ошибок, поскольку опирается исключительно на разницу в светлоте, которая остаётся различимой даже при полном отсутствии цветного зрения.
Относительная яркость в sRGB и воспринимаемая яркость в OKLCH
Стандартный расчёт контрастного соотношения по формуле W3C оценивает относительную яркость в пространстве sRGB. Несмотря на использование весовых коэффициентов для RGB-каналов, эта математическая модель не всегда точно совпадает с тем, как человеческий глаз оценивает светлоту разных цветовых тонов на практике. В частности, стандартный алгоритм часто недооценивает видимую яркость насыщенных синих и фиолетовых оттенков и переоценивает контраст некоторых жёлтых и оранжевых пар.
По этой причине два разных цвета с одинаковым расчётным коэффициентом контраста относительно белого фона могут казаться зрителю совершенно разными по плотности и читаемости. Для компенсации этого несоответствия в современном проектировании дизайн-систем наряду с обязательной проверкой по WCAG применяются перцептивно равномерные цветовые пространства, такие как OKLCH. В модели OKLCH параметр светлоты (Lightness, L) выстроен так, что любые два оттенка с одинаковым значением L воспринимаются человеческим зрением как одинаково светлые независимо от их цветового тона (Hue) и насыщенности (Chroma).
Совместное использование двух подходов решает сразу две задачи: подбор палитры в пространстве OKLCH обеспечивает визуально ровную и предсказуемую иерархию элементов, а последующий расчёт коэффициента в sRGB подтверждает соответствие цветовых пар формальным нормативам доступности.
Внешние факторы: качество экранов и засветка
Потребность в запасе контрастности (например, ориентация на уровень 4.5:1 и 7:1 вместо пограничных значений) напрямую связана с физическими условиями эксплуатации устройств. Цветовая пара, которая легко читается на откалиброванном студийном мониторе в помещении с приглушённым светом, может стать нечитаемой в реальной среде под воздействием внешних факторов:
- Засветка и блики на экране: при использовании смартфона или ноутбука на улице в солнечный день, а также под прямыми лучами офисных ламп внешний свет отражается от стеклянной поверхности дисплея. Это физически высветляет тёмные участки изображения и резко снижает фактический контраст между фоном и текстом.
- Экраны низкого качества и старые матрицы: бюджетные мониторы, проекторы и изношенные дисплеи часто имеют узкий цветовой охват, сбитую гамма-кривую и низкую собственную контрастность, из-за чего близкие по светлоте оттенки серого сливаются друг с другом.
- Сниженная яркость подсветки: в режиме экономии заряда батареи или при ручном уменьшении яркости экрана слабоконтрастный текст теряет чёткость контуров первым.
Подбор цветовых пар для светлой и тёмной темы
Математический максимум контрастного соотношения составляет 21:1 и достигается при сочетании чистого чёрного (
#000000
) и чистого белого (
#FFFFFF
) цветов. Однако на практике использование экстремального контраста 21:1 для основного полотна текста и фона редко применяется в современных интерфейсах, поскольку вызывает выраженный визуальный дискомфорт при длительном чтении.
В светлой теме абсолютно белый фон излучает максимальный световой поток, а чисто чёрный текст создаёт чрезмерно резкий перепад яркости, вызывающий напряжение глаз. В тёмной теме ситуация усугубляется оптическим явлением иррадиации, известным как гало-эффект (halation). Когда ярко-белые буквы располагаются на абсолютно чёрном фоне, свет от светящихся пикселей текста рассеивается внутри оптической системы глаза. В результате вокруг глифов возникает видимое свечение («ореол»), края букв кажутся размытыми, а строки начинают рябить при перемещении взгляда. Особенно сильно гало-эффект проявляется у пользователей с астигматизмом и на дисплеях с высокой пиковой яркостью.
Чтобы устранить зрительное утомление и гало-эффект без потери доступности, при проектировании светлых и тёмных тем чистые цвета заменяют на слегка приглушённые оттенки - off-white (мягкий белый, светло-серый) и тёмно-серый (антрацитовый, графитовый). Такое смягчение убирает резь в глазах, но при этом сохраняет высокий коэффициент контрастности (свыше 10:1), что с большим запасом перекрывает самый строгий норматив AAA (7:1). В таблице ниже приведено сравнение экстремальных и сбалансированных цветовых пар для обеих тем оформления.
| Тема и характер палитры | Цвет текста (HEX) | Цвет фона (HEX) | Коэффициент контраста | Оценка по WCAG | Особенности визуального восприятия |
|---|---|---|---|---|---|
| Экстремальная (максимум) |
#000000
|
#FFFFFF
|
21:1 | AAA | Максимальная резкость; в тёмной теме (при инверсии) вызывает сильный гало-эффект и быстрое утомление глаз при чтении длинных текстов. |
| Сбалансированная светлая |
#1A1A1A
|
#FAFAFA
|
16.67:1 | AAA | Отсутствие слепящего свечения фона и избыточной резкости глифов при сохранении отличной читаемости на солнце. |
| Мягкая светлая (для чтения) |
#262626
|
#F5F5F5
|
13.57:1 | AAA | Высокий комфорт для текстовых редакторов, блогов и документации; двукратный запас относительно порога AAA. |
| Сбалансированная тёмная |
#E5E5E5
|
#121212
|
14.18:1 | AAA | Снижение свечения текста за счёт off-white оттенка и отказ от «провала» чисто чёрного фона полностью гасят гало-эффект. |
| Приглушённая тёмная |
#D4D4D8
|
#18181B
|
11.42:1 | AAA | Оптимальный баланс для ночного режима работы с панелями управления и кодом без потери чёткости мелких шрифтов. |
При адаптации интерфейса под тёмную тему нельзя просто инвертировать цветовую палитру светлой темы. Хотя математический коэффициент контрастности пары при перестановке местами цвета текста и фона остаётся неизменным, восприятие светлых букв на тёмной подложке отличается от чтения тёмного текста на светлом листе. На тёмном фоне светлые глифы оптически кажутся чуть более толстыми из-за свечения пикселей, а насыщенные акцентные цвета (синий, красный, фиолетовый), которые давали достаточный контраст с белым фоном, на тёмно-серой подложке теряют читаемость. Поэтому для тёмной темы акцентные цвета текста и иконок высветляют (снижают насыщенность и повышают светлоту), после чего каждую обновлённую пару повторно проверяют на соответствие пороговым значениям 4.5:1 и 7:1.