Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce bilgisayarınızda güncel bir Node.js sürümünün (v18 veya üzeri önerilir) kurulu olması gerekmektedir. React projenizi oluşturmak için Vite kullanmanızı öneririz; çünkü Vite, hızlı derleme süresi ve modern yapılandırması ile 2026 standartlarına en uygun araçtır.
- Node.js (LTS sürümü)
- React 19 ve üzeri
- Temel düzeyde CSS değişkenleri bilgisi
- Tercihen bir paket yöneticisi (npm, yarn veya pnpm)
Yeni bir proje oluşturmak için terminalinizde şu komutu çalıştırın:
npm create vite@latest dinamik-tipografi -- --template react
cd dinamik-tipografi
npm install
Bu komutlar, projenizin temel dizin yapısını kuracak ve gerekli bağımlılıkları yükleyecektir. Kurulum tamamlandıktan sonra geliştirme sunucusunu npm run dev komutuyla başlatabilirsiniz.
Adım 1: Ekran Genişliğini İzleyen Custom Hook Oluşturma
Dinamik bir ölçekleyici için öncelikle tarayıcının o anki genişliğini takip etmemiz gerekir. React'in useState ve useEffect kancalarını kullanarak, pencere boyutu her değiştiğinde güncellenen bir useWindowWidth hook'u yazacağız.
import { useState, useEffect } from 'react';
export const useWindowWidth = () => {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setWidth(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return width;
};
Bu kod, pencere yeniden boyutlandırma olaylarını (resize event) dinler. useEffect içindeki return fonksiyonu, bileşen kaldırıldığında bellek sızıntılarını önlemek için olay dinleyicisini temizler.
Adım 2: Yazı Tipi Ölçekleme Mantığını Kurma
Şimdi elde ettiğimiz genişlik verisini, yazı tipi boyutuna dönüştürecek bir formüle ihtiyacımız var. Genellikle "Clamp" fonksiyonu veya doğrusal bir oranlama kullanılır. Biz burada, belirli bir aralıkta (örneğin 320px ile 1920px arası) yazı tipini ölçekleyen bir yardımcı fonksiyon oluşturacağız.
const calculateFontSize = (width) => {
const minWidth = 320;
const maxWidth = 1920;
const minFont = 16; // px
const maxFont = 24; // px
if (width < minWidth) return minFont;
if (width > maxWidth) return maxFont;
const progress = (width - minWidth) / (maxWidth - minWidth);
return minFont + progress * (maxFont - minFont);
};
Bu fonksiyon, genişlik değerini 16px ile 24px arasında doğrusal bir oranda ölçekler. Bu, metinlerinizin çok küçük ekranlarda okunamaz hale gelmesini veya çok büyük ekranlarda orantısız büyümesini engeller.
Adım 3: React Bileşeninde Ölçekleyiciyi Uygulama
Hook ve hesaplama fonksiyonumuzu ana bileşenimizde birleştirerek metin stilini dinamik hale getirelim. React'in style prop'u ile CSS değişkenlerini güncelleyerek performansı optimize edeceğiz.
import React from 'react';
import { useWindowWidth } from './hooks/useWindowWidth';
const DynamicText = ({ children }) => {
const width = useWindowWidth();
const fontSize = calculateFontSize(width);
return (
{children}
);
};
Burada transition özelliği, boyut değişimlerinin ani değil, yumuşak bir geçişle gerçekleşmesini sağlar. Bu, kullanıcı deneyimi açısından çok daha profesyonel bir görünüm sunar.
Adım 4: Performans ve Optimizasyon Stratejileri
Dinamik ölçekleme yaparken en büyük hata, her piksel değişiminde tüm uygulamayı gereksiz yere render etmektir. Bunu önlemek için useMemo veya requestAnimationFrame gibi teknikler kullanılabilir. Ayrıca, CSS clamp() fonksiyonu ile React tarafını daha hafif tutmak mümkündür.
/* CSS Dosyanızda */
:root {
--dynamic-font: clamp(1rem, 0.8rem + 0.5vw, 1.5rem);
}
.text-container {
font-size: var(--dynamic-font);
}
CSS clamp kullanımı, JavaScript yükünü azaltır ve tarayıcının yerel olarak metni ölçeklemesini sağlar. Eğer karmaşık bir ölçekleme mantığınız yoksa, bu yöntem her zaman daha performanslıdır.
Karşılaştırma: JavaScript vs CSS Yöntemleri
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| JavaScript (React) | Karmaşık mantık kurabilme | Daha fazla CPU kullanımı |
| CSS Clamp | Maksimum performans | Sınırlı matematiksel işlem |
Kritik Güvenlik Uyarısı: Dinamik olarak stil değerleri üretirken, kullanıcıdan gelen girdileri (örneğin bir ayar panelinden gelen değerler) doğrudan style prop'una enjekte etmeyin. Bu durum XSS (Cross-Site Scripting) zafiyetlerine yol açabilir. Değerleri her zaman sayısal bir aralıkta (validation) filtreleyin.
Sıkça Sorulan Sorular
Dinamik yazı tipi ölçekleme SEO'yu etkiler mi?
Hayır, doğru uygulandığında SEO'yu olumsuz etkilemez. Google, mobil uyumlu ve okunabilir içerikleri sever. Aksine, metinlerin ekran boyutuna göre optimize edilmesi kullanıcı deneyimi puanınızı (Core Web Vitals) artırabilir.
Neden CSS clamp yerine React Hook kullanmalıyım?
Eğer yazı tipi boyutunu sadece ekran genişliğine göre değil de, uygulamanızdaki belirli bir "tema" değişikliğine veya kullanıcı tercihlerine (örneğin erişilebilirlik modu) göre değiştirmek istiyorsanız React Hook yöntemi daha esnektir.
Bu yöntem mobil cihazlarda pil tüketimini artırır mı?
Çok düşük miktarda artırabilir. Ancak resize olaylarını debounce (gecikmeli işlem) tekniği ile yönetirseniz bu etkiyi tamamen ortadan kaldırabilirsiniz.
Yazı tipi ölçekleme ile satır yüksekliği (line-height) nasıl ayarlanmalı?
Yazı tipi boyutu değiştikçe line-height değerini de orantılı olarak değiştirmelisiniz. Genellikle 1.5 gibi bir katsayıyı CSS değişkeni olarak tanımlayıp dinamik olarak güncellemek en iyi sonucu verir.
Eski tarayıcılar bu yöntemleri destekliyor mu?
Modern CSS clamp fonksiyonu güncel tüm tarayıcılarda desteklenmektedir. React tabanlı yöntem ise ES6 desteği olan her tarayıcıda çalışır.
İleri Düzey İpuçları: Ölçekleme Mantığını Merkezi Yönetimle Birleştirme
Dinamik yazı tipi ölçekleme mantığını tek bir bileşene hapsetmek yerine, React Context API kullanarak bu değerleri uygulamanın genelinde erişilebilir kılmak, kodunuzun sürdürülebilirliğini artırır. Bu yaklaşım, özellikle büyük ölçekli projelerde tipografi ayarlarını tek bir noktadan yönetmenize olanak tanır.
Aşağıdaki örnek, ölçekleme katsayısını ve mevcut ekran boyutunu bir TypographyProvider içerisinde nasıl sarmalayabileceğinizi göstermektedir:
import React, { createContext, useContext } from 'react';
const TypographyContext = createContext();
export const TypographyProvider = ({ children }) => {
const width = useWindowWidth(); // Daha önce oluşturduğumuz hook
const scaleFactor = width > 1024 ? 1.5 : 1.2;
return (
{children}
);
};
export const useTypography = () => useContext(TypographyContext);
Hata Ayıklama ve Geliştirici Deneyimi
Dinamik ölçekleme yaparken en sık karşılaşılan sorun, "Layout Shift" (Düzen Kayması) veya beklenmedik metin kırılmalarıdır. Bu tür durumları tespit etmek için tarayıcı geliştirici araçlarını kullanmanın yanı sıra, ölçekleme katsayısını görselleştiren basit bir debug bileşeni oluşturmak oldukça faydalıdır.
Geliştirme Aşamasında Ölçekleme İzleyici
Geliştirme ortamında, mevcut yazı tipi boyutunun hangi katsayıya göre hesaplandığını görmek için bir "overlay" kullanabilirsiniz. Bu, özellikle farklı ekran genişliklerinde metinlerin nasıl tepki verdiğini canlı olarak gözlemlemenizi sağlar.
const TypographyDebugger = () => {
const { scaleFactor, width } = useTypography();
if (process.env.NODE_ENV !== 'development') return null;
return (
Genişlik: {width}px | Ölçek: {scaleFactor}x
);
};
Bu küçük araç, metinlerinizin tasarım sınırlarını aşıp aşmadığını veya line-height değerlerinin okunabilirliği bozup bozmadığını anında fark etmenize yardımcı olur. Özellikle clamp() fonksiyonu ile React tabanlı hesaplamaları birleştirdiğiniz durumlarda, hangi değerin baskın geldiğini anlamak için bu yöntem hayat kurtarıcıdır.
Ölçekleme Stratejisinde Dikkat Edilmesi Gerekenler
- Minimum ve Maksimum Sınırlar: Metinlerin çok küçük (okunamaz) veya çok büyük (ekranı taşıran) boyutlara ulaşmasını engellemek için her zaman
min()vemax()değerlerini tanımlayın. - Erişilebilirlik (A11y): Kullanıcı tarayıcı üzerinden varsayılan yazı tipi boyutunu değiştirdiğinde, sizin dinamik ölçekleyicinizin bu tercihi ezmediğinden emin olun.
rembirimlerini temel almak, tarayıcı ayarlarıyla uyumluluğu artırır. - Performans:
window.resizeevent'ini doğrudan kullanmak yerine, mutlaka birdebounceveyathrottlemekanizması kullanarak hesaplama maliyetini düşürün.
Sonuç
React ile dinamik bir yazı tipi ölçekleyici oluşturmak, uygulamanızın profesyonellik seviyesini bir üst noktaya taşır. İster CSS clamp fonksiyonunun hızını tercih edin, ister React Hook'larının sağladığı esnekliği kullanın; önemli olan kullanıcıya her cihazda aynı kalitede okuma deneyimi sunmaktır. Bir sonraki adım olarak, bu ölçekleme mantığını bir "Context API" yapısına taşıyarak tüm uygulamanızda merkezi bir tipografi yönetimi kurmayı deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz