Generador CSS

Generador de filtros CSS

Los nueve filtros de CSS más drop-shadow, probados sobre una imagen de verdad. Mueve los controles, mira el resultado y copia la cadena. Solo sale en el código lo que de verdad cambia algo.

Vista previa

Imagen de muestra de Lienzo: fondo oscuro con manchas de luz violeta y turquesa y el nombre de la marca

Preajustes

CSS generado

Sin filtros

              

¿Necesitas el fondo antes que el filtro? Pásate por el generador de degradados.

Qué hace cada filtro, en una frase

  • blur() — difumina el contenido mezclando cada píxel con sus vecinos; se mide en píxeles y es el único que crece hacia fuera del borde.
  • brightness() — multiplica la luz de cada píxel: por debajo del 100 % oscurece, por encima quema los claros.
  • contrast() — separa los tonos del gris medio, así que aumenta la diferencia entre luces y sombras.
  • grayscale() — quita el color de forma progresiva hasta dejar solo la luminancia.
  • hue-rotate() — gira todos los tonos por la rueda de color los grados que le indiques, sin tocar saturación ni brillo.
  • invert() — cambia cada color por su opuesto; al 50 % toda la imagen colapsa en un gris plano.
  • opacity() — hace translúcido el elemento, igual que la propiedad opacity pero encadenable con el resto.
  • saturate() — sube o baja la intensidad del color; a 0 % equivale a blanco y negro, por encima de 200 % entra en territorio de póster.
  • sepia() — vira la imagen a un marrón cálido de fotografía antigua.
  • drop-shadow() — proyecta una sombra que sigue la silueta con transparencia del contenido, no el rectángulo de su caja.

El orden de la cadena no es decorativo

filter no es una lista de ajustes independientes: es una cadena de revelado. Cada función recibe la imagen que dejó la anterior, así que cambiar el orden cambia el resultado. grayscale(100%) hue-rotate(90deg) no hace absolutamente nada con el giro de tono, porque ya no queda color que girar; al revés, hue-rotate(90deg) grayscale(100%) sí produce un gris distinto, porque cada tono aporta una luminancia diferente.

Este generador escribe siempre la cadena en el mismo orden, y está elegido para que cada paso tenga sentido sobre el anterior: primero el revelado tonal (brightness, contrast), después el color (saturate, hue-rotate), luego las conversiones que se comen el color (grayscale, sepia, invert), a continuación la óptica (blur y el drop-shadow, que así se calcula sobre la silueta ya procesada) y al final opacity, para que atenúe el conjunto incluida la sombra. Si copias la cadena y reordenas a mano, cuenta con que el resultado se moverá.

Otro detalle que ahorra disgustos: aquí solo entra en el código lo que está fuera de su valor neutro. brightness(100%) o blur(0px) no aportan nada y sí obligan al navegador a montar la tubería de filtrado, además de ensuciar la hoja de estilos.

El desenfoque es el filtro caro

La mayoría de los filtros son baratos: brightness, contrast, saturate o grayscale calculan cada píxel por su cuenta y la tarjeta gráfica los resuelve casi gratis. blur y drop-shadow son otra historia, porque cada píxel necesita leer a sus vecinos. El coste sube con el área de la superficie y con el radio, y se dispara si además hay una animación por medio.

Tres formas de mitigarlo, de la más útil a la más agresiva. Primero, reduce la superficie: desenfoca una imagen de 400 px, no un fondo a pantalla completa. Segundo, aísla el elemento en su propia capa con will-change: filter o transform: translateZ(0), para que el navegador no vuelva a pintar media página en cada fotograma; ponlo solo en el elemento que se anima y quítalo cuando termine, porque cada capa consume memoria de vídeo. Y tercero, si el desenfoque es fijo y no cambia nunca, hornéalo en la imagen antes de subirla: un PNG ya desenfocado cuesta cero en tiempo de ejecución.

backdrop-filter, el pariente del efecto cristal

filter afecta al elemento y a su contenido. backdrop-filter hace lo mismo pero con lo que hay detrás, dejando intacto lo de dentro. Es exactamente lo que necesitas para el efecto cristal: un panel con un fondo semitransparente y backdrop-filter: blur(12px) desenfoca la página que queda debajo mientras el texto de encima sigue nítido. Acepta las mismas funciones que filter, con la misma regla de orden y el mismo coste de rendimiento, así que conviene reservarlo para cabeceras fijas y tarjetas pequeñas.

Si vas por ese camino, cuida el contraste del texto que va encima: sobre un fondo desenfocado el ratio real depende de la foto que haya debajo. Compruébalo con colores en vivo, y si quieres entender por qué 4.5:1 es la cifra que importa, está explicado en la guía de teoría del color. El resto de generadores de la categoría están en código web.

Preguntas frecuentes

¿Los filtros CSS afectan al rendimiento de la página?

Sí, y no todos igual. brightness, contrast, saturate, grayscale o sepia se resuelven muy rápido en la tarjeta gráfica porque cada píxel se calcula por su cuenta. blur y drop-shadow son los caros: obligan al navegador a mirar los píxeles vecinos, y el coste crece con el área de la superficie y con el radio. En una miniatura no lo notarás; en un fondo a pantalla completa que además se anima, sí.

¿Por qué cambia el resultado si cambio el orden de los filtros?

Porque cada función recibe la imagen que dejó la anterior, como una cadena de revelado. grayscale(100%) seguido de hue-rotate no hace nada, porque ya no queda color que girar, mientras que al revés el gris final sí cambia. Con blur y drop-shadow pasa lo mismo: la sombra se calcula sobre la silueta que le llega, así que desenfocar antes o después da resultados distintos.

¿Cuál es la diferencia entre filter y backdrop-filter?

filter afecta al elemento y a todo su contenido. backdrop-filter afecta solo a lo que hay detrás del elemento y deja intacto lo que hay dentro. Es la propiedad del efecto cristal: un panel con fondo semitransparente y backdrop-filter: blur() desenfoca la página que queda debajo y mantiene nítido el texto encima. Necesita que el fondo del elemento sea al menos parcialmente transparente.

¿Se pueden animar los filtros CSS?

Sí, filter es una propiedad animable y transiciona bien entre valores del mismo tipo. La condición es que los dos estados tengan las mismas funciones y en el mismo orden: de blur(0px) a blur(8px) interpola de forma suave, pero pasar de none a una cadena de tres funciones produce un salto seco. Por eso conviene escribir el estado de reposo con los valores neutros en vez de usar none.