CSS y web

Fondos con degradado animado en CSS, bien hechos

Los degradados no se pueden animar directamente, pero sí todo lo que los rodea. Cuatro técnicas, lo que le cuesta cada una al navegador y cómo mantener el movimiento sereno y opcional.

GradientlyCuenta verificada de Gradiently··5 min de lectura
Portada: Pine Afternoon · GR·6MTX·YD

La versión corta

  • Los navegadores no pueden interpolar entre dos valores de degradado, así que un degradado animado en CSS mueve, funde o transforma el degradado en lugar de animarlo directamente.
  • La técnica clásica hace el fondo más grande que el elemento y anima background-position, lo que funciona en todas partes pero repinta cada fotograma.
  • Registrar propiedades personalizadas con @property permite al navegador animar colores, ángulos y posiciones sueltos dentro de un degradado.
  • Animar transform u opacity en una capa de degradado aparte suele ser la opción más barata, porque los navegadores a menudo pueden componerla sin repintar.
  • Toda animación de degradado debería detenerse, o quedar casi quieta, cuando la persona ha pedido movimiento reducido.
En esta página

Un degradado animado en CSS es un fondo degradado que cambia de color o de posición con el tiempo. Hay un problema: si escribes dos degradados distintos en una regla @keyframes, los navegadores no los mezclan, saltan. Por eso todas las técnicas que funcionan animan algo junto al degradado: su posición, las propiedades personalizadas de su interior o la capa en la que está pintado. Cuál elijas decide lo suave que se ve y cuánto trabajo hace el navegador en cada fotograma.

Tres momentos de una animación lenta. La dirección y el color se mueven, pero la paleta sigue siendo de una sola familia.

Para la parte de diseño, cuándo ayuda el movimiento a una marca y cómo marcarle el ritmo, mira los fondos con degradado animado. Esta guía es el código.

Técnica 1: mueve un fondo sobredimensionado

Haz el degradado de dos a cuatro veces el tamaño del elemento con background-size y anima después background-position para que se vea una parte distinta con el tiempo. Funciona en todos los navegadores y no necesita JavaScript. Usa alternate para que el movimiento se invierta con suavidad en lugar de saltar al principio.

css
.hero {
  background-color: #1e1b4b;
  background-image: linear-gradient(120deg, #1e1b4b, #7c3aed, #f472b6, #fb923c);
  background-size: 300% 300%;
  animation: pan 18s ease-in-out infinite alternate;
}

@keyframes pan {
  from { background-position: 0% 50%; }
  to   { background-position: 100% 50%; }
}
El degradado animado clásico. Las duraciones lentas, de 12 a 30 segundos, se sienten ambientales y no ajetreadas.

El coste: background-position no es algo que los navegadores puedan mover solo con la tarjeta gráfica, así que el elemento se repinta en cada fotograma. En un botón no es nada. En un hero a pantalla completa es trabajo real que dura mientras la página esté abierta.

Técnica 2: anima los puntos de color con @property

Las propiedades personalizadas suelen ser cadenas de texto, que no se pueden interpolar. Registrar una con @property le da un tipo, como <color>, <angle> o <percentage>, y las propiedades con tipo se animan con suavidad. Úsalas dentro del degradado y podrás animar directamente los colores, el ángulo o la posición de un punto. @property es compatible con todos los navegadores principales actuales; consulta caniuse si das soporte a otros más antiguos.

css
@property --from {
  syntax: "<color>";
  inherits: false;
  initial-value: #7c3aed;
}
@property --to {
  syntax: "<color>";
  inherits: false;
  initial-value: #f472b6;
}
@property --angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 120deg;
}

.hero {
  background: linear-gradient(var(--angle), var(--from), var(--to));
  animation: shift 16s ease-in-out infinite alternate;
}

@keyframes shift {
  to {
    --from: #0891b2;
    --to: #fb923c;
    --angle: 200deg;
  }
}
Colores y ángulo animándose dentro del degradado. Las propiedades sin registrar saltarían en lugar de mezclarse.
Los dos extremos de la animación de arriba. El navegador mezcla cada fotograma intermedio.

Esta técnica también repinta en cada fotograma, como la primera. Su ventaja es el control: puedes mover un solo resplandor en un degradado de malla, girar un borde cónico o llevar un degradado de marca hacia una segunda paleta sin fondos sobredimensionados.

Técnica 3: transforma una capa de degradado

Pon el degradado en un pseudoelemento mucho mayor que el elemento y anima su transform, por ejemplo una rotación o deriva lenta. Los navegadores suelen poder mover una capa transformada con la tarjeta gráfica sin repintarla, así que es la forma más barata de animar un degradado grande. will-change: transform sugiere que la capa se promueva de antemano.

css
.hero {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.hero::before {
  content: "";
  position: absolute;
  inset: -50%;
  z-index: -1;
  background: conic-gradient(from 0deg, #1e1b4b, #7c3aed, #f472b6, #0891b2, #1e1b4b);
  animation: turn 40s linear infinite;
  will-change: transform;
}

@keyframes turn {
  to { transform: rotate(1turn); }
}
Un enorme degradado cónico que gira despacio detrás del contenido. El inset negativo mantiene cubiertas las esquinas al rotar.

Técnica 4: funde dos degradados

Apila dos capas de degradado y anima la opacity de la de arriba. La opacidad también es una propiedad amiga del compositor, así que el fundido es suave y barato. Encaja con cambios lentos de ambiente, como una paleta de día que se funde con una de noche, y permite que los dos degradados sean completamente distintos en estructura.

css
.sky {
  position: relative;
  isolation: isolate;
  background: linear-gradient(180deg, #7dd3fc, #fde68a);
}

.sky::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(180deg, #0f172a, #7c3aed);
  animation: dusk 20s ease-in-out infinite alternate;
}

@keyframes dusk {
  from { opacity: 0; }
  to   { opacity: 1; }
}
El día se funde en noche y vuelve. Solo cambia la opacidad, así que no se repinta nada.

Elegir una técnica

TécnicaTrabajo del navegador por fotogramaMejor para
Mover background-positionRepintadoElementos pequeños, botones, texto
Colores y ángulos con @propertyRepintadoCambios de color precisos, bordes giratorios
transform en una capaNormalmente solo composiciónFondos grandes, a pantalla completa
Fundido de opacityNormalmente solo composiciónCambios lentos de ambiente o de paleta
Los repintados no importan en zonas pequeñas. Para zonas grandes, prefiere transform y opacity.

Mide en lugar de adivinar. En las herramientas de desarrollo de Chrome, el panel Rendering con paint flashing resalta las zonas que se repintan en cada fotograma, y una grabación de Performance muestra cuánto de cada fotograma se va en pintar. Rendimiento de los degradados CSS lo recorre paso a paso.

Movimiento reducido y buenos modales

Algunas personas se marean o se distraen con el movimiento del fondo, y los sistemas operativos les permiten pedir menos. Respétalo con una consulta prefers-reduced-motion que detenga la animación y deje un fotograma quieto y terminado. La guía de movimiento reducido explica qué cuenta como movimiento que vale la pena quitar.

css
@media (prefers-reduced-motion: reduce) {
  .hero,
  .hero::before,
  .sky::after {
    animation: none;
  }
}
Una regla que detiene todas las técnicas anteriores. Comprueba que el fotograma que queda sigue viéndose bien.

Evita

  • Ciclos más rápidos de unos 8 segundos en zonas grandes
  • Rotación de tono arcoíris por toda la página
  • Movimiento detrás de un texto que la gente necesita leer
  • Animaciones que siguen funcionando cuando la pestaña lleva minutos inactiva

Haz

  • Movimiento lento y ambiental dentro de una sola familia de color
  • Movimiento en el hero, quietud en el contenido
  • Un fotograma quieto y sereno para el movimiento reducido
  • Probar en un portátil y un móvil modestos, no solo en un sobremesa rápido

Preguntas frecuentes

¿Se puede animar un degradado CSS?

No directamente: los navegadores saltan entre dos valores de degradado en los fotogramas clave. Anima en su lugar background-position, propiedades personalizadas registradas usadas dentro del degradado, o el transform y la opacity de una capa de degradado.

¿Cuál es la forma más suave de animar un fondo degradado?

Animar transform u opacity en una capa de degradado aparte, porque los navegadores suelen poder gestionarlas sin repintar.

¿Cómo animo los colores de un degradado en CSS?

Registra cada color con @property usando syntax: "<color>", usa las propiedades en el degradado y cámbialas en @keyframes.

¿Ralentizan una página los degradados animados?

Los pequeños rara vez importan. Los fondos animados grandes que se repintan en cada fotograma pueden costar batería y fluidez, así que prefiere transform u opacity y mide con las herramientas de desarrollo.

¿Cómo respeto el movimiento reducido en las animaciones de degradado?

Envuelve una regla animation: none en @media (prefers-reduced-motion: reduce) para que quienes piden menos movimiento vean un fotograma quieto.

Compartir esta guía

Escrito por GradientlyCuenta verificada de Gradiently

El equipo detrás de Gradiently, una herramienta de diseño creada en torno a los Marks: degradados vivos que hacen que todo lo que diseñas parezca tuyo.

Ver nuestro perfil