03 Capítulo 3 · Lección 8

Animation Timing Function

Redactado por
Author Sebastian V.
Fecha de publicación

16/04/2025

Tiempo de lectura

min

Tema

@keyframes

Por qué el movimiento lineal se siente falso

Cuando aprendes a manejar una bicicleta, no arrancas a velocidad máxima desde el primer pedaleo ni tampoco paras en seco. Aceleras gradualmente y desacelerás antes de detenerte. Ese es el movimiento natural que el cerebro humano espera. Cuando algo se mueve a velocidad constante en pantalla, algo en nosotros lo detecta como artificial, robótico.

La propiedad animation-timing-function resuelve exactamente eso. Define la curva de aceleración de la animación a lo largo de su duración: cuándo va rápido, cuándo desacelera, cuándo arranca despacio. Es lo que convierte un movimiento mecánico en uno que se siente vivo.

Las cinco curvas estándar de CSS

  • linear: Velocidad perfectamente constante de principio a fin. Útil para rotaciones continuas, fondos en movimiento o cualquier cosa donde quieras que el usuario no perciba inicio ni final del ciclo.
  • ease: (Valor por defecto) Arranca despacio, acelera en el centro y termina despacio. Produce transiciones bastante naturales para la mayoría de casos genéricos.
  • ease-in: Comienza muy despacio y acelera progresivamente. Imita un objeto que toma impulso, como una pelota que empieza a rodar cústera abajo.
  • ease-out: Empieza a velocidad máxima y desacelera suavemente. Perfecto para elementos que entran a la pantalla —se sienten responsivos e inmediatos.
  • ease-in-out: Simétrico: inicio lento, centro rápido, final lento. Ideal para movimientos de vaivén o carruseles que van y vienen.

La regla que marca la diferencia en UI

Hay una decisión de diseño que los mejores equipos de producto aplican consistentemente:

  • Cuando algo entra a pantalla (modal, menú, toast): usa ease-out. La entrada rápida le da al usuario la sensación de que la UI responde instantáneamente a su acción.
  • Cuando algo sale de pantalla (cierre de modal, dismissal): usa ease-in. El elemento parece tomar impulso al irse, desapareciendo sin entorpecer la navegación.
  • Para loops decorativos (fondos, orbs flotantes): usa ease-in-out o linear.

Consejo profesional

¿Sabías que puedes crear tus propios easings personalizados? Con cubic-bezier(x1, y1, x2, y2) puedes definir curvas elásticas avanzadas que simulan rebotes o retrocesos elásticos.

Comparación visual de Timing Functions

> _
<div class="easing-tester">
  <div class="test-row">
    <span class="label">linear (Velocidad constante)</span>
    <div class="track"><div class="dot ease-linear"></div></div>
  </div>
  <div class="test-row">
    <span class="label">ease (Suave inicio y fin - Por defecto)</span>
    <div class="track"><div class="dot ease-default"></div></div>
  </div>
  <div class="test-row">
    <span class="label">ease-in (Entrada lenta, salida rápida)</span>
    <div class="track"><div class="dot ease-in-class"></div></div>
  </div>
  <div class="test-row">
    <span class="label">ease-out (Entrada rápida, salida lenta)</span>
    <div class="track"><div class="dot ease-out-class"></div></div>
  </div>
  <div class="test-row">
    <span class="label">ease-in-out (Inicio lento, medio rápido, fin lento)</span>
    <div class="track"><div class="dot ease-in-out-class"></div></div>
  </div>
</div>
> _
linear (Velocidad constante)
ease (Suave inicio y fin)
ease-in (Entrada lenta, salida rápida)
ease-out (Entrada rápida, salida lenta)
ease-in-out (Inicio/fin lento, medio rápido)

Compara cómo se distribuye la velocidad del movimiento de izquierda a derecha en función del easing aplicado.

Errores comunes

01
Usar "linear" para todo El movimiento lineal se siente frío, maquinal y poco natural en menús o modales. Evítalo en transiciones de UI principales.
02
Escribir mal los valores predefinidos Escribir easein o easeout sin el guion medio hará que el navegador ignore la propiedad e implante el valor ease por defecto.

Practica lo aprendido

Cambia el timing-function del código y experimenta con transiciones rápidas y lentas.

01 Prueba a alternar las timing-functions y observa el movimiento de los puntos
02 Usa ease-out para elementos que entran en la pantalla (se siente responsivo)
03 Usa ease-in para elementos que salen de la pantalla (parece acelerar al irse)
04 Reserva linear para loaders, fondos giratorios o efectos continuos de looping