Animasi adalah salah satu elemen inti dari pengalaman web modern. Sebagai developer, kamu pasti pernah menghadapi tantangan membuat animasi yang halus dan efisien. Di sinilah requestAnimationFrame berperan — sebuah browser API yang telah merevolusi cara kita menangani animasi di JavaScript.
Di artikel ini, kita akan membahas apa itu requestAnimationFrame, bagaimana cara kerjanya, dan kenapa ini adalah solusi utama untuk membuat animasi yang benar-benar mulus.
Apa itu requestAnimationFrame?
requestAnimationFrame adalah method yang disediakan browser untuk menjadwalkan pembaruan animasi. Berbeda dengan setInterval atau setTimeout, method ini menyinkronkan animasimu dengan refresh rate layar, biasanya 60 frames per second (fps) di sebagian besar monitor. Sinkronisasi ini memastikan animasi yang lebih mulus dan performa yang lebih baik.
Sintaks:
window.requestAnimationFrame(callback);
callback: Fungsi yang akan dipanggil untuk memperbarui animasi.
Kenapa Pakai requestAnimationFrame?
-
Optimasi Performa
Browser mengoptimalkan animasi dengan memastikan pembaruan hanya terjadi saat layar siap melakukan repaint. Ini mengurangi kalkulasi yang tidak perlu dan menghemat baterai perangkat. -
Konsisten dengan Frame Rate
Method ini menyesuaikan diri dengan refresh rate layar. Jika layar berjalan di 60 fps,requestAnimationFramememanggil animasimu di 60 fps. Jika refresh rate turun, API ini otomatis menyesuaikan. -
Otomatis Berhenti di Tab yang Tidak Aktif
Ketika sebuah tab tidak aktif,requestAnimationFramemenghentikan eksekusinya untuk menghemat resource — berbeda dengansetIntervalatausetTimeoutyang terus berjalan di background.
Bagaimana Cara Kerjanya?
Untuk membuat animasi menggunakan requestAnimationFrame, ikuti langkah-langkah berikut:
-
Definisikan Fungsi Animasi
Fungsi ini akan memperbarui properti dari elemen yang ingin kamu animasikan. -
Panggil
requestAnimationFrame
GunakanrequestAnimationFramedi dalam fungsi animasimu untuk memanggilnya secara rekursif, sehingga membentuk sebuah loop. -
Hentikan Animasi
Gunakan kondisi tertentu untuk menghentikan animasi ketika sudah selesai.
Contoh: Animasi Bola Sederhana
Berikut cara menganimasikan bola yang bergerak melintasi layar menggunakan requestAnimationFrame:
// Setup awal const ball = document.getElementById("ball"); let position = 0; const maxPosition = window.innerWidth - ball.offsetWidth; // Fungsi animasi function animate() { position += 5; // Gerakkan bola ke kanan ball.style.transform = `translateX(${position}px)`; // Hentikan animasi saat mencapai tepi if (position < maxPosition) { requestAnimationFrame(animate); } } // Mulai animasi requestAnimationFrame(animate);
HTML:
<div id="ball" style="width: 50px; height: 50px; background: red; border-radius: 50%; position: absolute;" ></div>
Tips Penggunaan yang Efektif
-
Jaga Animasi Tetap Ringan
Minimalkan beban kerja di dalam fungsi animasimu. Kalkulasi yang kompleks atau manipulasi DOM yang berlebihan bisa menghambat performa. -
Kombinasikan dengan CSS Transitions atau Transformations
Gunakan properti sepertitransformdanopacityuntuk animasi yang lebih halus, karena keduanya diakselerasi oleh GPU. -
Batalkan Animasi dengan
cancelAnimationFrame
Gunakan ID yang dikembalikan olehrequestAnimationFrameuntuk membatalkan animasi yang sedang berjalan:const animationId = requestAnimationFrame(animate); cancelAnimationFrame(animationId); -
Gunakan
performance.nowuntuk Timing
Lacak waktu yang telah berlalu secara akurat untuk animasi yang lebih kompleks:let start = null; function step(timestamp) { if (!start) start = timestamp; const progress = timestamp - start; ball.style.transform = `translateX(${Math.min(progress / 5, maxPosition)}px)`; if (progress < maxPosition * 5) { requestAnimationFrame(step); } } requestAnimationFrame(step);
Kapan Sebaiknya Tidak Menggunakan requestAnimationFrame
Meskipun requestAnimationFrame sangat bagus untuk sebagian besar animasi, ada kalanya CSS animations atau Web Animations API lebih cocok digunakan — khususnya untuk animasi sederhana yang bersifat deklaratif.
Kesimpulan
requestAnimationFrame adalah alat yang powerful untuk membuat animasi yang halus dan efisien di JavaScript. Dengan menyelaraskan pembaruan terhadap siklus rendering browser, method ini memastikan performa optimal dan pengalaman pengguna yang lebih baik.
Jadi, lain kali kamu butuh animasi, tinggalkan setInterval dan beralih ke requestAnimationFrame — penggunamu (dan perangkat mereka) pasti akan berterima kasih!
