0Pricing
HTML Academy · Lección

Animación con requestAnimationFrame

Cree animaciones fluidas en canvas con el bucle de fotogramas de animación

Animación con requestAnimationFrame es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.

¿Por qué utilizar requestAnimationFrame?

requestAnimationFrame (rAF) programa una función de devolución de llamada antes del siguiente repintado del navegador y sincroniza la animación con la frecuencia de actualización de la pantalla (normalmente, 60 fps). A diferencia de setInterval, rAF se pausa cuando la pestaña está oculta, lo que ahorra CPU y batería.

Bucle de animación básico

Un bucle de rAF: defina una función animate que dibuje el fotograma actual y, después, llame a requestAnimationFrame(animate) para programar el siguiente. El navegador llama a animate antes de cada repintado, lo que crea una animación continua a la frecuencia de fotogramas de la pantalla.

function animate(timestamp) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  // draw frame at current state
  draw(timestamp);
  requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

El parámetro timestamp

rAF pasa un DOMHighResTimeStamp (milisegundos desde que se cargó la página) a la función de devolución de llamada. Úselo para calcular un movimiento independiente de la frecuencia de fotogramas: delta = timestamp - lastTimestamp. Multiplique la velocidad por delta para mover la misma distancia por segundo, independientemente de la frecuencia de fotogramas.

Movimiento independiente de la frecuencia de fotogramas

Calcule el tiempo transcurrido desde el último fotograma y escale el movimiento en consecuencia. Un objeto que se mueve a 100px/s recorre 100 * (delta / 1000) píxeles por fotograma. Esto garantiza una física coherente en pantallas de 30 fps y 144 fps.

Detener una animación

rAF devuelve un identificador. Cancélelo con cancelAnimationFrame(handle). Guarde el identificador en una variable, compruebe una marca de ejecución dentro del bucle o cancele la animación al limpiar el componente. Cancele siempre los bucles cuando se elimine el elemento del DOM.

Patrón de animación con canvas

En cada fotograma: (1) aplique clearRect a todo el canvas, (2) actualice las variables de estado (posición, ángulo, tiempo), (3) dibuje todos los objetos en sus nuevas posiciones y (4) llame a requestAnimationFrame para el siguiente fotograma. No omita nunca clearRect: los fotogramas anteriores se acumularán y dejarán un rastro.

Transiciones CSS frente a rAF

Utilice transiciones y animaciones CSS para animaciones sencillas basadas en propiedades (efectos al pasar el cursor, entrada deslizante de un modal). Utilice rAF para animaciones complejas e interactivas —bucles de juegos, simulaciones físicas y renderizado en canvas— en las que necesite un control detallado de cada fotograma.

Doble búfer en canvas

Para escenas complejas, dibuje primero en un canvas fuera de pantalla y, después, use drawImage para dibujarlo sobre el canvas visible en una sola operación. Esto evita el parpadeo, ya que nunca se muestra un fotograma dibujado parcialmente: el canvas visible se actualiza de forma atómica en cada fotograma.

Limitar a una frecuencia de FPS objetivo

Limite la frecuencia de fotogramas a un valor inferior (por ejemplo, 30 fps): compruebe si ha transcurrido suficiente tiempo desde el último dibujo antes de renderizar. if (timestamp - lastDraw >= 1000/30) { draw(); lastDraw = timestamp; }. Programe rAF igualmente para mantener la capacidad de respuesta.

Depurar animaciones

El panel Performance de Chrome DevTools registra las funciones de devolución de llamada de rAF en el gráfico de llamas de JavaScript. Busque funciones de devolución de llamada largas que superen los 16 ms, ya que provocan pérdidas de fotogramas. Utilice el medidor de FPS (Rendering → FPS Meter) para observar la frecuencia de fotogramas en tiempo real durante la interacción.

Alternativa: Web Animations API

Para animaciones declarativas más sencillas sin controlar manualmente el tiempo: element.animate(keyframes, options). WAAPI gestiona las funciones de temporización, los modos de relleno y las iteraciones, y delega el cálculo de los fotogramas al navegador. Utilice rAF para la lógica de renderizado personalizada que WAAPI no pueda expresar.

Comprobación de conocimientos

¿Por qué se debe multiplicar la velocidad de la animación por el tiempo delta en un bucle de requestAnimationFrame?

Resumen

requestAnimationFrame sincroniza la animación de JavaScript con la frecuencia de actualización de la pantalla y se pausa en las pestañas ocultas. El parámetro timestamp permite un movimiento independiente de la frecuencia de fotogramas mediante el escalado basado en el tiempo delta. El patrón de bucle de animación de canvas (borrar, actualizar, dibujar y programar), combinado con cancelAnimationFrame para la limpieza, constituye la base de unas animaciones web fluidas y eficientes.

Preguntas frecuentes

¿La lección «Animación con requestAnimationFrame» es gratis?

Sí — el texto completo de «Animación con requestAnimationFrame» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Animación con requestAnimationFrame»?

Cree animaciones fluidas en canvas con el bucle de fotogramas de animación Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar HTML Academy?

No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Animación con requestAnimationFrame»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de HTML Academy?

Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Configurar canvas y el contexto 2D
  2. Dibujar rectángulos y trazados
  3. Texto e imágenes en canvas
  4. Animación con requestAnimationFrame
← Volver a HTML Academy