Saltar al contenido
Curso de CSS
Todos los cursos Ir al ejercicio →

Transiciones y animaciones

  • ⏱ 40 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Suavizar cambios de estado con transition.
  • Mover, girar y escalar con transform sin 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:

AspectoTransicionesAnimaciones
Qué hacenPasan de un estado a otro de forma suaveSiguen una secuencia de pasos que tú defines
Se disparanCon un cambio (hover, foco, clase…)Solas, al cargar o al añadir la clase
Se escriben contransition@keyframes + animation
EjemploUn botón que cambia de color al pasar el cursorUn indicador de carga que gira sin parar

2.Transiciones

Una transición completa
.boton {
  background: #4f46e5;
  transition: background-color 0.25s ease, transform 0.25s ease;
}
.boton:hover {
  background: #3730a3;
  transform: translateY(-3px);
}
PropiedadQué defineEjemplos
transition-propertyQué propiedad se animatransform, background-color, all
transition-durationCuánto dura200ms, 0.3s
transition-timing-functionEl ritmoease, linear, ease-in-out, cubic-bezier(…)
transition-delayEspera antes de empezar100ms
transitionAtajotransform .25s ease .1s
✏️ Tarjeta que se levanta

💡 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ónEfectoEjemplo
translate(x, y)Mueve (sin afectar al layout)translate(10px, -4px), translateY(-50%)
rotate(ángulo)Girarotate(45deg)
scale(n)Cambia el tamañoscale(1.1), scale(.9)
skew(ángulo)InclinaskewX(-10deg)
transform-originEl punto alrededor del que se transformatop 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.

✏️ Transformaciones

📌 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.

Un fundido con deslizamiento
@keyframes aparecer {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: none; }
}

.aviso {
  animation: aparecer 0.5s ease-out both;
}
Pasos intermedios con porcentajes
@keyframes latido {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.25); }
}
.latido { animation: latido 1.2s ease-in-out infinite; }
PropiedadQué defineValores
animation-nameQué @keyframes usaraparecer
animation-durationDuración de un ciclo1s
animation-timing-functionEl ritmoease, linear, steps(4)
animation-delayEspera inicial.2s
animation-iteration-countCuántas veces1, 3, infinite
animation-directionSentidonormal, reverse, alternate
animation-fill-modeQué pasa antes y despuésforwards, backwards, both
animation-play-statePausar o reanudarpaused, running
animationAtajolatido 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.

✏️ Tres animaciones

5.Patrones de animación frecuentes

Entrada escalonada

Cada elemento aparece un poco después
.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

Un enlace con detalle
.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

Navegación interna fluida
html { scroll-behavior: smooth; }
✏️ Subrayado que crece

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:

Apagar las animaciones cuando se pide
@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;
  }
}

📌 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

📒 Apuntes para llevar

  • Las transiciones suavizan un cambio de estado; las animaciones siguen una secuencia con @keyframes.
  • Escribe transition en el estado base, nombra las propiedades y usa 150–300 ms.
  • transform (translate, rotate, scale, skew) y opacity son las propiedades fluidas: evita animar top, left o width.
  • @keyframes define pasos (from/to o porcentajes); animation los aplica.
  • infinite, alternate y animation-fill-mode: both controlan 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: smooth suaviza el desplazamiento interno.

8.Glosario

TérminoSignificado
TransiciónCambio gradual entre dos estados de una propiedad.
@keyframesRegla que define los pasos de una animación.
transformMueve, 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-modeQué estilos se aplican antes y después de la animación.
prefers-reduced-motionPreferencia del sistema para reducir el movimiento.
Fotograma (frame)Cada imagen que se pinta; lo ideal son 60 por segundo.
Aceleración por hardwareProcesado 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?

¿Cuáles son las propiedades más fluidas para animar?

¿Qué hace animation-iteration-count: infinite?

¿Para qué sirve @media (prefers-reduced-motion: reduce)?

Un elemento con animation-delay se ve en su estado final antes de empezar y luego salta. ¿Qué falta?

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.

Ir al ejercicio