JavaScript Zamanlama Fonksiyonları: `requestAnimationFrame` ve `setTimeout` Arasındaki Farklar
Web geliştirme dünyasında hız, her şeydir. Hızlı bir uygulama, kullanıcı deneyimini dönüştürür, ancak bunu başarmak bazen karmaşık olabilir. Özellikle animasyonlar söz konusu olduğunda, doğru zamanlama fonksiyonunu seçmek kritik önem taşır. Bugün, JavaScript'te en yaygın kullanılan iki zamanlama fonksiyonunu—`requestAnimationFrame` ve `setTimeout`—ele alacağız. Bu iki fonksiyon görünüşte benzer işlevler sunsa da, performans üzerinde farklı etkiler yaratabilirler.
Temel Farklar: `requestAnimationFrame` ve `setTimeout`
`requestAnimationFrame`, web animasyonları için özel olarak tasarlanmış bir fonksiyondur. Bu fonksiyon, tarayıcıya, bir animasyonu çizmeden önce ne kadar süre beklemesi gerektiğini bildirir. Tarayıcılar, animasyonları ekran yenileme hızına (genellikle 60 Hz) senkronize eder. Yani, bir animasyon çerçevesi, ekranın her tazelemesinde güncellenir, bu da daha pürüzsüz bir deneyim sunar.
Öte yandan, `setTimeout`, belirli bir süre sonra bir işlevi çalıştırmak için kullanılır. Genelde animasyonlardan ziyade, sayfa yüklemesi, zamanlayıcılar veya kullanıcı etkileşimlerini takip etmek için kullanılır. `setTimeout`'ın animasyonlar için kullanılması genellikle daha fazla işlem gücü ve kaynağı gerektirir çünkü her saniye belirli aralıklarla çalıştırılan bir işlev, tarayıcının render işlemine uyum sağlamaz.
Performans Artışı ve Uygulama Senaryoları
Şimdi, bu iki fonksiyonun farklı kullanımlarını göz önünde bulunduralım. Farz edelim ki bir web sayfası yapıyorsunuz ve kaydırma animasyonları eklemek istiyorsunuz. `requestAnimationFrame`, kaydırma animasyonlarında çok daha akıcı sonuçlar verir. Bunun nedeni, bu fonksiyonun ekranın yenileme döngüsüyle uyumlu çalışması ve böylece her bir animasyon çerçevesinin düzgün bir şekilde gösterilmesidir.
Bir örnek üzerinden gitmek gerekirse:
let start = null;
function animate(timestamp) {
if (!start) start = timestamp;
let progress = timestamp - start;
element.style.transform = `translateY(${progress / 10}px)`;
if (progress < 2000) { // animasyon 2 saniye sürer
requestAnimationFrame(animate);
}
}
requestAnimationFrame(animate);Bu örnekte, animasyonun her çerçevesi, tarayıcı tarafından yönetilen bir render döngüsü ile uyumlu olarak güncellenir, bu da animasyonun pürüzsüz bir şekilde görünmesini sağlar.
Diğer taraftan, `setTimeout` kullanarak benzer bir animasyon yapmaya çalıştığınızda, animasyon pürüzlü olur ve farklı tarayıcılarda farklı hızlarda çalışabilir:
let start = Date.now();
function move() {
let progress = Date.now() - start;
element.style.transform = `translateY(${progress / 10}px)`;
if (progress < 2000) {
setTimeout(move, 16); // 16ms, yaklaşık 60fps
}
}
move();Burada animasyon her 16ms'de bir tetikleniyor, ancak `requestAnimationFrame` kullanımı kadar verimli değildir çünkü tarayıcılar ekran yenileme döngüsüne uyum sağlamaz.
Pratik Kod Örnekleri
Bu farkları daha da netleştirmek için, aşağıdaki kod parçacıklarını deneyebilirsiniz. Her iki fonksiyonla da basit bir animasyon yaratacak ve hangisinin daha verimli çalıştığını gözlemleyeceksiniz.
`requestAnimationFrame` Örneği:
let start = null;
function animate(timestamp) {
if (!start) start = timestamp;
let progress = timestamp - start;
element.style.transform = `translateX(${progress / 10}px)`;
if (progress < 3000) {
requestAnimationFrame(animate);
}
}
requestAnimationFrame(animate);`setTimeout` Örneği:
let start = Date.now();
function move() {
let progress = Date.now() - start;
element.style.transform = `translateX(${progress / 10}px)`;
if (progress < 3000) {
setTimeout(move, 16);
}
}
move();Sonuç: Hangisini Kullanmalıyım?
Her iki yöntem de zamanlama fonksiyonları sağlar, ancak `requestAnimationFrame` animasyonlarda, özellikle performans ve görsellik açısından daha etkili bir çözüm sunar. Eğer sayfa üzerinde kaydırma, geçiş veya animasyonlar yapıyorsanız, `requestAnimationFrame` kullanmak her zaman daha iyi bir seçim olacaktır. `setTimeout`, daha genel zamanlama ihtiyaçları için uygun olabilir, ancak animasyonlar için tercih edilmemelidir.
SEO İpuçları
SEO açısından, bu yazıda yer alan anahtar kelimeleri dikkatlice entegre ederek, arama motorlarında daha yüksek sıralamalar elde edebilirsiniz. Başlıklar ve alt başlıklar, kullanıcıların ilgisini çekecek şekilde düzenlenmeli ve doğal bir dil kullanılmalıdır.
Ayrıca, yazı boyunca kullanılan terimler—JavaScript, performans iyileştirme, animasyon, requestAnimationFrame, setTimeout—arama motorları tarafından kolayca indekslenebilir. Bu nedenle, içeriğinizin her yönünü optimize ettiğinizden emin olun!