Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Web Geliştirmede `requestAnimationFrame` ile Akıcı Animasyonlar ve Performans Patlaması 🎬

byteon

Üye
Katılım
14 Mart 2026
Mesajlar
9
Web Geliştirmede `requestAnimationFrame` ile Akıcı Animasyonlar ve Performans Patlaması 🎬

Selam dostlar! Uzun süredir forumda sessiz kaldım, bugün canım biraz performans ve görsellik konuşmak istedi. Özellikle JavaScript ile animasyon yaparken hepimizin ilk aklına `setInterval` veya `setTimeout` geliyor, değil mi? "Şu div'i 10 milisaniyede bir 5px kaydırayım" mantığı... Ama işin aslı öyle değil. Eğer gerçekten kullanıcı deneyimini ön planda tutan, akıcı ve performanslı animasyonlar yapmak istiyorsanız, doğru adres `requestAnimationFrame` (kısaca rAF). Gelin bu gizli kahramanı birlikte inceleyelim. ⚙️

Neden `setInterval` / `setTimeout` Yerine `requestAnimationFrame`?

Bu sorunun cevabı, tarayıcının "boyama döngüsü" (paint cycle) ile uyumlu çalışmakta yatıyor.

  • Ekran Yenileme Hızına (FPS) Uyum: `setInterval` size "her 16ms'de bir çalış" dediğinizde, körü körüne bunu yapar. Oysa monitörler genelde saniyede 60 kere (60 FPS) yenilenir. `requestAnimationFrame` ise akıllıdır; animasyonu bir sonraki tarayıcı boyama işleminden hemen önce çalıştırır. Bu, saniyede 60 kere güncelleme yaparak en akıcı görüntüyü sağlar.
  • Performans ve Pil Ömrü: Kullanıcı sekmeden ayrıldığında veya tarayıcı minimizze edildiğinde, `requestAnimationFrame` otomatik olarak duraklar. Böylece gereksiz CPU/GPU kullanımı ve pil tüketimi olmaz. `setInterval` ise arka planda çalışmaya devam eder, kaynak israfıdır.
  • Takip Çöpü (Jank) Önleme: Tarayıcı, JavaScript'i çalıştırmak ve ekranı boyamak için aynı anda çok iş yapmaya çalışırsa, kare atlamalar (frame drops) olur. rAF, işleri doğru zamana planlayarak bu sorunu minimize eder.

Temel Kullanım: Bir Kareyi Hareket Ettirelim

En iyi öğrenme yolu örnekle. Basit bir kutu animasyonu yapalım:

Kod:
// HTML'de <div id="box"></div> olduğunu varsayalım.
const kutu = document.getElementById('box');
let pozisyon = 0;
let animasyonId = null; // Animasyon ID'sini saklamak için

function animasyonuCalistir() {
  // Pozisyonu güncelle
  pozisyon += 2;

  // Kutuyu hareket ettir (CSS transform daha performanslıdır!)
  kutu.style.transform = `translateX(${pozisyon}px)`;

  // Animasyonu durdurma koşulu (örneğin 500px'den fazla gitmesin)
  if (pozisyon < 500) {
    // Animasyonu bir sonraki kare için tekrar planla
    animasyonId = requestAnimationFrame(animasyonuCalistir);
  }
}

// Animasyonu başlat
document.getElementById('baslatButon').addEventListener('click', () => {
  // Önce varsa eski animasyonu durdur (çift tıklamalara karşı)
  if (animasyonId) {
    cancelAnimationFrame(animasyonId);
  }
  pozisyon = 0; // Pozisyonu sıfırla
  animasyonuCalistir(); // Başlat
});

// Animasyonu durdur
document.getElementById('durdurButon').addEventListener('click', () => {
  cancelAnimationFrame(animasyonId);
});

Burada `requestAnimationFrame(animasyonuCalistir)` çağrısı, `animasyonuCalistir` fonksiyonunu bir sonraki boyama öncesi çalıştırmak üzere kuyruğa alır. Fonksiyonun içinde tekrar kendisini çağırarak bir döngü oluştururuz. Durdurmak için de `cancelAnimationFrame(animasyonId)` kullanırız. 🚀

İleri Seviye İpuçları ve En İyi Uygulamalar

  • Zaman Tabanlı Animasyon (Delta Time): Yukarıdaki örnekte `pozisyon += 2` sabit bir artış. Ancak farklı ekran yenileme hızlarında (örn. 120Hz) animasyon iki kat hızlı olur. Çözüm, son kareden bu kareye geçen süreyi (`deltaTime`) hesaplayıp hareketi buna göre ayarlamaktır. Bu, animasyon hızını gerçek zamana sabitler.
  • CSS Transform & Opacity Kullanın: Animasyon için mümkün olduğunca `transform` (translate, scale, rotate) ve `opacity` özelliklerini kullanın. Tarayıcı bu özellikleri GPU ile hızlandırabilir (hardware acceleration). `top`, `left`, `width`, `height` gibi özellikler "layout" işlemine neden olur ve çok daha yavaştır.
  • FPS Sayacı ile Performansı İzleyin: Geliştirme aşamasında animasyonunuzun gerçek FPS değerini görmek faydalıdır. Basit bir FPS sayacı yazabilirsiniz.
  • Karmaşık Animasyonlar için Kütüphaneler: Gerçekten kompleks senaryolarda (scroll animasyonları, fizik motorları) GSAP veya anime.js gibi kütüphaneleri inceleyin. Bunların çoğu arka planda `requestAnimationFrame`'i en verimli şekilde kullanır.

Ne Zaman Kullanmayalım?

Her şeyde olduğu gibi, rAF de her derde deva değil.
  • Gerçek Zamanlı Saat veya Zamanlayıcı Değildir: Belirli bir zaman aralığında (örneğin her 5 saniyede bir sunucuya ping atmak) yapılması gereken işler için yine `setInterval` daha uygundur.
  • Çok Hızlı / Sürekli Olmayan Güncellemeler: Sadece bir butona tıklandığında bir kere çalışacak bir fonksiyon için rAF kullanmanın bir anlamı yok.

**Son Söz:** `requestAnimationFrame`, tarayıcıyla işbirliği yaparak çalışan akıllı bir zamanlayıcıdır. 🧠 Öğrenmesi ve uygulaması kolay, ancak sağladığı performans ve kullanıcı deneyimi farkı devasadır. Bir sonraki projenizde hareketli bir banner, progress bar veya oyun benzeri bir interaktif öğe yapacağınız zaman, ilk seçeneğiniz mutlaka bu olsun.

Deneyin, farkı görün! Takıldığınız bir yer olursa yorumlarda buluşalım. Kodla kalın! 💻
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri