Ya he pensado en lo siguiente por un tiempo, así que ahora quiero conocer vuestras opiniones, posibles soluciones, etc.
Estoy buscando un complemento o técnica que cambie el color de un texto o cambie entre imágenes / iconos predefinidos según el brillo promedio de los píxeles cubiertos de la imagen o color de fondo de los padres.
Si el área cubierta de su fondo es bastante oscura, haga que el texto sea blanco o cambie los iconos.
Además, sería genial si el script notase si el padre no tiene un color de fondo o una imagen definidos y luego continúe buscando el más cercano (desde el elemento principal hasta su elemento principal ..).
¿Qué piensas, sabes de esta idea? ¿Hay algo similar por ahí? ejemplos de guiones?
Saludos, J.
Respuestas:
Recursos interesantes para esto:
Aquí está el algoritmo W3C (con la demostración de JSFiddle también ):
fuente
Este artículo sobre 24 formas de calcular el contraste de color puede ser de su interés. Ignore el primer conjunto de funciones porque son incorrectas, pero la fórmula YIQ le ayudará a determinar si debe utilizar un color de primer plano claro u oscuro.
Una vez que obtenga el color de fondo del elemento (o del antepasado), puede usar esta función del artículo para determinar un color de primer plano adecuado:
fuente
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; }
Interesante pregunta. Mi pensamiento inmediato fue invertir el color del fondo como texto. Esto implica simplemente analizar el fondo e invertir su valor RGB.
Algo como esto: http://jsfiddle.net/2VTnZ/2/
fuente
#808080
?mix-blend-mode
Hace el truco:Adición (marzo de 2018): A continuación, un buen tutorial que explica todos los diferentes tipos de modos / implementaciones: https://css-tricks.com/css-techniques-and-effects-for-knockout-text/
fuente
He encontrado que el script BackgroundCheck es muy útil.
Detecta el brillo general del fondo (ya sea una imagen de fondo o un color) y aplica una clase al elemento de texto asignado (
background--light
obackground--dark
), dependiendo del brillo del fondo.Se puede aplicar a elementos fijos y móviles.
( Fuente )
fuente
Si está utilizando ES6, convierta hexadecimal a RGB y luego puede usar esto:
fuente
Aquí está mi intento:
Entonces para usarlo:
Esto inmediatamente hará que el texto sea blanco o negro, según corresponda. Para hacer los iconos:
Entonces cada icono podría verse así
'save' + iconSuffix + '.jpg'
.Tenga en cuenta que esto no funcionará donde un contenedor desborde a su padre (por ejemplo, si la altura de CSS es 0 y el desbordamiento no está oculto). Hacer que eso funcione sería mucho más complejo.
fuente
Al combinar las respuestas [@ alex-ball, @jeremyharris] encontré que esta es la mejor manera para mí:
fuente