React İle Web Uygulamaları İçin Dinamik Bir Yazı Yazı Tipi Ölçeklendirici Nasıl Yapılır?

React İle Web Uygulamaları İçin Dinamik Bir Yazı Yazı Tipi Ölçeklendirici Nasıl Yapılır?
React İle Web Uygulamaları İçin Dinamik Bir Yazı Yazı Tipi Ölçeklendirici Nasıl Yapılır?

React İle Web Uygulamaları İçin Dinamik Bir Yazı Tipi Ölçeklendirici Nasıl Yapılır?

Modern web arayüzlerinde kullanıcı deneyimini (UX) iyileştiren en önemli unsurlardan biri, metinlerin farklı ekran boyutlarına ve kullanıcı tercihlerine göre uyum sağlamasıdır. React ile web uygulamaları için dinamik bir yazı tipi ölçeklendirici yapmak, özellikle erişilebilirlik standartlarını karşılamak ve farklı cihazlarda okunabilirliği optimize etmek isteyen geliştiriciler için kritik bir beceridir.

Bu rehberde, React'in state yönetimi ve CSS değişkenleri (CSS Variables) gücünü kullanarak, kullanıcıların kendi metin boyutlarını ayarlayabileceği veya ekran genişliğine göre otomatik ölçeklenen bir sistemin nasıl kurulacağını adım adım inceleyeceğiz. Bu eğitim, modern React (v18+) ve fonksiyonel bileşen yapısına odaklanmaktadır.

Gereksinimler ve Ön Hazırlık

Bu projeye başlamadan önce bilgisayarınızda Node.js'in güncel bir sürümünün (LTS) kurulu olduğundan emin olun. React projenizi oluşturmak için Vite kullanmanız önerilir, çünkü geliştirme sürecinde daha hızlı bir deneyim sunar.

Proje dizininizde terminali açarak şu komutu çalıştırın:

npm create vite@latest dynamic-font-scaler -- --template react
cd dynamic-font-scaler
npm install

Bu kurulumdan sonra, projenin temel yapısını oluşturmuş olacaksınız. CSS ölçeklendirme mantığımızı global bir seviyede yönetmek için index.css dosyanızı temizleyerek başlayabilirsiniz.

Adım Adım Dinamik Ölçekleyici Mantığı

Dinamik ölçeklendirme, temelde bir "base font size" (temel yazı tipi boyutu) değerinin, kullanıcı etkileşimi veya pencere genişliği ile güncellenmesi prensibine dayanır. React'te bunu yönetmek için useState ve useEffect kancalarını (hooks) kullanacağız.

Öncelikle, yazı tipi boyutunu tutacak bir state tanımlayalım:

import { useState, useEffect } from 'react';

const useFontSize = (initialSize = 16) => {
  const [fontSize, setFontSize] = useState(initialSize);

  useEffect(() => {
    document.documentElement.style.setProperty('--base-font-size', `${fontSize}px`);
  }, [fontSize]);

  return [fontSize, setFontSize];
};

Bu kod bloğu, fontSize değerini bir React state'i olarak tutar ve her değiştiğinde kök (root) HTML elementine bir CSS değişkeni atar. Böylece tüm uygulama bu değişkene göre otomatik olarak güncellenir.

CSS Değişkenleri ile Ölçeklendirme

React tarafında değişkeni güncelledikten sonra, CSS tarafında bu değişkeni kullanmamız gerekir. Modern web tasarımında rem birimi, kök elementin yazı tipi boyutuna göre hesaplandığı için en ideal yöntemdir.

index.css dosyanıza şu tanımlamaları ekleyin:

:root {
  --base-font-size: 16px;
  font-size: var(--base-font-size);
}

body {
  font-size: 1rem;
  transition: font-size 0.2s ease-in-out;
}

h1 {
  font-size: 2.5rem;
}

Burada transition özelliği kullanarak, boyut değişimlerinin ani değil, yumuşak bir geçişle gerçekleşmesini sağlıyoruz. rem kullanımı sayesinde tüm başlıklar ve paragraflar, kök boyuta göre orantılı olarak ölçeklenecektir.

Kullanıcı Kontrollü Ölçekleyici Bileşeni

Kullanıcıların yazı tipini butonlar aracılığıyla değiştirmesine izin vermek, erişilebilirlik açısından harika bir pratiktir. Aşağıdaki bileşen, yazı boyutunu artırıp azaltmanıza olanak tanır.

const FontSizeController = ({ setFontSize }) => {
  return (
    
setFontSize(s => Math.max(12, s - 2))}>Küçült setFontSize(s => Math.min(24, s + 2))}>Büyüt
); };

Bu bileşen, setFontSize fonksiyonunu kullanarak boyutu 12px ile 24px arasında sınırlandırır. Math.max ve Math.min kullanımı, kullanıcıların metni okunamaz derecede küçük veya çok büyük yapmasını engeller.

Ekran Genişliğine Göre Otomatik Ölçeklendirme

Bazen kullanıcı etkileşimi yerine, ekran genişliğine göre otomatik bir ölçeklendirme isteyebilirsiniz. Bunun için window.innerWidth değerini takip eden bir useEffect kullanabiliriz.

useEffect(() => {
  const handleResize = () => {
    if (window.innerWidth < 768) {
      setFontSize(14);
    } else {
      setFontSize(16);
    }
  };

  window.addEventListener('resize', handleResize);
  return () => window.removeEventListener('resize', handleResize);
}, []);

Bu kod, pencere boyutu değiştiğinde otomatik olarak fontSize değerini günceller. return içerisindeki removeEventListener kısmı, bellek sızıntılarını (memory leaks) önlemek için kritik öneme sahiptir.

Karşılaştırma: Ölçeklendirme Yöntemleri

Yöntem Avantaj Dezavantaj
CSS Media Queries Performanslı, tarayıcı destekli Dinamik kullanıcı kontrolü yok
React State + CSS Var Esnek, kullanıcı kontrollü Ekstra JavaScript yükü
Viewport Units (vw/vh) Tam duyarlı Erişilebilirlik sorunları olabilir

Güvenlik Uyarısı: Dinamik olarak CSS değişkenlerini güncellerken, kullanıcıdan alınan girdilerin (input) doğrudan stil özelliklerine atanmadığından emin olun. Eğer kullanıcıya özel bir değer girme imkanı tanıyorsanız, mutlaka bir sayı doğrulama (validation) mekanizması kullanın.

Sıkça Sorulan Sorular

Neden rem birimini kullanmalıyım?

rem birimi, kullanıcının tarayıcı ayarlarındaki varsayılan yazı tipi boyutuna saygı duyar. Bu, görme engelli kullanıcıların tarayıcı üzerinden metinleri büyütebilmesini sağlar.

Bu yöntem performans sorununa yol açar mı?

Hayır, CSS değişkenlerinin güncellenmesi tarayıcılar için oldukça hafiftir. Ancak resize olayını dinlerken debounce veya throttle tekniklerini kullanarak performans optimizasyonu yapabilirsiniz.

Mobil cihazlarda nasıl test ederim?

Chrome Geliştirici Araçları'ndaki (F12) "Device Toolbar" özelliğini kullanarak farklı ekran boyutlarını simüle edebilir ve ölçeklendirme mantığınızı test edebilirsiniz.

Daha fazla ölçekleme basamağı ekleyebilir miyim?

Evet, setFontSize fonksiyonunda 2px yerine 1px'lik adımlar kullanabilir veya bir dizi (array) içerisinden önceden tanımlanmış boyutları seçtirebilirsiniz.

Kullanıcı ayarını nasıl kalıcı hale getiririm?

Kullanıcının seçtiği yazı tipi boyutunu localStorage içerisinde saklayarak, sayfa yenilendiğinde aynı boyutta kalmasını sağlayabilirsiniz.

İleri Seviye Optimizasyon: Performans ve Tarayıcı Uyumluluğu

Dinamik yazı tipi ölçeklendirme sistemleri, özellikle çok sayıda bileşenin aynı anda yeniden render edilmesi durumunda performans darboğazlarına yol açabilir. React'in useMemo ve useCallback kancalarını kullanarak, ölçeklendirme hesaplamalarının sadece ihtiyaç duyulduğunda tetiklenmesini sağlamak kritik öneme sahiptir.

Render Performansını İyileştirme

Her yazı tipi değişikliğinde tüm uygulama ağacının yeniden hesaplanmasını önlemek için, ölçekleme değerini bir Context API sağlayıcısı üzerinden yönetmek en verimli yoldur. Aşağıdaki örnek, gereksiz render işlemlerini nasıl engelleyeceğinizi gösterir:

import React, { useMemo, createContext, useContext } from 'react';

const FontScaleContext = createContext();

export const FontScaleProvider = ({ children, scale }) => {
  const value = useMemo(() => ({ scale }), [scale]);
  
  return (
    
      {children}
    
  );
};

Bu yapı sayesinde, scale değeri değişmediği sürece, bu sağlayıcıyı kullanan alt bileşenler gereksiz yere güncellenmeyecektir. Bu, özellikle karmaşık dashboard tasarımlarında uygulamanın akıcılığını korur.

Alternatif Yaklaşım: CSS Clamp Fonksiyonu ile Hibrit Ölçeklendirme

React state'i ile yapılan manuel ölçeklendirmenin yanı sıra, modern CSS'in clamp() fonksiyonunu kullanarak daha yumuşak geçişler sağlayabilirsiniz. Bu yöntem, JavaScript tabanlı ölçeklendirmenizi tamamlayıcı bir rol oynar.

Clamp ile Dinamik Aralıklar

clamp(minimum, tercih edilen, maksimum) fonksiyonu, yazı tipinin belirli bir aralıkta kalmasını garanti eder. React bileşeninizde bu değeri CSS değişkeni olarak şu şekilde uygulayabilirsiniz:

const DynamicText = ({ baseSize }) => {
  const style = {
    fontSize: `clamp(${baseSize * 0.8}rem, 2vw + 1rem, ${baseSize * 1.5}rem)`
  };

  return 

Bu metin ekran boyutuna göre otomatik ölçeklenir.

};

Bu yaklaşım, JavaScript'in yükünü azaltırken tarayıcının yerel render motorundan faydalanmanızı sağlar. Özellikle mobil cihazlarda, kullanıcının manuel müdahalesine gerek kalmadan metinlerin okunabilirliğini artırmak için idealdir.

Hata Ayıklama (Debugging) İpuçları

Ölçeklendirme sisteminizde bir sorun oluştuğunda şu adımları izleyerek hızlıca çözüm üretebilirsiniz:

  • Console Log Kontrolü: localStorage'dan gelen değerin bir sayı (integer) olup olmadığını typeof ile kontrol edin. Bazen veriler string olarak dönebilir ve matematiksel işlemleri bozabilir.
  • CSS Değişkeni İzleme: Tarayıcı geliştirici araçlarında (Elements sekmesi) :root veya ilgili kapsayıcı elementin üzerindeki CSS değişkeninin (örneğin --font-scale) güncellenip güncellenmediğini canlı olarak gözlemleyin.
  • Kapsam (Scope) Sorunları: Eğer ölçeklendirme tüm sayfayı etkilemiyorsa, CSS değişkeninin tanımlandığı kapsayıcı (container) ile bileşenin hiyerarşik konumunu kontrol edin.

Sonuç

React ile dinamik bir yazı tipi ölçeklendirici yapmak, hem kullanıcı deneyimini zenginleştirir hem de uygulamanızın profesyonel bir erişilebilirlik seviyesine ulaşmasını sağlar. CSS değişkenleri ve React'in state yönetimini birleştirerek esnek ve sürdürülebilir bir yapı kurduk. Bir sonraki adım olarak, bu verileri localStorage ile kalıcı hale getirmeyi ve bir "Ayarlar" paneli ile kullanıcı deneyimini kişiselleştirmeyi deneyebilirsiniz. Kodunuzun güvenliği için her zaman kullanıcı girdilerini doğrulamayı ve üretim (production) ortamına geçmeden önce farklı tarayıcılarda test etmeyi unutmayın.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Yaratıcı problem çözme teknikleri üzerine odaklanan bir içerik editörüyüm. Hayatı pratikleştiren tüyolarla okuyucuya zaman kazandırmayı hedefleyen yazılar kurguluyorum.

Yorumlar (0)

Yorum Yaz