Menu

Desenfoque y filtros en CSS: blur(), grayscale, brightness

filter: blur(5px) desenfoca un elemento, y backdrop-filter: blur() desenfoca lo que hay detrás. Aprende todas las funciones de filter (brightness, contrast, grayscale, sepia, saturate, hue-rotate, invert, drop-shadow) con controles deslizantes en vivo, cómo combinarlas y el problema de los bordes desenfocados.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Desenfocar un elemento

filter: blur() recibe una longitud, el radio del desenfoque. Cuanto mayor es, más desenfocado queda el elemento:

filter funciona en cualquier elemento, no solo en imágenes: un div desenfocado también desenfoca su texto, su borde y sus hijos. Fíjate en los bordes suaves de las imágenes desenfocadas: el desenfoque extiende la imagen hacia afuera y la mezcla con la zona transparente que la rodea. La solución está más abajo, en "El problema de los bordes desenfocados".

Desenfocar el fondo: backdrop-filter

Para desenfocar lo que hay detrás de un elemento (un panel de vidrio esmerilado sobre una foto o una página), usa backdrop-filter. El contenido propio del elemento sigue nítido. Necesita un fondo translúcido para que se vea el desenfoque:

Las rayas y los círculos se ven nítidos alrededor del panel y desenfocados detrás de él, mientras que el texto del panel no cambia. Mantén el texto legible: un tono más claro o más oscuro en el color de fondo ayuda sobre imágenes recargadas.

Todas las funciones de filter, en vivo

Mueve cualquier control deslizante. La línea debajo de la imagen es el valor exacto de filter, listo para copiar:

Solo se escriben las funciones que moviste de su valor neutro, así el valor queda corto. brightness(1) o blur(0px) no cambian nada, así que no hay motivo para enumerarlas.

Funciones de filter

FunciónValor neutroQué haceEjemplo
blur(r)0desenfoque gaussiano con radio rblur(4px)
brightness(n)1más oscuro por debajo de 1, más claro por encimabrightness(0.7)
contrast(n)1más plano por debajo de 1, más intenso por encimacontrast(1.3)
grayscale(n)01 (o 100%) es gris por completograyscale(100%)
sepia(n)0tono marrón cálidosepia(0.6)
saturate(n)10 es gris, por encima de 1 más vivosaturate(1.5)
hue-rotate(a)0degdesplaza todos los tonos por la rueda de colorhue-rotate(90deg)
invert(n)01 es un negativo de color completoinvert(1)
opacity(n)1como la propiedad opacityopacity(0.5)
drop-shadow(x y blur color)una sombra que sigue la formadrop-shadow(2px 4px 6px rgb(0 0 0 / 0.3))

Los números también pueden ser porcentajes (grayscale(100%) es igual a grayscale(1)). Varias funciones van en un mismo valor, separadas por espacios, y se aplican en orden: filter: grayscale(1) sepia(1) da un tinte marrón, mientras que sepia(1) grayscale(1) termina en un gris simple.

drop-shadow sigue la forma

box-shadow siempre es un rectángulo (como mucho con esquinas redondeadas). drop-shadow() se dibuja a partir de los píxeles visibles, así que un ícono transparente recibe una sombra con el contorno del ícono:

La primera estrella proyecta una sombra cuadrada desde su caja invisible. La segunda proyecta una con forma de estrella. A diferencia de box-shadow, drop-shadow() no tiene valor de expansión ni inset; la página de box-shadow los explica.

El problema de los bordes desenfocados

Una imagen desenfocada se desvanece en sus bordes, porque el desenfoque atrae los píxeles transparentes que la rodean. Para mantener un borde nítido (en un fondo principal desenfocado, por ejemplo), pon la imagen en un contenedor con overflow: hidden y agranda un poco la imagen para que el borde suave quede recortado:

.hero { overflow: hidden; }
.hero img { filter: blur(8px); transform: scale(1.1); }

Efectos hover con filter

filter se puede animar con transition, así que una pared de logos que pasa de gris a color o una tarjeta atenuada hasta el hover son dos reglas:

Pasa el mouse (o llega con Tab) por un recuadro y su color aparece poco a poco.

Conviene saber

  • Rendimiento. Los radios de desenfoque grandes sobre áreas grandes son lo más costoso, sobre todo backdrop-filter en elementos que se mueven o se desplazan. Pruébalo en un teléfono.
  • Legibilidad. Nunca desenfoques un texto que la gente necesita leer, y comprueba el contraste del texto sobre un panel esmerilado.
  • Apilamiento. Cualquier filter distinto de none crea un nuevo contexto de apilamiento y se convierte en el bloque contenedor de los descendientes con position: fixed, igual que transform.

Errores comunes

  • filter: blur(5). El radio necesita unidad: blur(5px).
  • Usar filter: blur() para un panel esmerilado. Desenfoca el propio texto del panel. Usa backdrop-filter con un fondo transparente.
  • Un backdrop-filter que no muestra nada. El fondo del elemento debe ser al menos parcialmente transparente, y debe haber algo detrás.
  • Dos declaraciones filter. La segunda reemplaza a la primera. Pon todas las funciones en un mismo valor.
  • Sombras con forma de caja en íconos transparentes. Usa filter: drop-shadow() en lugar de box-shadow.

Preguntas frecuentes

¿Cómo desenfoco un elemento en CSS?

Usa filter: blur(5px);. La longitud es el radio del desenfoque: 0 es nítido y los valores mayores desenfocan más. Desenfoca el elemento y todo lo que contiene, incluidos su texto y sus imágenes.

¿Cómo desenfoco el fondo detrás de un elemento?

Usa backdrop-filter: blur(10px); en el elemento, con un fondo parcialmente transparente como rgb(255 255 255 / 0.5). El contenido propio del elemento sigue nítido y lo que hay detrás se desenfoca: el efecto de vidrio esmerilado.

¿Qué diferencia hay entre drop-shadow() y box-shadow?

box-shadow siempre sigue la caja rectangular del elemento. filter: drop-shadow() sigue la forma visible, incluidas las zonas transparentes de un PNG o un SVG, así que la sombra de un ícono tiene el contorno del ícono.

¿Cómo pongo una imagen en blanco y negro con CSS?

Usa filter: grayscale(100%); (o grayscale(1)). Agrega una transición y filter: grayscale(0) en hover para recuperar el color.

¿Puedo usar varios filtros a la vez?

Sí, enuméralos separados por espacios: filter: grayscale(1) brightness(1.2) blur(1px);. Se aplican en orden, así que el orden puede cambiar el resultado. Una segunda declaración filter reemplaza a la primera.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR