Já pensei no seguinte por um tempo, então agora quero saber suas opiniões, soluções possíveis e assim por diante.
Estou procurando um plugin ou técnica que mude a cor de um texto ou alterne entre imagens / ícones predefinidos dependendo do brilho médio dos pixels cobertos da imagem de fundo ou cor do pai.
Se a área coberta do fundo for bastante escura, deixe o texto branco ou troque os ícones.
Além disso, seria ótimo se o script notasse se o pai não tem cor de fundo definida ou imagem e então continuasse a pesquisar o mais próximo (do elemento pai ao elemento pai ...).
O que você acha, sabe sobre essa ideia? Já existe algo semelhante por aí? exemplos de script?
Saúde, J.
Respostas:
Recursos interessantes para isso:
Aqui está o algoritmo W3C (com demonstração JSFiddle também ):
fonte
Este artigo sobre 24 maneiras de calcular o contraste de cores pode ser do seu interesse. Ignore o primeiro conjunto de funções porque elas estão erradas, mas a fórmula YIQ o ajudará a determinar se deve ou não usar uma cor de primeiro plano clara ou escura.
Depois de obter a cor de fundo do elemento (ou ancestral), você pode usar esta função do artigo para determinar uma cor de primeiro plano adequada:
fonte
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; }
Pergunta interessante. Meu pensamento imediato foi inverter a cor do fundo como o texto. Isso envolve simplesmente analisar o plano de fundo e inverter seu valor RGB.
Algo assim: http://jsfiddle.net/2VTnZ/2/
fonte
#808080
!?mix-blend-mode
faz o truque:Adição (março de 2018): A seguir, um bom tutorial explicando todos os diferentes tipos de modos / implementações: https://css-tricks.com/css-techniques-and-effects-for-knockout-text/
fonte
Achei o script BackgroundCheck muito útil.
Ele detecta o brilho geral do fundo (seja uma imagem de fundo ou uma cor) e aplica uma classe ao elemento de texto atribuído (
background--light
oubackground--dark
), dependendo do brilho do fundo.Pode ser aplicado a elementos estáticos e em movimento.
( Fonte )
fonte
Se você estiver usando ES6, converta hex para RGB e use o seguinte:
fonte
Aqui está minha tentativa:
Então, para usá-lo:
Isso tornará o texto imediatamente preto ou branco, conforme apropriado. Para fazer os ícones:
Então, cada ícone pode ser semelhante a
'save' + iconSuffix + '.jpg'
.Observe que isso não funcionará quando algum contêiner estourar seu pai (por exemplo, se a altura do CSS for 0 e o estouro não estiver oculto). Fazer isso funcionar seria muito mais complexo.
fonte
Ao combinar as respostas [@ alex-ball, @jeremyharris], descobri que esta é a melhor maneira para mim:
fonte