Si conoces un poquito de CSS seguro que conoces la propiedad filter. Es una propiedad que te permite aplicar diferentes filtros a tus elementos.
Hoy vengo a hablaros de mi favorito: blur y de cómo suelo utilizarlo para crear elementos muy resultones que imitan a paneles de cristal.
Vamos a ir de menos a más, así que preparaos.
¿Por dónde empezamos?
Sería algo así:
¡Así de fácil! 🥳
Y el resultado no está mal ¿No? Puedes jugar con el valor de blur para modificar la translucidez (¿existe esa palabra?) del cristal.
Hasta aquí todo bien. Y oye, si solo quieres utilizar este efecto en elementos estáticos, no necesitas más. Pero...
¿Qué pasa cuando usamos blur en elementos que se mueven? 🤔
Supongamos que quieres aplicar este efecto en una Navbar que va a ser sticky. Pues ahí nos encontramos con un pequeño problema...
¡Pruébalo tú mismo! Juega con las barras y verás que hasta que al menos un píxel de la foto no pasa por detrás del cristal, no se genera ningún blur.
¿Pero por qué pasa esto? 😨
Pues resulta que los cálculos que realiza CSS para generar el blur únicamente tienen en cuenta los píxeles que se encuentran detrás del elemento con la propiedad backdrop-filter.
Pero los cristales no son píxeles.
Los cristales de verdad doblan y reflejan la luz de un montón de formas. ¿Qué podemos hacer entonces para conseguir un efecto más resultón?
Una opción (la única que conozco por ahora, de hecho 😅) es ampliar el elemento con backdrop-filter, y luego enmascararlo con un mask-image.
¿Ves la diferencia? Queda mucho más natural.
Aquí te dejo un sandbox para que experimentes con el efecto. Pincha en Toggle Mask y verás cómo usamos mask-image para 'ocultar' parte del elemento con backdrop-filter.
¡Fíjate que el cristal ya refleja parte de la luz de la foto antes de que esta llegue a pasar por detrás!
But wait! There's more!
Si usamos la técnica anterior con otro filtro muy interesante como es brightness, podemos también emular cómo la luz incide de manera diferente en
el borde del cristal y crea una ilusión visualmente más interesante.
¡Cuidado! ¿Veis ahí ese pointer-events: none? Esto es para que el usuario pueda seguir clickando en los elementos que queden por detrás del cristal.
Recuerda, aunque lo estemos 'enmascarando', el cristal sigue ocupando más espacio del que podemos ver.
Ya no tenéis excusa. Si os cruzáis con algún cliente al que le flipe la estética cristal ahumado con esto deberíais tener todas las herramientas necesarias para dejarlo contento.