Un temporizador no sabe cuándo el navegador está a punto de pintar. requestAnimationFrame programa una devolución de llamada antes de un fotograma futuro, lo que lo hace más adecuado para actualizaciones visuales como mover un elemento o dibujar en un lienzo.

let frameId;
let start;

function animate(now) {
  start ??= now;
  const progress = Math.min((now - start) / 400, 1);
  element.style.transform = `translateX(${progress * 120}px)`;
  if (progress < 1) frameId = requestAnimationFrame(animate);
}

frameId = requestAnimationFrame(animate);

Utilice la marca de tiempo, no un paso fijo

  • Base el progreso en la marca de tiempo de devolución de llamada para que el movimiento no esté vinculado a una frecuencia de actualización particular.
  • Mantenga organizadas las lecturas y escrituras del diseño para evitar el diseño forzado repetido.
  • Cancele un fotograma programado con cancelAnimationFrame cuando la animación debería detenerse.

Respetar la preferencia de movimiento del usuario.

Ofrezca una ruta de movimiento reducido para movimientos no esenciales y evite animar contenido que pueda distraer o incomodar la página.

Pruebe con diferentes frecuencias de actualización y cuando una pestaña esté en segundo plano. Los navegadores pueden pausar o acelerar las devoluciones de llamadas de animación cuando una página no está visible.