Gereksinimler ve Ön Hazırlık
Bu projeyi gerçekleştirmek için özel bir kurulum yapmanıza gerek yoktur. Modern bir web tarayıcısı (Chrome, Firefox, Edge veya Safari) ve herhangi bir metin editörü (VS Code gibi) yeterlidir. 2026 standartlarına uygun olarak, kodlarımızı ES6+ (ECMAScript 2015 ve sonrası) özelliklerini kullanarak, modüler ve okunabilir bir yapıda yazacağız.
- Modern bir web tarayıcısı.
- Temel HTML5 ve CSS3 bilgisi.
- JavaScript'te DOM (Document Object Model) manipülasyonu hakkında temel düzeyde bilgi.
Temel HTML ve CSS Yapısının Kurulması
Yazı yazma efektinin düzgün çalışması için öncelikle metnin görüntüleneceği HTML elementini ve daktilo imlecini temsil edecek CSS stilini hazırlamalıyız. İmleç efekti, kullanıcıya yazma işleminin devam ettiği hissini verir.
|
CSS tarafında, imlecin yanıp sönmesini sağlayan bir animasyon tanımlamamız gerekir. Bu, görsel derinlik katar.
/* CSS Stili */
.imlec {
display: inline-block;
animation: yanip-son 0.7s infinite;
}
@keyframes yanip-son {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
JavaScript ile Yazı Yazma Mantığını Geliştirme
Yazı yazma efektinin temel mantığı, bir dizi karakteri belirli bir zaman aralığıyla (setTimeout veya setInterval kullanarak) DOM elementinin içine eklemektir. Aşağıdaki örnekte, basit bir metni harf harf ekleyen temel fonksiyonu görebilirsiniz.
const metin = "Merhaba, web dünyasına hoş geldiniz!";
const element = document.getElementById("yazi-alani");
let indeks = 0;
function yazdir() {
if (indeks < metin.length) {
element.innerHTML += metin.charAt(indeks);
indeks++;
setTimeout(yazdir, 100);
}
}
yazdir();
Bu kod bloğu, 100 milisaniyelik gecikmelerle metni ekrana basar. setTimeout kullanımı, setInterval'a göre daha esnek bir yapı sunar çünkü her karakterin yazılma süresini dinamik olarak değiştirebiliriz.
Dinamik Metin Dizileri ve Silme Efekti
Profesyonel bir yazı yazma efekti sadece yazmakla kalmaz, aynı zamanda yazdığını silip yeni bir metne geçebilir. Bunun için bir dizi (array) ve metinler arasında geçiş yapan bir döngü mantığı kurmalıyız.
const metinler = ["Web Geliştiriciyim.", "JavaScript Öğreniyorum.", "Projeler Üretiyorum."];
let metinIndeksi = 0;
let karakterIndeksi = 0;
function efekt() {
let guncelMetin = metinler[metinIndeksi];
element.innerHTML = guncelMetin.substring(0, karakterIndeksi);
karakterIndeksi++;
if (karakterIndeksi = 0) {
setTimeout(sil, 50);
} else {
metinIndeksi = (metinIndeksi + 1) % metinler.length;
setTimeout(efekt, 500);
}
}
Bu yöntem, metinlerin birbiri ardına gelmesini ve silinmesini sağlar. substring metodu, metnin belirli bir kısmını kesip alarak DOM'a yansıtır.
Yöntem Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| setTimeout (Önerilen) | Hız kontrolü kolaydır, esnektir. | Kod karmaşıklığı biraz yüksektir. |
| setInterval | Basit yapılıdır. | Döngüyü durdurmak ve yönetmek zordur. |
| CSS Animasyonları | Performanslıdır. | Dinamik içerik yönetimi çok zordur. |
Performans ve Güvenlik Uyarıları
Kritik Uyarı: Kullanıcıdan alınan verileri veya dışarıdan gelen metinleri
innerHTMLile doğrudan sayfaya basarken XSS (Cross-Site Scripting) saldırılarına karşı dikkatli olun. Eğer metinler sabit değilse,innerTextveyatextContentkullanmayı tercih edin. Bu yöntemler, metin içindeki olası HTML etiketlerini işlenmeden, düz metin olarak ekrana basar.
Kodunuzun üretim ortamında (production) sorunsuz çalışması için requestAnimationFrame API'sini kullanmak, tarayıcı yenileme hızına (refresh rate) göre daha akıcı bir performans sağlar.
// requestAnimationFrame ile daha akıcı bir yaklaşım
let sonZaman = 0;
function akiciYaz(zaman) {
if (zaman - sonZaman > 100) {
// Yazdırma mantığı buraya
sonZaman = zaman;
}
requestAnimationFrame(akiciYaz);
}
Sıkça Sorulan Sorular
Yazı yazma efekti SEO'yu etkiler mi?
Arama motorları, JavaScript ile oluşturulan içerikleri artık başarılı bir şekilde tarayabilmektedir. Ancak, anahtar kelimelerinizin sayfa yüklendiğinde doğrudan HTML içinde (statik olarak) bulunması, SEO açısından her zaman daha güvenlidir.
Bu efekti mobil cihazlarda nasıl optimize ederim?
Mobil cihazlarda işlemci gücü daha sınırlı olabilir. setTimeout sürelerini çok kısa tutmamak ve çok fazla DOM manipülasyonu yapmamak, pil ömrü ve performans için kritiktir.
Aynı sayfada birden fazla yazı yazma efekti kullanabilir miyim?
Evet, fonksiyonlarınızı bir sınıf (class) yapısı içerisine alarak birden fazla elemente aynı anda farklı efektler uygulayabilirsiniz.
Yazı yazma hızı değişken olabilir mi?
Evet, setTimeout süresini rastgele sayılar üreterek (örneğin 50ms ile 200ms arasında) değiştirirseniz, daktilo efektinin daha doğal ve insan eliyle yazılmış gibi görünmesini sağlayabilirsiniz.
Kütüphane kullanmak daha mı mantıklı?
Eğer çok karmaşık (farklı yazı tipleri, çoklu imleçler, gelişmiş duraklamalar) bir yapı kuracaksanız Type.js gibi kütüphaneler zaman kazandırabilir. Ancak basit bir efekt için kütüphane eklemek, projenizin boyutunu gereksiz yere artıracaktır.
İleri Seviye Özelleştirme: CSS Animasyonları ile İmleç Senkronizasyonu
Yazı yazma efektini bir üst seviyeye taşımak için JavaScript ile CSS'in uyum içinde çalışmasını sağlamalıyız. Özellikle metin yazılırken yanıp sönen bir imleç (caret) efekti, kullanıcı deneyimini profesyonel bir seviyeye çeker. JavaScript sadece metni manipüle ederken, imlecin yanıp sönme hızını CSS animation özellikleri ile yönetmek tarayıcı performansını doğrudan olumlu etkiler.
Aşağıdaki CSS örneği, imlecin metinle birlikte nasıl hareket edeceğini ve duraklamalarda nasıl yanıp söneceğini göstermektedir:
.typing-cursor {
display: inline-block;
width: 3px;
background-color: #333;
animation: blink 1s step-end infinite;
}
@keyframes blink {
from, to { opacity: 1; }
50% { opacity: 0; }
}
Hata Ayıklama ve Edge Case Yönetimi
Yazı yazma efektlerinde karşılaşılan en yaygın sorun, kullanıcının sayfayı hızlıca kaydırdığında veya tarayıcı sekmesini değiştirdiğinde oluşan zamanlama kaymalarıdır. setTimeout veya setInterval kullanırken, tarayıcının arka plan sekmelerinde bu zamanlayıcıları yavaşlatabileceğini unutmamalısınız.
Bu sorunu aşmak için requestAnimationFrame kullanmak daha kararlı sonuçlar verir. İşte zamanlama hatalarını minimize eden bir yapı örneği:
let lastTime = 0;
const speed = 100;
function typeEffect(timestamp) {
if (timestamp - lastTime >= speed) {
// Metin yazma mantığı buraya gelecek
lastTime = timestamp;
}
requestAnimationFrame(typeEffect);
}
requestAnimationFrame(typeEffect);
Yaygın Hatalar ve Çözümleri
- DOM Titremesi (Layout Shift): Metin değiştiğinde kapsayıcı elemanın yüksekliğinin değişmesi, sayfanın "sıçramasına" neden olur. Bunu önlemek için kapsayıcıya sabit bir
min-heightdeğeri atayın. - Hızlı Tetikleme: Kullanıcı sayfayı yüklemeden etkileşime girerse, fonksiyonun çakışmasını önlemek için
isTypinggibi bir "flag" (bayrak) değişkeni kullanın. - Bellek Sızıntısı: Eğer efekt bir bileşen içinde çalışıyorsa, bileşen yok edildiğinde (unmount) mutlaka
clearTimeoutveyacancelAnimationFramekullanarak temizlik yapın.
Proje Deployment Öncesi Test Kontrol Listesi
Kodunuzu canlı ortama almadan önce aşağıdaki teknik kontrol listesini gözden geçirmeniz, uygulamanızın farklı cihazlarda sorunsuz çalışmasını sağlar:
| Test Kalemi | Beklenen Sonuç |
|---|---|
| Erişilebilirlik (A11y) | Ekran okuyucular metni doğru okuyor mu? (aria-live etiketi kullanımı) |
| Duyarlılık (Responsive) | Metin satır sonuna geldiğinde taşma yapıyor mu? (word-wrap kontrolü) |
| Performans | Lighthouse skorunda "Layout Shift" uyarısı alınıyor mu? |
Son olarak, metinlerinizi doğrudan JavaScript dosyasının içine gömmek yerine, bir JSON dosyasından veya data-attribute üzerinden çekmek, içeriği güncellemek istediğinizde kodunuzu değiştirmeden değişiklik yapmanıza olanak tanır. Bu yaklaşım, projenizin sürdürülebilirliğini artıracaktır.
Sonuç
JavaScript ile tarayıcı tabanlı bir sayfa içi yazı yazma efekti yapmak, hem kodlama becerilerinizi geliştiren hem de kullanıcı etkileşimini artıran harika bir uygulamadır. Bu rehberde, temel DOM manipülasyonundan başlayarak, metin silme ve dinamik döngü kurma aşamalarına kadar süreci adım adım inceledik. Bir sonraki adım olarak, bu efektin içine CSS geçişleri (transitions) ekleyerek imleç hareketlerini yumuşatabilir veya metinlerin renklerini her döngüde değiştiren bir özellik ekleyebilirsiniz.
Unutmayın, en iyi kod, okunabilir ve yönetilebilir olandır. Yazdığınız bu fonksiyonu bir modül haline getirerek farklı projelerinizde tekrar kullanılabilir bir araç haline getirebilirsiniz.
Yasal Uyarı: Bu içerik eğitim amaçlı hazırlanmıştır. Yazılım geliştirme süreçlerinde güvenlik standartlarına uymak geliştiricinin sorumluluğundadır.


Yorumlar (0)
Yorum Yaz