Gereksinimler ve Ön Hazırlık
Bu rehberi uygulayabilmek için bilgisayarınızda Node.js yüklü olmalı ve temel bir React projesi oluşturulmuş olmalıdır. Uygulamanın 2026 yılı standartlarına uygun olması için Vite tabanlı bir kurulum öneriyoruz. Projenizi başlatmak için terminalinizde şu komutları kullanabilirsiniz:
npm create vite@latest typing-effect-app -- --template react
cd typing-effect-app
npm install
npm run dev
Bu komutlar, projenizin temel dizin yapısını oluşturacak ve geliştirme sunucusunu ayağa kaldıracaktır. React 18 veya daha yeni bir sürüm kullanmanız, performans iyileştirmeleri ve güncel hook yapıları için önemlidir.
Temel Mantık: Metin Yazdırma Fonksiyonu
Dinamik bir yazı yazdırma efekti oluşturmanın temelinde, bir dizi içerisindeki karakterlerin belirli aralıklarla ekrana basılması yatar. Bunun için React'in useState hook'u ile metnin o anki halini tutmalı, useEffect ile de zamanlayıcıyı yönetmeliyiz.
Aşağıdaki kod örneği, basit bir metni karakter karakter yazdıran temel mantığı göstermektedir:
import { useState, useEffect } from 'react';
const TypingEffect = ({ text }) => {
const [displayedText, setDisplayedText] = useState('');
useEffect(() => {
let i = 0;
const interval = setInterval(() => {
if (i < text.length) {
setDisplayedText((prev) => prev + text.charAt(i));
i++;
} else {
clearInterval(interval);
}
}, 100);
return () => clearInterval(interval);
}, [text]);
return {displayedText};
};
Bu örnekte setInterval kullanarak her 100 milisaniyede bir metnin bir sonraki karakterini mevcut duruma ekliyoruz. useEffect içindeki temizleme fonksiyonu (cleanup function), bileşen ekrandan kaldırıldığında zamanlayıcının durmasını sağlayarak bellek sızıntılarını önler.
Döngüsel Yazı Yazdırma Efekti Oluşturma
Genellikle kullanıcılar tek bir metin yerine, birbirini takip eden farklı cümlelerin dönmesini isterler. Bunun için bir dizi (array) tanımlamalı ve metin bittiğinde silme (backspace) efektini de devreye almalıyız.
const phrases = ["Merhaba, Dünya!", "React öğreniyorum.", "Dinamik efektler harika!"];
// Bu dizi, sırayla ekrana yazdırılacak metinleri tutar.
Bu mantığı kurgulamak için hem metni yazma hem de silme durumlarını yöneten bir state yapısı kurmamız gerekir. Aşağıdaki örnekte, metin tamamlandığında kısa bir bekleme süresi ekleyip ardından silme işlemine geçen gelişmiş bir yapı göreceksiniz.
const TypingLoop = ({ phrases }) => {
const [text, setText] = useState('');
const [index, setIndex] = useState(0);
const [isDeleting, setIsDeleting] = useState(false);
useEffect(() => {
const timeout = setTimeout(() => {
const currentPhrase = phrases[index % phrases.length];
setText(isDeleting ? currentPhrase.substring(0, text.length - 1) : currentPhrase.substring(0, text.length + 1));
if (!isDeleting && text === currentPhrase) {
setTimeout(() => setIsDeleting(true), 1500);
} else if (isDeleting && text === '') {
setIsDeleting(false);
setIndex(index + 1);
}
}, isDeleting ? 50 : 100);
return () => clearTimeout(timeout);
}, [text, isDeleting, index, phrases]);
return
{text}
;
};
Bu kodda setTimeout kullanarak animasyon hızını dinamik olarak değiştirdik. Yazarken 100ms, silerken 50ms hız kullanarak daha doğal bir daktilo hissi oluşturduk.
Performans ve Optimizasyon İpuçları
React uygulamalarında useEffect içerisinde sürekli çalışan zamanlayıcılar dikkatli yönetilmelidir. Eğer bileşeniniz çok sık yeniden render ediliyorsa (re-render), animasyonunuz takılabilir veya beklenmedik davranışlar sergileyebilir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| setInterval | Basit ve hızlı kurulum | Hassas zamanlama sorunları |
| setTimeout | Daha kontrollü akış | Kod karmaşıklığı artabilir |
| CSS Animasyonları | GPU hızlandırmalı, performanslı | Dinamik içeriklerde zor |
Yukarıdaki tabloda görüldüğü gibi, dinamik içeriklerde setTimeout kullanımı, setInterval'a göre daha güvenli ve yönetilebilir bir akış sunar.
Kritik Uyarılar ve Güvenlik
Dikkat: Kullanıcıdan alınan verileri (input) doğrudan bu efektle ekrana basıyorsanız, XSS (Cross-Site Scripting) saldırılarına karşı dikkatli olun. Metin içeriğini her zaman string olarak işleyin ve dangerouslySetInnerHTML gibi yöntemlerden kaçının. Ayrıca, üretim ortamında (production) animasyonların cihaz kaynaklarını tüketmemesi için bileşenlerin görünürlüğünü (Intersection Observer) kontrol etmeniz önerilir.
Sıkça Sorulan Sorular
Yazı yazdırma efekti SEO'yu etkiler mi?
Google botları JavaScript ile oluşturulan içerikleri okuyabilir, ancak metnin tamamının ilk yüklemede HTML içinde görünmesi SEO açısından her zaman daha garantidir. Animasyonu sadece görsel bir süs olarak kullanın.
Animasyon hızını nasıl değiştirebilirim?
Kod içindeki setTimeout süresini (örneğin 100ms) bir prop olarak dışarıdan alabilir, böylece her bileşen için farklı hızlar tanımlayabilirsiniz.
Mobil cihazlarda animasyon kasıyor, ne yapmalıyım?
Mobil cihazlarda işlemciyi yormamak için requestAnimationFrame API'sini kullanmayı düşünebilirsiniz. Bu API, tarayıcının ekran tazeleme hızına göre animasyonu optimize eder.
Birden fazla satırı aynı anda yazdırabilir miyim?
Evet, her satır için ayrı bir state veya bir dizi yapısı kullanarak her satırın kendi zamanlayıcısını çalıştırmasını sağlayabilirsiniz.
TypeScript ile nasıl kullanırım?
Props tanımlamalarınızı interface ile yaparak, örneğin phrases: string[] şeklinde tip güvenliği sağlayarak daha hatasız kod yazabilirsiniz.
Framer Motion ile Gelişmiş Animasyon Entegrasyonu
React'in yerel useEffect ve setInterval yapıları ile temel bir efekt oluşturmak oldukça öğreticidir. Ancak, daha akıcı geçişler, yaylanma (spring) efektleri ve karmaşık animasyon dizileri için Framer Motion kütüphanesini kullanmak profesyonel bir yaklaşımdır. Framer Motion, metinleri karakter bazlı animasyonlara dönüştürmek için staggerChildren gibi güçlü özellikler sunar.
Aşağıdaki örnekte, metinlerin birer birer ekrana gelmesini sağlayan daha modern bir yaklaşımı inceleyelim:
import { motion } from "framer-motion";
const AnimatedText = ({ text }) => {
const letters = Array.from(text);
const container = {
hidden: { opacity: 0 },
visible: (i = 1) => ({
opacity: 1,
transition: { staggerChildren: 0.05, delayChildren: 0.04 * i },
}),
};
const child = {
visible: {
opacity: 1,
y: 0,
transition: { type: "spring", damping: 12, stiffness: 100 },
},
hidden: { opacity: 0, y: 20 },
};
return (
{letters.map((letter, index) => (
{letter === " " ? "\u00A0" : letter}
))}
);
};
Yazı Yazdırma Efektlerinde Hata Ayıklama (Debugging) Stratejileri
Dinamik metin efektleri geliştirirken karşılaşılan en yaygın sorunlar, bileşen yeniden render edildiğinde animasyonun sıfırlanması veya clearInterval unutulduğu için oluşan bellek sızıntılarıdır (memory leaks). Bu sorunları çözmek için şu stratejileri izleyebilirsiniz:
- Cleanup Fonksiyonlarını Kontrol Edin:
useEffectiçerisinde oluşturduğunuz hersetIntervalveyasetTimeoutiçin mutlakareturn () => clearInterval(id)yapısını kurduğunuzdan emin olun. - State Güncelleme Çakışmaları: Eğer metin değişkeni çok hızlı değişiyorsa,
functional updateyöntemini kullanın:setText(prev => prev + nextChar). - Geliştirici Araçları: React DevTools kullanarak bileşenin kaç kez render edildiğini izleyin. Eğer her karakter eklenişinde tüm bileşen ağacı yeniden çiziliyorsa,
React.memokullanarak alt bileşenleri optimize edin.
Yaygın Hata Tablosu
| Hata Türü | Belirti | Çözüm |
|---|---|---|
| Bellek Sızıntısı | Tarayıcı sekmesi yavaşlıyor | useEffect cleanup fonksiyonunu ekle |
| Render Döngüsü | "Too many re-renders" hatası | State güncellemelerini koşullu hale getir |
| Zamanlama Kayması | Metinler üst üste biniyor | CSS white-space: pre-wrap kullan |
Bu hata ayıklama adımları, özellikle karmaşık landing page tasarımlarında animasyonlarınızın kararlı çalışmasını sağlayacaktır. Unutmayın ki, animasyonun akıcılığı kadar, tarayıcı kaynaklarını ne kadar verimli kullandığınız da kullanıcı deneyimi açısından kritiktir.
Sonuç
React ile dinamik bir yazı yazdırma efekti yapmak, state yönetimi ve useEffect kullanımı konusunda harika bir pratik sağlar. Bu makalede, basit bir karakter diziliminden, döngüsel ve silme efektli gelişmiş bir yapıya kadar ilerledik. Bir sonraki adım olarak, bu bileşene imleç (cursor) animasyonu ekleyebilir veya Framer Motion gibi popüler animasyon kütüphanelerini kullanarak daha akıcı geçişler deneyebilirsiniz.
Not: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Ticari projelerinizde kullanırken kod güvenliği sorumluluğu geliştiriciye aittir; özellikle kullanıcı girdilerini temizlemeyi (sanitization) ihmal etmeyin.

Yorumlar (0)
Yorum Yaz