#javascript #css #colors #contrast
#javascript #css #Цвет #контраст
Вопрос:
Я ищу метод, с помощью которого мы могли бы программно выбрать наилучший цветовой контраст для применения к тексту поверх HTML-элементов с разными (непредсказуемыми) цветами фона.
Поскольку HTML-элементы будут иметь разные цвета, мы ищем метод, который сможет определить, какого цвета содержимое за текстом, а затем адаптировать цвет текста, чтобы использовать тот, который имеет наилучший контраст.
Я совершенно уверен, что это не может быть только CSS, я искал решения на Jquery, но не смог найти ни одного… у кого-нибудь есть подсказка?
[ОБНОВЛЕНИЕ] : Основываясь на первых ответах, я предполагаю, что мне нужно перефразировать. Представьте, что я создаю службу обмена изображениями, и я хочу разрешить людям помечать сами изображения. Изображения могут быть любого цвета. Как я могу подобрать правильный цвет тегов для каждого отдельного изображения?
Комментарии:
1. Вы можете попробовать скрипт проверки фона: kennethcachia.com/background-check
Ответ №1:
Я думаю, это может сэкономить будущим исследователям немного времени, у меня это работает идеально. Вставьте в функцию значения красного, зеленого и синего, и она выдаст «темный текст» или «светлый текст».
var darkOrLight = function(red, green, blue) {
var brightness;
brightness = (red * 299) (green * 587) (blue * 114);
brightness = brightness / 255000;
// values range from 0 to 1
// anything greater than 0.5 should be bright enough for dark text
if (brightness >= 0.5) {
return "dark-text";
} else {
return "light-text";
}
}
Используя некоторый код из http://particletree.com/notebook/calculating-color-contrast-for-legible-text из ответа @David’s.
Комментарии:
1. Взгляните на этот плагин jQuery github.com/joggink/jquery-colorcontrast который, кажется, реализует указанную функцию. Будьте осторожны (в настоящее время) плагин не выполняет итерацию; вам нужно вызвать ‘each’ самостоятельно
Ответ №2:
Взгляните на http://www.0to255.com . Достаточно одного взгляда на градиенты, представленные на сайте, чтобы сразу понять, что к чему. Вам придется ломать голову, но только около 20 секунд. Это отличный сайт для решения таких проблем и потрясающий источник идей для программных решений. И здесь нет никакой математики: просто вставьте несколько байтов для значений rgb и вперед.
Комментарии:
1. 1 за полезный ресурс, хотя я не уверен, что он конкретно отвечает на вопрос!
2. Спасибо за ссылку, но там не сказано, как я могу на самом деле получить цвет под текстом!
3. Ах, да. Теперь я вижу, что забежал вперед. Вы должны использовать Javascript, DHTML и DOM. В Javascript найдите объект, цвет текста которого вам нужно изменить; извлеките атрибут background-color из этого объекта; а затем перейдите к выбору цвета для текста тега. Это ближе к ответу, который вы ищете?
4. @Julien Genestoux — Что касается изображений: лично мне никогда бы даже в голову не пришло пытаться интегрировать цвета на фотографии, чтобы создать своего рода составной цвет фона, на фоне которого можно отображать текст тега контрастным цветом. Вместо этого я бы всегда помещал белую каплю поверх фотографии и отображал черный текст тега на этой белой капле. Просто мое мнение; без сомнения, существуют классные алгоритмы, которые вычислят хорошее приближение к среднему цвету фона. Орех, просто говоря за себя, я бы не стал пытаться сделать такую вещь.
Ответ №3:
Теперь в CSS есть свойство с именем mix-blend-mode
(в настоящее время только в черновике), которое можно использовать для достижения чего-то подобного тому, что вы хотите.
.contrasting-text {
mix-blend-mode: difference;
}
CodePen кто-то собрал, демонстрируя это:https://codepen.io/thebabydino/pen/JNWqLL
Ответ №4:
Это мой любимый ресурс для вычисления «читаемости» (коэффициента контрастности) двух цветов.
W3C предполагает, что между текстом и фоном за текстом существует коэффициент контрастности не менее 5: 1http://www.w3.org/TR/2007/WD-WCAG20-TECHS-20070517/Overview.html#G18
Со страницы:
Показанный выше уровень соответствия является наивысшим из встреченных. Уровень соответствия WCAG 2.0 AA и предлагаемый уровень обновления раздела 508 основаны на достижении коэффициента контрастности 3: 1 для текста размером 18 точек (14 точек, если выделено жирным шрифтом) или больше или 4,5: 1 для текста размером менее 18 точек. Уровень соответствия WCAG 2.0 уровню AAA считается достигнутым, когда соотношение контрастности 7: 1 для текста менее 18 баллов и 4,5: 1 для текста 18 баллов (14 баллов, если выделено жирным шрифтом) или больше.
Комментарии:
1. Извините, но это не ответ на вопрос. Да, это было бы, если бы я мог определить цвет под моим текстом, но я не могу. Как я могу?
2. Вы можете определить текущий цвет фона элемента с помощью JavaScript: $(‘.myclass’).css(‘background-color’) с помощью этого значения вы можете рассчитать уровень контрастности любого другого цвета. Я предполагаю, что вы хотите использовать jQuery, поскольку вы упомянули, что ищете его.
3. 2 проблемы: как мне определить «myid»? Что, если это изображение?
4. Если ваш фон представляет собой изображение, я бы не пытался автоматизировать обработку цветов на стороне клиента (с помощью canvas) — я бы рассмотрел решение на стороне сервера, поскольку у него будет меньше проблем с кроссбраузерностью и он будет лучше масштабироваться.
Ответ №5:
Вот еще один подход, который я получил от GitHub, где они применяются к цвету меток выпуска. На самом деле он опирается на пользовательские свойства CSS с некоторыми вычислениями.
.hx_IssueLabel {
--label-r:0;
--label-g:0;
--label-b:0;
--lightness-threshold:0.453;
--perceived-lightness:calc(((var(--label-r) * 0.2126) (var(--label-g) * 0.7152) (var(--label-b) * 0.0722)) / 255);
--lightness-switch:max(0, min(calc((var(--perceived-lightness) - var(--lightness-threshold)) * -1000), 1));
background:rgb(var(--label-r), var(--label-g), var(--label-b));
color:hsl(0, 0%, calc(var(--lightness-switch) * 100%));
}
Вам нужно будет отдельно установить канал RGB в пользовательских свойствах для цвета фона, тогда цвет текста изменится с черного на белый, изменив канал яркости на цвет HSL. Яркость рассчитывается с помощью алгоритма, который получает RGB в качестве входных данных.
Ответ №6:
Всего за одну строку это решает проблему:
function getContrast50($hexcolor)
{
return (hexdec($hexcolor) > 0xffffff/2) ? 'white':'black';
}
Если контраст нужно поменять местами, просто замените белое на черное, и это сделает свое дело. В php.
Комментарии:
1. Как указано в предыдущем комментарии, это PHP-код, а не Javascript. функция hexdec существует в PHP, а не в JS