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?
Temel Kullanım: Nasıl Çalışır?
Kullanımı gerçekten basit. Hemen bir örnekle gösterelim:
Gerçek Dünya Senaryoları
Şimdi gelin bu gücü pratikte nerede kullanabileceğimize bakalım:
Performans İpuçları ve Dikkat Edilmesi Gerekenler
Her güçlü araç gibi, bunu da doğru kullanmak önemli.
Küçük Bir React Örneği (Hooks ile)
React kullananlar için, bunu bir custom hook'a dönüştürmek çok mantıklı:
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!
Selam dostlar!
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!
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!