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.
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.
.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 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.
@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;
}
}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.
.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); }
}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.
.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; }
}Elegir una técnica
| Técnica | Trabajo del navegador por fotograma | Mejor para |
|---|---|---|
Mover background-position | Repintado | Elementos pequeños, botones, texto |
Colores y ángulos con @property | Repintado | Cambios de color precisos, bordes giratorios |
transform en una capa | Normalmente solo composición | Fondos grandes, a pantalla completa |
Fundido de opacity | Normalmente solo composición | Cambios lentos de ambiente o de paleta |
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.
@media (prefers-reduced-motion: reduce) {
.hero,
.hero::before,
.sky::after {
animation: none;
}
}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.
Escrito por 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


