Usando requestAnimationFrame | Programar Plus

Solía ​​haber una sola forma de hacer un ciclo cronometrado en JavaScript: setInterval(). Si necesita repetir algo bastante rápido (pero no tan rápido como absolutamente posible como un for loop), lo usarías. A los efectos de la animación, el objetivo es sesenta “fotogramas” por segundo para que parezcan suaves, por lo que ejecutaría un bucle como este:

setInterval(function() {
  // animiate something
}, 1000/60);

Hay una alternativa mejor a esto ahora. Paul Irish presentó requestAnimationFrame hace más de dos años. No tengo mucho que agregarle, simplemente nunca lo había usado antes y ahora lo tengo, así que pensé en ayudar a correr la voz y escribir sobre su uso básico.

¿Por qué mejor?

Como explicó Paul:

  • El navegador puede optimizarlo, por lo que las animaciones serán más fluidas.
  • Las animaciones en pestañas inactivas se detendrán, permitiendo que la CPU se enfríe
  • Más amigable con la batería

El ejemplo más simple posible

function repeatOften() {
  // Do whatever
  requestAnimationFrame(repeatOften);
}
requestAnimationFrame(repeatOften);

Llámelo una vez para iniciarlo, y su función se llama a sí misma de forma recursiva.

Iniciar y detener

requestAnimationFrame devuelve una identificación que puede usar para cancelarla, al igual que setTimeout o setInterval lo hace. jQuery se usa aquí solo para demostrar una animación simple y vincular eventos.

var globalID;

function repeatOften() {
  $("<div />").appendTo("body");
  globalID = requestAnimationFrame(repeatOften);
}

$("#start").on("click", function() {
  globalID = requestAnimationFrame(repeatOften);
});

$("#stop").on("click", function() {
  cancelAnimationFrame(globalID);
});

Ejemplo de esto:

Check out this Pen!

Soporte del navegador

Consulte las tablas ¿Puedo usar…?

Los únicos problemas notables son IE 9-, iOS 5- y Android. Pero en realidad no es un problema, porque:

Polyfill

Al igual que muchas funciones web sofisticadas, es bueno usarlo cuando está disponible y recurrir a algo que funciona cuando no se puede. Probablemente sea mejor referirse a esta esencia. Literalmente, solo incluye ese fragmento en cualquier lugar antes de usar requestAnimationFrame o cancelAnimationFrame.

Con esto, podrá usar requestAnimationFrame literalmente en cualquier navegador.

Ejemplo un poco más complejo

Aprendí sobre esto mientras hacía una pequeña demostración tonta para aprender mejor el lienzo:

Vea Pen Super Simple requestAnimationFrame Thing por Chris Coyier (@chriscoyier) en CodePen.

Lo que en realidad sería más complejo son varias animaciones que se ejecutan a la vez usando esto (que aún retrocede bien). Siéntase libre de vincular algunas de esas bondades en los comentarios si conoce ejemplos.

(Visited 6 times, 1 visits today)