Gradientes granulados | Programar Plus

Navegue a través de Dribbble o Behance y encontrará diseñadores que utilizan una técnica simple para agregar textura a una imagen: ruido. Agregar ruido hace que los colores sólidos o los degradados suaves, como las sombras, sean más realistas. Pero a pesar de la afinidad de los diseñadores por la textura, el ruido rara vez se utiliza en el diseño web.

En este artículo, generaremos ruido colorido para agregar textura a un degradado con solo una pequeña cantidad de CSS y SVG. Muy bien, ¡hagamos algo de ruido!

Ilustración de Hank Washington en Behance

Ilustración de Jordan Kay en Dribbble

Zona de juegos interactiva

Compruébalo aquí. La forma más rápida de comprender lo que está sucediendo es jugar con los parámetros que componen las capas.

El truco: ruido SVG y degradados CSS

La técnica principal de este artículo se basa en una respuesta de Stack Overflow de Chris Pachl a la pregunta: ¿Puede agregar ruido a un gradiente CSS?

El truco consiste en usar un filtro SVG para crear el ruido y luego aplicar ese ruido como fondo. Colóquelo debajo de un degradado, aumente el brillo y el contraste, y eso es todo: tiene un degradado que se desvanece gradualmente.

Los ingredientes clave

Esto es con lo que estamos trabajando bajo el capó:

  • Turbulencia SVG: Este es nuestro filtro de ruido.
  • Fondo con degradado y SVG: A continuación, colocamos ese filtro en CSS como una imagen de fondo que combina el filtro con un degradado de CSS.
  • Aumenta el brillo y el contraste: Luego pasamos a CSS filter para aumentar el brillo y el contraste del ruido.
  • Mezclar degradados: Finalmente, usamos opcionalmente mix-blend-mode para filtrar aún más los colores y mezclar degradados.

Veamos en detalle cada una de estas partes.

Usando turbulencia SVG

Dentro del ámbito de SVG, podemos definir filtros, y uno de esos filtros nos permite crear ruido Perlin. Se llama <feTurbulence> y podemos definir atributos, como si es “turbulencia” o “ruido” y qué tan fino o grueso es. Bence Szabó lo explica con mucho más detalle mientras demuestra cómo se puede utilizar para crear patrones.

<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
  <filter id='noiseFilter'>
    <feTurbulence 
      type="fractalNoise" 
      baseFrequency='0.65' 
      numOctaves="3" 
      stitchTiles="stitch" />
  </filter>

  <rect width="100%" height="100%" filter="url(#noiseFilter)" />
</svg>

Este ejemplo de SVG crea un filtro y muestra un <rect> elemento que podemos usar para nuestros degradados granulados. Observe que el SVG <filter> se define por separado de la <rect>, y el <rect> simplemente lo referencia.

Juega cambiando algunas de las propiedades de <feTurbulence>

Vamos a guardar este SVG como un archivo separado. Hacemos referencia a un enlace externo para obtener el SVG en las demostraciones a lo largo de este artículo. Sin embargo, en la práctica, haría referencia a un archivo local o su propio CDN. No funciona hacer referencia al SVG por su id en CSS, por alguna razón peculiar, pero puede incorporar el SVG, como mostramos en la demostración del patio de recreo. No hacemos esto en las demostraciones por razones de legibilidad.

Creando un CSS background con SVG y un degradado

Una vez que tengamos el archivo SVG almacenado en algún lugar, podemos hacer referencia a él mediante una URL o ruta, ahora podemos usarlo en un CSS background, combinado con un degradado.

.noise {
  /* ... */
  background:
    linear-gradient(to right, blue, transparent),
    url(https://grainy-gradients.vercel.app/noise.svg);
}

El orden importa aquí. En este ejemplo particular, queremos que un color sólido (es decir, sin ruido) se convierta en ruido y luego en otro color. También queremos que un extremo del degradado sea transparente para que se vea el ruido.

Como esto:

Sin embargo, esto no es particularmente agradable porque el ruido es demasiado confuso. Necesitamos deshilacharlo y hacerlo más granulado. Podemos hacer eso por …

Aumentando el brillo y el contraste

Agregar un CSS filter hace que el ruido sea más fuerte, empujando los colores más descoloridos hacia el blanco o el negro. El filtro se aplica a todo <div>, por lo que el azul más a la izquierda es un azul diferente al azul puro con el que comenzamos.

.noise {
  /* ... */
  background: 
    linear-gradient(to right, blue, transparent), 
    url(https://grainy-gradients.vercel.app/noise.svg);
  filter: contrast(170%) brightness(1000%);  
}

Puede jugar con cómo el contraste y el brillo afectan el degradado. Aumentar el brillo y el contraste elimina los grises confusos en la siguiente demostración.

El ruido no es de color uniforme.

Si hace zoom, notará que el ruido se compone de muchos colores. El filtro SVG era colorido al principio, y el aumento del brillo y el contraste enfatizaba ciertos colores. Aunque apenas se note, si este confeti no es bienvenido, podemos continuar filtrando colores con la combinación de CSS (es decir, mix-blend-mode y background-blend-mode ).

Combinación de CSS

Hagamos un degradado granulado que cambie entre dos colores. La combinación de CSS nos permite apilar capas de color. En el siguiente ejemplo, agregamos otro <div> al marcado, colocándolo sobre el degradado original, luego aplicando mix-blend-mode: multiply; para suavizar las cosas.

<section>
  <div class="isolate">
    <div class="noise"></div>
    <div class="overlay"></div>
  </div>
</section>
.noise {
  /* ... */
  background: 
    linear-gradient(20deg, rebeccapurple, transparent), 
    url(https://grainy-gradients.vercel.app/noise.svg); 
  contrast(170%) brightness(1000%);
}
.overlay {
  /* ... */
  background: moccasin;
  mix-blend-mode: multiply;
}

Podemos usar el CSS isolation propiedad para crear un nuevo contexto de apilamiento y elegir qué se mezcla. Si tuviéramos que dejar de lado isolation en el siguiente ejemplo, el degradado y la superposición se combinarían con el color de fondo. ¡Pruébalo en el Pen y comenta esa línea!

/* Same as before */

.isolate {
  isolation: isolate;
  /* ... */
}

Algunos casos de uso

Hemos visto un ejemplo bastante simple de cómo hacer un degradado ruidoso, pero ¿dónde podría usar uno? Consideremos varios casos de uso.

Luz y sombras, con grano

¿Dónde ocurren naturalmente los degradados? Luz y sombras, para uno. Podemos aprovechar la propiedad CSS mix-blend-mode para mezclar degradados suavemente y filtrar selectivamente los colores que queremos ver en el ruido.

En el ejemplo de “sombra”, creamos un degradado oscuro y lo invertimos para crear el efecto en el ejemplo de “luz”. En ambos casos, mix-blend-mode nos permite mezclarlo con otros degradados.

Lámina holográfica

El drástico aumento de brillo y contraste crea un efecto de arco iris que recuerda a la lámina holográfica.

Llevando las cosas más lejos

Prueba el patio de recreo y juega con los diferentes parámetros para ver cómo afectan la textura.

Más allá de eso, aquí hay algunas formas de seguir jugando con esta técnica:

  • Utilice un SVG diferente: Todos los degradados de este artículo utilizan el mismo SVG, pero puedes jugar con los parámetros que generan el ruido para ajustar la aspereza y la apariencia en el patio de recreo.
  • Prueba diferentes gradientes: además linear-gradient, CSS ofrece cuatro tipos más de degradados. ¿Puede usted nombrarlos? (Aquí hay uno.)
  • Agrega más capas: Con la combinación de CSS, puede apilar tantas capas como desee y mezclarlas.
  • Aplicar diferentes filtros SVG: Hay todo tipo de filtros, incluido el desenfoque gaussiano y diferentes tipos de iluminación. Además, se pueden hacer referencia a ellos en un filtro CSS y aplicarse a cualquier elemento además de SVG.

¿Qué más se te ocurre? Háganos saber lo que descubrió en los comentarios.

Soporte del navegador

No podemos dejar de hablar de compatibilidad con navegadores aquí. El núcleo de esta técnica es compatible con todos los navegadores modernos. Como era de esperar, no funciona en Internet Explorer. Dicho esto, Internet Explorer admite SVG como fondo en CSS (pero no con el CSS real filter propiedad).

SVG como imagen de fondo CSS

Estos datos de soporte del navegador son de Caniuse, que tiene más detalles. Un número indica que el navegador admite la función en esa versión y posteriores.

Escritorio

Cromo Firefox ES DECIR Borde Safari
5 24 9 dieciséis 5

Móvil / Tableta

Android Chrome Android Firefox Androide Safari de iOS
96 95 3 4.2-4.3

Efectos de filtro CSS

Estos datos de soporte del navegador son de Caniuse, que tiene más detalles. Un número indica que el navegador admite la función en esa versión y posteriores.

Escritorio

Cromo Firefox ES DECIR Borde Safari
18 * 35 No 79 6 *

Móvil / Tableta

Android Chrome Android Firefox Androide Safari de iOS
96 95 4,4 * 6.0-6.1 *

También he notado que los navegadores basados ​​en Blink (por ejemplo, Chrome) y uno basado en WebKit (por ejemplo, Safari) implementan mix-blend-mode ligeramente diferente, así que asegúrese de probar en todos los navegadores si usa la combinación de CSS. En mis propios proyectos, he utilizado consultas de medios específicas del navegador para reconciliar manualmente las diferencias visuales con pequeños ajustes en CSS.

¡Eso es! Ahora que comprende los filtros SVG y cómo combinarlos con los filtros CSS como fondo, tiene otro efecto visual genial para agregar profundidad y textura a un diseño.