Я знаю, что ручной выбор, основанный на человеческом суждении, всегда будет превосходить эвристический алгоритм для подобных вещей... к сожалению, это не вариант. :)
Итак, учитывая определенный цвет фона, как алгоритм может определить, является ли белый текст плохим выбором для наложения (альтернативой может быть черный)? Например, белый текст на #F44444 отлично читается, но белый текст на #FBBBBB — это проблема!
Я предполагаю, что это будет связано с представлением цвета в такой модели, как HSL? А затем проверить, соответствуют ли насыщенность и/или яркость определенным условиям?
Большая часть вашей работы уже сделана за вас, если не вся.
Консорциум World Wide Web (w3) публикует рекомендации по доступности веб-контента. Их рекомендации определяют три разных уровня соответствия цветового контраста в зависимости от размера и релевантности текста. Для этой цели предусмотрен анализатор цветового контраста.
Он рекомендует:
Контрастность (минимум): визуальное представление текста имеет коэффициент контрастности не менее 4,5:1, за исключением крупного текста (18pt.+) не менее 3:1.
коэффициент контрастности (с сайта w3.org/TR/WCAG20/#contrast-ratiodef)
(L1 + 0,05) / (L2 + 0,05), где
относительная яркость (от w3.org/TR/WCAG20/#relativeluminancedef)
относительная яркость любой точки в цветовом пространстве, нормализованная до 0 для самого темного черного и 1 для самого светлого белого.
Примечание. Для цветового пространства sRGB относительная яркость цвета определяется как
L = 0,2126 * R + 0,7152 * G + 0,0722 * B,
где R, G и B определяются как:
если RsRGB <= 0,03928, то R = RsRGB/12,92, иначе R = ((RsRGB+0,055)/1,055) ^ 2,4
если GsRGB <= 0,03928, то G = GsRGB/12,92, иначе G = ((GsRGB+0,055)/1,055) ^ 2,4
если BsRGB <= 0,03928, то B = BsRGB/12,92, иначе B = ((BsRGB+0,055)/1,055) ^ 2,4
а RsRGB, GsRGB и BsRGB определяются как:
RsRGB = R8 бит/255
GsRGB = G8 бит/255
BsRGB = B8 бит/255
Символ "^" является оператором возведения в степень. (Формула взята из [sRGB] и [IEC-4WD]).
Рекомендации w3 определяют три уровня соответствия их рекомендациям. Приоритет 1, 2 и 3. Их алгоритмы цветового контраста 2.0 используют два из них — Приоритет 2 (AA) и Приоритет 3 (AAA). Необходимость достижения соответствия AAA зависит от вашей целевой аудитории. Подробнее об этом читайте на сайте w3. Для крупного текста (более 18 пунктов) коэффициент контрастности для AA составляет 3:1, а для AAA — 5:1. Для мелкого текста это 5:1 для АА и 7:1 для ААА.
Дополнительную информацию о доступности и соответствии можно найти в
Руководстве по доступности веб-контента 2.0.
Больше информации о контрасте (минимум); в частности, принципы понимания SC 1.4.3 Визуальное представление текста и изображений текста… можно найти:
Понимание SC 1.4.3
Мой подход состоял бы в том, чтобы сначала преобразовать цвет фона в его эквивалент в градациях серого. Если значение яркости (по шкале от 0 до 100%) «слишком близко» к белому, цвет текста должен измениться на черный. «Слишком близко» несколько субъективно, но я бы начал тестировать с яркостью 65%, чтобы вызвать переключение на черный текст. Белый текст должен быть разборчивым на цветном фоне с более темным преобразованным значением яркости. Удачи!
Стэн
клуб
Стэн
Стэн