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 `ResizeObserver` API ile Dinamik ve Performanslı Arayüzler Oluşturma Rehberi 🎯

devnix

Üye
Katılım
14 Mart 2026
Mesajlar
9
Web Geliştirmede `ResizeObserver` API ile Dinamik ve Performanslı Arayüzler Oluşturma Rehberi 🎯

Selam dostlar! 👋 Uzun zamandır forumda takılıyorum ve bugün sizlerle, özellikle karmaşık ve dinamik arayüzler üzerinde çalışırken hayat kurtaran ama belki de yeterince bilinmeyen bir JavaScript API'sinden bahsetmek istiyorum: ResizeObserver.

Peki nedir bu ResizeObserver? Kısaca, bir HTML elementinin boyutları değiştiğinde bizi haberdar eden bir gözlemci. Eskiden bunun için `window.resize` event'ini dinlerdik ama bu sadece tarayıcı penceresi için geçerliydi. Bir `div`, `textarea` ya da herhangi bir elementin boyutu değiştiğinde bunu yakalamak için ya `setInterval` ile sürekli kontrol ederdik (performans katili! ⚠️) ya da bazı hack'ler kullanırdık. İşte `ResizeObserver` tam da bu sorunu çözmek için gelmiş bir nimet.

Neden ResizeObserver Kullanmalıyız?

  • Performans: `setInterval` veya sürekli layout hesaplamalarına gerek kalmaz. API, değişiklik olduğunda sizi uyarır.
  • Hassasiyet: Sadece gözlemlediğiniz elementteki değişiklikleri yakalarsınız. CSS Transition, içerik değişimi, font yüklenmesi, kullanıcı input'u gibi her türlü boyut değişikliğini.
  • Modern ve Standart: Artık tüm modern tarayıcılarda destekleniyor. Polyfill ile de eski tarayıcıları destekleyebilirsiniz.

Temel Kullanım: Nasıl Çalışır?

Kullanımı gerçekten basit. Hemen bir örnekle gösterelim:

Kod:
// 1. Gözlemciyi oluşturuyoruz
const myObserver = new ResizeObserver((entries) => {
  for (let entry of entries) {
    // entry.target -> Boyutu değişen element
    // entry.contentRect -> Yeni boyut bilgileri (width, height, x, y vb.)
    console.log(`${entry.target.id} yeniden boyutlandı!`);
    console.log(`Yeni Genişlik: ${entry.contentRect.width}px`);
    console.log(`Yeni Yükseklik: ${entry.contentRect.height}px`);

    // Burada istediğiniz mantığı çalıştırabilirsiniz.
    // Örneğin, bir grafiği yeniden çizmek, layout'u güncellemek...
  }
});

// 2. Gözlemlemek istediğimiz elementi seçiyoruz
const myElement = document.getElementById('dinamikKutu');

// 3. Gözlemciyi elementi izlemek için başlatıyoruz
myObserver.observe(myElement);

// 4. İzlemeyi durdurmak istediğinizde (component unmount olduğunda unutmayın!)
// myObserver.unobserve(myElement);
// veya tüm gözlemleri durdurmak için:
// myObserver.disconnect();

Gerçek Dünya Senaryoları 🚀

Şimdi gelin bu gücü pratikte nerede kullanabileceğimize bakalım:

  • Dinamik Grafikler ve Haritalar: D3.js veya Chart.js ile bir grafik oluşturduysanız, konteyner `div`'in boyutu değiştiğinde (örneğin, kullanıcı paneli genişlettiğinde) grafiğinizi otomatik olarak yeniden boyutlandırmak için birebir.
  • Responsive Bileşenler: Sadece CSS media query'ler yetmediğinde! Bir bileşenin kendi iç genişliğine göre davranışını değiştirebilirsiniz. Örneğin, geniş bir alandayken yan yana duran öğeler, dar bir alana sığdırılmaya çalışıldığında alt alta geçebilir. Buna "Container Queries" mantığının JavaScript ile implementasyonu diyebiliriz.
  • Textarea Auto-Expand: Kullanıcı yazdıkça yüksekliği otomatik artan bir textarea yapmak çok kolay. `contentRect.height` değişimini izleyip, elementin `style.height`'ını güncelleyebilirsiniz.
  • Masonry veya Izgara Düzenleri: Öğelerin boyutları dinamikse (içerik yüklendikçe vs.), `ResizeObserver` ile her bir öğenin boyut değişikliğini yakalayıp, tüm düzeni yeniden hesaplayabilirsiniz.
  • Üçüncü Parti Widget'ları Takip Etmek: Sayfaya embed ettiğiniz bir video oynatıcı veya sosyal medya widget'ının boyutu değiştiğinde, etrafındaki layout'u buna göre ayarlamak için kullanışlıdır.

Performans İpuçları ve Dikkat Edilmesi Gerekenler ⚙️

Her güçlü araç gibi, bunu da doğru kullanmak önemli.

  • Gözlemi Temizle: SPA'lerde (React, Vue, Angular) çalışıyorsanız, component destroy olduğunda mutlaka `unobserve()` veya `disconnect()` metodlarını çağırın. Bellek sızıntısına (memory leak) neden olabilir.
  • Debounce Ekleyin: Bazı durumlarda (özellikle sürekli ve hızlı boyut değişikliklerinde), callback fonksiyonunuz çok sık tetiklenebilir. Ağır işlemler yapıyorsanız, bir debounce fonksiyonu ile callback'inizi sarmalamanız performans için iyi olur.
  • Hangi Elementi İzlediğinizi Bilin: Çok fazla elementi aynı anda gözlemlerseniz, her biri için ayrı callback tetiklenebilir. Mümkünse en üstteki ortak ebeveyni gözlemlemeye çalışın.
  • contentRect vs getBoundingClientRect(): `entry.contentRect` temel bilgileri verir. Daha detaylı padding, border, margin bilgilerine ihtiyacınız varsa `entry.target.getBoundingClientRect()` kullanabilirsiniz.

Küçük Bir React Örneği (Hooks ile) 💻

React kullananlar için, bunu bir custom hook'a dönüştürmek çok mantıklı:

Kod:
import { useEffect, useRef } from 'react';

function useResizeObserver(callback) {
  const ref = useRef(null);

  useEffect(() => {
    if (!ref.current) return;

    const observer = new ResizeObserver(callback);
    observer.observe(ref.current);

    // Cleanup
    return () => {
      observer.disconnect();
    };
  }, [callback]);

  return ref;
}

// Kullanımı:
function MyComponent() {
  const handleResize = (entries) => {
    const width = entries[0].contentRect.width;
    if (width < 400) {
      // Dar mod için state güncelle
    } else {
      // Geniş mod için state güncelle
    }
  };

  const containerRef = useResizeObserver(handleResize);

  return <div ref={containerRef}>İçerik buraya...</div>;
}

Sonuç Olarak

`ResizeObserver`, modern web geliştirme araç kutumuzdaki en kullanışlı araçlardan biri. Özellikle responsive ve kullanıcı etkileşimli uygulamalar geliştirirken, CSS'in yetmediği noktalarda bize büyük bir esneklik ve kontrol sağlıyor. 🎉

Bir sonraki projenizde, bir elementin boyutuna göre bir şeyler yapmanız gerektiğinde, hemen `setInterval` veya `requestAnimationFrame` döngülerine sarılmayın. Önce "Acaba `ResizeObserver` ile daha temiz ve performanslı bir çözüm yapabilir miyim?" diye düşünün.

Deneyimlerinizi ve sorularınızı yorumlarda paylaşmayı unutmayın! Hep birlikte öğrenelim. Kolay gelsin! ✨
 
Vay canına, bu konu tam benim ilgi alanıma giren türden! Evren gibi, web arayüzleri de sürekli genişliyor ve değişiyor. ResizeObserver'ı, bir elementin kendi uzay-zamanındaki (boyutlarındaki) değişimleri gözlemleyen bir teleskop gibi düşünebiliriz.

devnix'in React hook örneği harika! Uzay görevlerinde kullanılan özel sensörler gibi, özelleştirilmiş bir hook'a dönüştürmek gerçekten temiz bir çözüm. Performans ipuçları da çok kritik, özellikle bellek sızıntısı konusu. Gözlemi durdurmamak, arka planda sönmeyen bir yıldız gibi kaynak tüketmeye devam eder.

Benim de aklıma geldi, astronomi verilerini görselleştiren dinamik bir dashboard yaparken bu API'yi kullanmıştım. Grafik konteynerinin boyutu değiştiğinde, teleskop verilerinin plot'unu anında yeniden ölçeklendirmek müthiş bir kullanıcı deneyimi sağlamıştı. Kesinlikle her geliştiricinin araç kutusunda olmalı.
 

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