CSS filters & blend modes: diferencias, semejanzas y uso conjunto 17.5.18
Las diferencias principales entre los filtros y modos de fusión CSS (filter & blend-mode): sobre qué elementos actúan y cómo en función de en qué propiedad se declaren y las posibilidades de utilizar conjuntamente ambos efectos.
CSS filters & blend modes: diferencias, semejanzas y uso conjunto
Filtros y modos de fusión CSS: las propiedades filter, backdrop-filter, background-blend-mode y mix-blend-mode
La llegada de los filtros y modos de fusión CSS supuso el logro de un viejo sueño: poder alterar los colores y apariencia de los elementos manteniendo inalterado el original. Esto es, aplicar con una línea de código una serie de efectos hasta entonces reservados a los programas de edición de imágenes y al mismo tiempo hacer posible que el original se conserve tal cual.
Cambiamos cómo se muestra al visitante un elemento (su apariencia) con CSS pero no comprometemos el original que se preserva en su estado primigenio.
Esto tiene una serie de ventajas innegables. Que resumidas al mínimo serían:
- Al conservarse el original se evitan tener multitud de variaciones/copias y el peligro de perderlo por despiste al guardar una modificación.
- No es necesario disponer de un programa de edición de imágenes, conocer su manejo y tener que recurrir a él cada vez que se necesite un efecto distinto. Tú escribes una declaración CSS y el navegador se encarga del resto
- Permite cambiar los efectos "en vivo, al vuelo y bajo demanda" teniendo una sola copia del elemento.
Sujetos afectados por filter y blend-mode
Los filtros y modos de fusión CSS además de ser propiedades diferentes y aplicar una serie de efectos distintos se diferencian en otro aspecto: a qué partes del elemento afectan. O dicho de otra forma: sobre qué actúan.
Atendiendo a esto último estas son las particularidad de unos y otros:
Filter CSS
Los filtros CSS actúan (cambian la apariencia) del elemento al que se declaran: su contenido y fondo (content & background).Blend Modes CSS
Los modos de fusión CSS dependiendo en qué declaración se utilicen mezclan diferentes partes:2.1 background-blend-mode
- En esta propiedad la mezcla afecta a y sólo usa los fondos del elemento al que se declara. Sus contenidos no se ven afectados. Lo que hace la propiedad css
Background-blend-mode
es fusionar (según el valor indicado para la propiedad) los elementos del fondo (background-image
's ybackground-color
) entre sí.See the Pen Two-property CSS checkerboard by Kseso (@Kseso) on CodePen.
2.2 mix-blend-mode
- Define la forma en que los colores de un elemento deben fusionarse con el fondo. Con esta propiedad afectamos a todo (continente y contenido) haciendo la mezcla con todo lo que se encuentre debajo (eje z) de él (incluidos otros elementos).
-
backdrop-filter
Con la propiedadbackdrop-filter
(a diferencia de las anteriores) el efecto del filtro no se aplica al elemento al que se declara sino a la parte de otros elemento que se encuentre debajo (eje z) de él.
En la siguiente demo podrás ver diferentes efectos de la propiedadbackdrop-filter
dependientes tanto de su valor como de lo que haya debajo en cada momento (esto cambia al hacer scroll):
See the Pen Backdrop-Filter by Kseso (@Kseso) on CodePen.
Unos apuntes sobre esta demo:
- En el título: sólo se declara
backdrop-filter: blur(7px);
por lo que el efecto sólo se percibe al tener debajo una imagen pues el emborronado (blur) no surte efecto en los colores sólidos. - En el pie la declaración consta de dos filtros:
backdrop-filter: contrast(3) invert(.65);
uno que acentúa el contraste y otro que invierte el color. Así que su efecto también se manifiesta al pasar bajo él colores sólidos además de imágenes. - Fíjate que aunque el pie no tiene declarado un fondo (
background
los valores debackdrop-filter
hacen que parezca que sí y además su apariencia (la del fondo) cambia constantemente en función de lo que hay debajo de él en cada momento.
Si usas Firefox a continuación la puedes ver emulada
See the Pen iOS 7 background blur with CSS by Kseso (@Kseso) on CodePen.
backdrop-filter
ya es soportado por Chrome en su versión 49 (habilitando su flag)
Una buena forma de ver la diferencia entre usar la propiedad filter
y backdrop-filter
es que compares el código necesario para lograr el mismo efecto blur del post dynamic inside blur y el del h1
de la demo previa con backdrop-filter
Mixtura de filters y blend-modes
Por la naturaleza particular de cada una de estas funciones, así como por afectar a partes distintas y aplicarse en propiedades diferentes se pueden emplear conjuntamente todas o varias de cada una de estas propiedades CSS para lograr efectos o transformaciones que serán la suma de todas ellas.
Este uso conjunto ya las hemos visto en alguna que otra demo que han ido apareciendo por el blog. El resultado final es dependiente de múltiples factores: los colores iniciales de los elementos y los distintos filtros y/o modos de fusión empleados y el valor numérico utilizado en aquellos que lo admiten.
Algunos autores ya han explorado esta mezcla de filtros y blend modes CSS, seguro que algunas realizaciones te serán conocidas.
Una de las últimas en aparecer en mi radar es la librería Colofilter.css [en github] en la que su autor, @LukyVj, además de mezclar los filtros y blend modes CSS se apoya en pseudoelementos para lograr la tonalidad deseada.
Su mecánica es sencilla. Tanto en su marcado HTML de cada una de las cartas:
<div id="blend-blue-yellow-dark"
class="blend-blue-yellow-dark block"
data-color="blue-yellow"
data-tint="-dark">
:before
<img src="my_face.png">
:after
</div>
Y la magia se la deja a CSS, utilizando, para simplificar, un viejo conocido: el selector por atributo:
.filters .block {
width: 33.33%;
float: left;
overflow: hidden;
padding: 0px;
margin: 0px;
height: auto;
position: relative;
transform: scale(0.99);
cursor: pointer;
transition: opacity 0.2s ease 0s, transform 0.2s ease 0s;
}
[class^="blend"][class*="-yellow"] {
background: #FEDD31 none repeat scroll 0% 0%;
}
[class^="blend-"]::before {
content: ".blend-" attr(data-color) "" attr(data-tint);
}
[class^="blend"]::before {
position: absolute;
z-index: 3;
background: rgba(0, 0, 0, 0.4) repeat;
color: #FFF;
padding: 0.2em;
font-size: 14px;
}
[class^="blend"][class*="-blue-yellow"][class*="-dark"]::after {
mix-blend-mode: hard-light !important;
}
[class^="blend"][class*="-yellow"][class*="-dark"]::after {
filter: hue-rotate(70deg);
}
[class^="blend"][class*="-blue-yellow"]::after {
background: transparent linear-gradient(to left top, #55ACEE, #FEDD31) !important;
}
Kseso
the obCSServer ᛯ Ramajero Argonauta, Enredique Amanuense de CSS.#impoCSSible inside
Dicen que, en español, EsCss es el mejor blog de CSS. Posíblemente exageren.
@Kseso EsCss Kseso
Bravo, bravo!, ya mismo me pongo a jugar con estos nuevos juguetes, será que se puede reproducir la "doble exposición" con solo css?.
ResponderEliminarPor cierto el articulo de AlistApart se merece la traducción, es imperdible, aclara muchas cosas y creo que muchos diseñadores valoraran conocer como funcionan los modos de fusión.
Por cierto ¿Ya firmaron el voto, para que Edge lo implemente?
Como siempre maestro, un buen articulo.
Yo como que odio un poco no poder editar mi comentario después de revisar en voz alta mi redacción :(
EliminarJA! si sr :) Efecto doble exposición, solo con CSS codepen.io/g3kdigital/pen/mVqOZY?editors=110
EliminarEl no poder editar los propios comentarios (ni el editor del blog con los suyos hasta donde yo conozca) es otra de las particularidades de esta plataforma.
EliminarRespecto al efecto de la doble exposición es precisamente lo que hacen los modos de fusión. Creo recordar haberlo visto en alguna demo o pen (quizás de Yoksel o Sara Soueidan en codepen, no recuerdo).
Pero ha estado bien no ver tus comentarios hasta que no lo has conseguido tú, g3kdigital
xD =P
Por cierto, te recuerdo que puedes insertar pens ;-)
[pen]data-height="400" data-theme-id="299" data-slug-hash="mVqOZY" data-default-tab="result" data-user="g3kdigital" data-preview="true" class='codepen'[/pen]
Ya me imaginaba que alguien lo debió de hacer 1ro jeje pero la cuestión es imaginárselas uno mismo.
EliminarPor cierto, también hice este pen, donde no use svg para hacer la mascara de texto.
[pen]data-height="416" data-theme-id="299"
data-slug-hash="zrPEYq" data-default-tab="result"
data-user="Kseso" class='codepen'[/pen]
Jaja Vamos a ver sí aprendí y sí no, aquí esta el link: http://codepen.io/g3kdigital/pen/zrPEYq?editors=110