Пара цветов
Обычный текст, которым набрана основная часть страницы. Именно ему нужен порог 4.5:1.
Вердикт
Почему порогов несколько
Одного числа мало: требование зависит от того, чем набран текст. Крупные буквы читаются при меньшем контрасте, поэтому WCAG разводит два порога.
«Крупный» здесь — не на глаз, а числом: от 24px обычным начертанием либо от 18.66px полужирным. Ровно на этой границе и спорят: заголовок в 20px обычным — это ещё обычный текст, и ему нужно 4.5:1, а не 3:1.
AA против AAA. AA — то, на что ориентируются почти все и что требуют регламенты. AAA берут там, где текст читают долго и подряд. Не пройти AAA — обычно не баг.
3:1 для элементов управления. К рамке поля, иконке и границе кнопки требование мягче, чем к тексту: важно заметить границу, а не прочитать буквы. Но ноль контраста у рамки — всё равно баг, и он встречается часто.
Контраст симметричен. Поменяйте текст и фон местами — число не изменится. Кнопка «Поменять местами» нужна не для этого, а чтобы быстро проверить обратную пару, если вы не уверены, что где.
Где замер расходится с глазами
Мерить надо на настоящем фоне элемента, а не на фоне страницы. Самая частая ошибка: взяли цвет текста из макета, цвет фона — из body, а между ними лежит карточка своего оттенка. Число получается верное, а к элементу отношения не имеет.
Прозрачность. Цвет с альфой сам по себе контраста не имеет — он зависит от того, что под ним. Инструмент смешивает его с указанным фоном честно; если прозрачным задан и сам фон, он считается поверх белого, и об этом сказано в вердикте.
Настоящие цвета элемента видны в DevTools → выбрать элемент → вкладка Styles: там видно и color, и background-color того элемента, который под курсором. Соседняя вкладка Computed показывает итоговое значение после всех правил — обычно нужна именно она.
Тёмная тема считается отдельно. Пара, прошедшая на светлой, на тёмной может не пройти: это другие цвета, а не те же самые наоборот.
Чего этот замер не покрывает. Текст поверх картинки или градиента — там контраст свой в каждой точке. Различимость для дальтоников — отдельная задача: два цвета могут иметь прекрасный контраст и при этом сливаться для человека, не различающего красный и зелёный.
Частые вопросы
Какой контраст считается достаточным?
По WCAG 2 уровень AA требует 4.5:1 для обычного текста и 3:1 для крупного, AAA — 7:1 и 4.5:1. Крупным считается текст от 18pt или от 14pt полужирного.
Почему серый на белом не проходит, хотя читается?
Читаемость на хорошем мониторе в тёмной комнате и читаемость на солнце — разные вещи. Коэффициент как раз про второй случай.
Что с иконками и границами полей?
Для нетекстовых элементов интерфейса минимум по AA — 3:1. Это касается границ инпутов, иконок-кнопок и фокусной рамки.