Transiciones y animaciones
💡 🎯 Al terminar esta lección podrás…
- Suavizar cambios de estado con
transition. - Mover, girar y escalar con
transformsin afectar al layout. - Crear animaciones con
@keyframes. - Aplicar buenas prácticas de rendimiento y accesibilidad.
1.Para qué sirve el movimiento
Una animación bien hecha comunica: confirma que algo se pulsó, guía la mirada, muestra de dónde viene un elemento o indica que algo está cargando. Una animación mal hecha molesta: distrae, marea y ralentiza.
CSS tiene dos herramientas:
| Aspecto | Transiciones | Animaciones |
|---|---|---|
| Qué hacen | Pasan de un estado a otro de forma suave | Siguen una secuencia de pasos que tú defines |
| Se disparan | Con un cambio (hover, foco, clase…) | Solas, al cargar o al añadir la clase |
| Se escriben con | transition | @keyframes + animation |
| Ejemplo | Un botón que cambia de color al pasar el cursor | Un indicador de carga que gira sin parar |
2.Transiciones
.boton {
background: #4f46e5;
transition: background-color 0.25s ease, transform 0.25s ease;
}
.boton:hover {
background: #3730a3;
transform: translateY(-3px);
}
| Propiedad | Qué define | Ejemplos |
|---|---|---|
transition-property | Qué propiedad se anima | transform, background-color, all |
transition-duration | Cuánto dura | 200ms, 0.3s |
transition-timing-function | El ritmo | ease, linear, ease-in-out, cubic-bezier(…) |
transition-delay | Espera antes de empezar | 100ms |
transition | Atajo | transform .25s ease .1s |
- Escribe la transición en el estado base, no en el
:hover: así también funciona al volver. - Dura entre 150 y 300 ms para interacciones; más largo se siente lento.
- Evita
transition: all: anima propiedades que no esperabas y es menos eficiente. Nombra las que quieres.
💡 Consejo · Mismas curvas, mismo carácter
ease-out (empieza rápido y frena) es ideal para cosas que aparecen; ease-in (empieza lento y acelera) para cosas que se van. Mantén las mismas curvas y duraciones en todo el sitio: da coherencia.
3.transform: mover, girar y escalar
| Función | Efecto | Ejemplo |
|---|---|---|
translate(x, y) | Mueve (sin afectar al layout) | translate(10px, -4px), translateY(-50%) |
rotate(ángulo) | Gira | rotate(45deg) |
scale(n) | Cambia el tamaño | scale(1.1), scale(.9) |
skew(ángulo) | Inclina | skewX(-10deg) |
transform-origin | El punto alrededor del que se transforma | top left, 50% 100% |
Se pueden combinar separándolas con espacios: transform: translateY(-4px) rotate(3deg) scale(1.05). El orden importa: se aplican de derecha a izquierda.
📌 Nota · Por qué transform y no top/left
transform y opacity se animan en la tarjeta gráfica, sin recalcular el layout: son fluidos incluso en celulares. Animar top, left, width o margin obliga al navegador a recolocar la página en cada fotograma. Prefiere siempre transform y opacity.
4.Animaciones con @keyframes
Una animación tiene dos partes: defines los pasos con @keyframes y la aplicas con animation.
@keyframes aparecer {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: none; }
}
.aviso {
animation: aparecer 0.5s ease-out both;
}
@keyframes latido {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.25); }
}
.latido { animation: latido 1.2s ease-in-out infinite; }
| Propiedad | Qué define | Valores |
|---|---|---|
animation-name | Qué @keyframes usar | aparecer |
animation-duration | Duración de un ciclo | 1s |
animation-timing-function | El ritmo | ease, linear, steps(4) |
animation-delay | Espera inicial | .2s |
animation-iteration-count | Cuántas veces | 1, 3, infinite |
animation-direction | Sentido | normal, reverse, alternate |
animation-fill-mode | Qué pasa antes y después | forwards, backwards, both |
animation-play-state | Pausar o reanudar | paused, running |
animation | Atajo | latido 1.2s ease-in-out infinite |
⚠️ Importante · animation-fill-mode
Sin both (o backwards), un elemento con animation-delay se ve ya en su estado final antes de empezar y luego «salta» al inicio. Con forwards (o both) conserva el estado final al terminar en vez de volver al principio.
5.Patrones de animación frecuentes
Entrada escalonada
.lista li {
animation: aparecer .5s ease-out both;
animation-delay: calc(var(--i) * 80ms); /* --i: 0, 1, 2… desde el HTML o JS */
}
Subrayado que crece
.enlace { position: relative; text-decoration: none; }
.enlace::after {
content: ""; position: absolute; left: 0; bottom: -2px; height: 2px; width: 100%;
background: currentColor;
transform: scaleX(0); transform-origin: left;
transition: transform .25s ease;
}
.enlace:hover::after { transform: scaleX(1); }
Desplazamiento suave
html { scroll-behavior: smooth; }
6.Accesibilidad: respeta a quien no quiere movimiento
Para algunas personas (con trastornos vestibulares, migrañas o epilepsia) el movimiento causa mareo o malestar. Los sistemas operativos tienen un ajuste «reducir movimiento» y CSS puede leerlo:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
- Nada de parpadeos rápidos (más de 3 por segundo).
- Las animaciones que se repiten sin fin deben poder pausarse.
- No uses el movimiento como única forma de comunicar algo.
- Una animación no debe retrasar una acción que la persona quiere hacer.
📌 Nota · Este mismo sitio lo hace
Todas las animaciones de este curso se desactivan si tu sistema pide reducir movimiento. Pruébalo activando esa opción en la configuración de tu sistema.
7.Errores frecuentes
- Animar
width,height,topoleft: provoca tirones. Usatransform. - Escribir la transición solo en
:hover: la ida es suave pero la vuelta, brusca. transition: allen todo: efectos inesperados y gasto de rendimiento.- Duraciones demasiado largas (1s para un botón).
- Olvidar
animation-fill-modey ver saltos. display: none↔display: block: no se puede animar; usaopacity+visibility, o@starting-styleen navegadores modernos.- Ignorar
prefers-reduced-motion.
📒 Apuntes para llevar
- Las transiciones suavizan un cambio de estado; las animaciones siguen una secuencia con
@keyframes. - Escribe
transitionen el estado base, nombra las propiedades y usa 150–300 ms. transform(translate,rotate,scale,skew) yopacityson las propiedades fluidas: evita animartop,leftowidth.@keyframesdefine pasos (from/too porcentajes);animationlos aplica.infinite,alternateyanimation-fill-mode: bothcontrolan repetición, sentido y estado final/inicial.- Con
calc(var(--i) * 80ms)se logra una entrada escalonada. - Respeta
@media (prefers-reduced-motion: reduce)y evita parpadeos. scroll-behavior: smoothsuaviza el desplazamiento interno.
8.Glosario
| Término | Significado |
|---|---|
| Transición | Cambio gradual entre dos estados de una propiedad. |
@keyframes | Regla que define los pasos de una animación. |
transform | Mueve, gira, escala o inclina un elemento sin alterar el layout. |
| Función de ritmo (timing) | Curva de aceleración: ease, linear, cubic-bezier(). |
animation-fill-mode | Qué estilos se aplican antes y después de la animación. |
prefers-reduced-motion | Preferencia del sistema para reducir el movimiento. |
| Fotograma (frame) | Cada imagen que se pinta; lo ideal son 60 por segundo. |
| Aceleración por hardware | Procesado en la GPU, típico de transform y opacity. |
🧠 Comprueba lo aprendido
Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.
¿Dónde conviene escribir transition para que funcione también al volver?
En el estado base la transición se aplica al ir y al volver.
¿Cuáles son las propiedades más fluidas para animar?
Se procesan en la tarjeta gráfica sin recalcular el layout.
¿Qué hace animation-iteration-count: infinite?
Repite el ciclo indefinidamente.
¿Para qué sirve @media (prefers-reduced-motion: reduce)?
Respeta a quien se marea o molesta con el movimiento.
Un elemento con animation-delay se ve en su estado final antes de empezar y luego salta. ¿Qué falta?
backwards aplica el primer fotograma durante el retraso; both además conserva el último al final.
Tu progreso se guarda en este navegador y se refleja en el índice del curso.
💡 🚀 ¡Ahora te toca!
La práctica fija lo aprendido. Pasa al ejercicio de esta lección.