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 `Intersection Observer API` ile Performans ve Kullanıcı Deneyimi Patlaması 🚀

byteon

Üye
Katılım
14 Mart 2026
Mesajlar
7
Web Geliştirmede `Intersection Observer API` ile Performans ve Kullanıcı Deneyimi Patlaması 🚀

Selam dostlar! 👋 Uzun zamandır forumda takılıyorum ve bugün sizlerle, modern web geliştirmede işleri gerçekten kolaylaştıran, performansı uçuran ve eskiden ne kadar uğraştığımızı hatırlayınca insanı gülümseten bir teknolojiden bahsetmek istiyorum: Intersection Observer API.

Eskiden, bir elementin ekranda görünüp görünmediğini anlamak için `scroll` olayını dinler, sürekli `getBoundingClientRect()` hesapları yapar, bu da performansı ciddi anlamda düşürürdü. 🐌 Neyse ki artık bu çağ geride kaldı. Intersection Observer, bize bu işi inanılmaz verimli bir şekilde yapma gücü veriyor.

Intersection Observer Nedir?
Basitçe söylemek gerekirse, bu API, belirlediğimiz bir hedef elementin, belirlediğimiz bir kapsayıcı element (genellikle viewport) ile kesişme durumunu gözlemlememizi sağlar. Yani "Şu div ekrana geldi mi?" sorusunun cevabını, performans kaygısı olmadan alabiliriz. ⚙️

Neden Bu Kadar Önemli?
  • Performans: Scroll olay dinleyicileri ve sürekli layout hesaplamalarından kurtulursunuz. Tarayıcı bu işi sizin için optimize edilmiş bir şekilde halleder.
  • Kullanım Kolaylığı: Karmaşık matematik hesaplarına gerek yok. Basit bir yapılandırma ile işinizi görürsünüz.
  • Kullanıcı Deneyimi (UX): Görüntülenmeyen içerikleri yüklemeyerek sayfa açılış hızını artırır, gerektiğinde animasyonları tetikleyerek daha akıcı bir deneyim sunar.

Pratik Kullanım Alanları (Nerelerde Kullanılır?) 💡
  • Lazy Loading (Tembel Yükleme): Bu en bilinen kullanımı. Sayfadaki resimleri, iframe'leri veya bileşenleri, kullanıcı onlara yaklaşana kadar yüklemeyebilirsiniz. Bu, ilk sayfa yükünü inanılmaz hafifletir.
  • Sonsuz Scroll (Infinite Scroll): Kullanıcı sayfanın sonuna yaklaştığında yeni içerikleri otomatik olarak yüklemek için mükemmeldir.
  • Animasyon Tetikleyici: Bir element ekrana geldiğinde fade-in, slide-up gibi animasyonları başlatabilirsiniz.
  • Görünürlük Takibi: Reklam görüntülemelerini veya belirli bir içeriğin ne kadar süre görüntülendiğini takip etmek için kullanılabilir.

Nasıl Kullanılır? (Basit Bir Örnek)
Hadi basit bir lazy loading resim örneği yapalım. HTML'imizde resimlerin `src` özelliği yerine `data-src` kullanacağız.

Kod:
<!-- HTML -->
<img class="lazy-image" data-src="gercek-resim-yolu.jpg" src="kucuk-placeholder.jpg" alt="Açıklama">

Şimdi JavaScript tarafında Observer'ımızı oluşturalım:

Kod:
// JavaScript
document.addEventListener("DOMContentLoaded", function() {
  // 1. Gözlemleyeceğimiz tüm resimleri seç
  const lazyImages = document.querySelectorAll('.lazy-image');

  // 2. Intersection Observer yapılandırmasını oluştur
  const imageObserver = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      // 3. Eğer element görünür alana girdiyse
      if (entry.isIntersecting) {
        const img = entry.target; // Gözlemlenen resim elementimiz
        // 4. data-src'deki gerçek yolu, src'ye ata
        img.src = img.dataset.src;
        // 5. Resim yüklendikten sonra lazy-image sınıfını kaldırabiliriz (opsiyonel)
        img.addEventListener('load', () => {
          img.classList.remove('lazy-image');
        });
        // 6. Bu elementi artık gözlemlemeyi bırak (bir kere yüklenmesi yeterli)
        observer.unobserve(img);
      }
    });
  }, {
    // 7. Opsiyonel ayarlar: Element viewport'a ne kadar yaklaşınca tetiklensin?
    rootMargin: '50px', // Viewport'un 50px dışından başla gözlemlemeye
    threshold: 0.1 // Elementin %10'u görünür olunca tetikle
  });

  // 8. Tüm lazy-image'ları gözlemciye kaydet
  lazyImages.forEach(image => {
    imageObserver.observe(image);
  });
});

Gözlemci Seçenekleri (Options) ⚙️
Observer'ı oluştururken ikinci parametre olarak bir options nesnesi geçebiliriz:
  • root: Hangi elementin viewport yerine geçeceğini belirler. `null` (varsayılan) tarayıcı penceresidir.
  • rootMargin: Root'un kenar boşluklarını CSS'deki gibi (`10px 20px 30px 40px`) belirler. Gözlem alanını genişletip daraltmak için harika.
  • threshold: Hangi oranda kesişme olduğunda callback'in tetikleneceğini belirler. `0` (sıfır) demek "elementin 1 pikseli görünür olur olmaz" demektir. `1` ise "tamamı görünür olunca" demektir. Bir dizi de olabilir: `[0, 0.25, 0.5, 0.75, 1]`

Dikkat Edilmesi Gerekenler & İpuçları
  • Tarayıcı Desteği: Modern tarayıcıların neredeyse tamamında destekleniyor. Eski tarayıcılar (IE) için polyfill kullanmanız gerekebilir.
  • Gözlemlemeyi Bırakın (unobserve): Yukarıdaki örnekte yaptığımız gibi, işiniz bittikten sonra (örneğin resim yüklendikten sonra) `observer.unobserve(element)` çağrısını yapmayı unutmayın. Bu, gereksiz işlemleri önler.
  • Disconnect: Eğer bir sayfadan ayrılırken veya component'iniz destroy olurken tüm gözlemleri durdurmak isterseniz `observer.disconnect()` metodunu kullanın.
  • Performans İçin rootMargin: Lazy loading yaparken, kullanıcı resme ulaşmadan biraz önce yüklenmesi için `rootMargin: '200px'` gibi bir değer kullanmak kullanıcı deneyimini pürüzsüzleştirir.

Umarım bu rehber, bu güçlü API'yi projelerinize entegre etmeniz için size ilham ve başlangıç noktası olur. 🎯 Denemeye başladığınızda, eskiden ne kadar çok kod yazdığınızı görüp şaşıracaksınız. Herkese bol kodlu, performanslı günler! 💻

Sorularınız olursa yorumlarda bekliyorum, beraber tartışalım!
 

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