Я уже некоторое время думал о следующем, поэтому теперь хочу узнать ваше мнение, возможные решения и так далее.
Я ищу плагин или метод, который изменяет цвет текста или переключается между предопределенными изображениями / значками в зависимости от средней яркости покрытых пикселей его родительского фонового изображения или -цвета.
Если закрытая область фона довольно темная, сделайте текст белым или переключите значки.
Кроме того, было бы замечательно, если бы сценарий заметил, что родительский элемент не имеет определенного background-color или -image, а затем продолжил бы поиск ближайшего (от родительского элемента к его родительскому элементу ..).
Как вы думаете, знаете об этой идее? Есть ли что-то подобное? сценарии-примеры?
Ура, Дж.
Ответы:
Интересные ресурсы для этого:
Вот алгоритм W3C (с демонстрацией JSFiddle тоже ):
источник
Эта статья о 24 способах расчета цветового контраста может быть вам интересна. Игнорируйте первый набор функций, потому что они неверны, но формула YIQ поможет вам определить, использовать ли светлый или темный цвет переднего плана.
Как только вы получите цвет фона элемента (или предка), вы можете использовать эту функцию из статьи, чтобы определить подходящий цвет переднего плана:
источник
const getContrastYIQ = hc => { const [r, g, b] = [0, 2, 4].map( p => parseInt( hc.substr( p, 2 ), 16 ) ); return ((r * 299) + (g * 587) + (b * 114)) / 1000 >= 128; }
Интересный вопрос. Моей немедленной мыслью было инвертировать цвет фона как текста. Это включает в себя простой синтаксический анализ фона и инвертирование его значения RGB.
Примерно так: http://jsfiddle.net/2VTnZ/2/
источник
#808080
!?mix-blend-mode
делает трюк:Дополнение (март 2018 г.): Далее следует хороший учебник, объясняющий все типы режимов / реализаций: https://css-tricks.com/css-techniques-and-effects-for-knockout-text/
источник
Я нашел скрипт BackgroundCheck очень полезным.
Он обнаруживает чрезмерную яркость фона (будь то фоновое изображение или цвет) и применяет класс к назначенному текстовому элементу (
background--light
илиbackground--dark
) в зависимости от яркости фона.Может применяться к неподвижным и движущимся элементам.
( Источник )
источник
Если вы используете ES6, конвертируйте шестнадцатеричный формат в RGB, а затем можете использовать это:
источник
Вот моя попытка:
Затем использовать:
Это сразу сделает текст либо черным, либо белым по мере необходимости. Чтобы сделать значки:
Тогда каждая иконка могла выглядеть так
'save' + iconSuffix + '.jpg'
.Обратите внимание, что это не сработает, если какой-либо контейнер выходит за пределы своего родителя (например, если высота CSS равна 0 и переполнение не скрыто). Было бы намного сложнее заставить это работать.
источник
Объединив ответы [@ alex-ball, @jeremyharris], я обнаружил, что это лучший способ для меня:
источник