Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Web Geliştirmede `contenteditable` ile Tarayıcıda Canlı Düzenleme Sanatı 🪄

devnix

Üye
Katılım
14 Mart 2026
Mesajlar
13
Web Geliştirmede `contenteditable` ile Tarayıcıda Canlı Düzenleme Sanatı 🪄

Selam dostlar! 👋 Uzun zamandır forumda takılıyorum ve bugün sizlerle, belki de HTML'in en az hakkı verilen, ama bir o kadar da güçlü özelliklerinden birini konuşmak istiyorum: `contenteditable`. Hepimiz zengin metin editörleri (Rich Text Editors - RTE) kullanıyoruz. Peki hiç "Acaba bunun basit bir versiyonunu kendim nasıl yapabilirim?" diye düşündünüz mü? İşte tam burada `contenteditable` devreye giriyor. Gelin, bu sihirli özelliği birlikte keşfedelim ve pratik projelerde nasıl kullanabileceğimize bakalım. ⚙️

`contenteditable` Nedir? Basitçe Anlatalım
`contenteditable`, bir HTML elementine eklediğiniz global bir niteliktir (attribute). Bu niteliği `true` olarak ayarladığınızda, kullanıcı o elementin içeriğini (metin, resim, vs.) sanki bir kelime işlemci programındaymış gibi doğrudan tarayıcıda düzenleyebilir hale gelir. Tek satırlık bir kodla tarayıcınızı basit bir not defterine çevirebilirsiniz!

Kod:
<div contenteditable="true">
  Buraya tıklayıp istediğin gibi düzenleme yapabilirsin! Hemen dene.
</div>

Neden Kullanmalıyız? Avantajları
  • Hızlı Prototipleme: Bir admin panelinde hızlıca içerik düzenlemek mi istiyorsunuz? `contenteditable` ile anında çalışan bir düzenleme arayüzü oluşturabilirsiniz.
  • Kullanıcı Deneyimi (UX): Kullanıcıyı bir forma yönlendirmeden, içeriğin olduğu yerde düzenleme imkanı sunar. Bu, akışı kesmeyen, daha doğal bir his verir.
  • Basitlik: Tam teşekküllü bir RTE kütüphanesi (CKEditor, TinyMCE vb.) kurmak ve yapılandırmak karmaşık olabilir. Basit ihtiyaçlar için bu, mükemmel bir hafif alternatiftir.
  • Esneklik: Sadece `div` veya `p` değil, neredeyse tüm elementlerde kullanabilirsiniz (tablo hücreleri, listeler vb.).

Pratik Kullanım: Basit Bir "Yapılacaklar Listesi" Yapalım
En iyi öğrenme yolu uygulamaktır. Hadi, kullanıcının maddeleri hem silebileceği hem de üzerine tıklayarak yeniden adlandırabileceği basit bir liste yapalım.

Kod:
<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: sans-serif; max-width: 600px; margin: 2rem auto; }
        .todo-list { list-style: none; padding: 0; }
        .todo-item {
            padding: 10px;
            margin-bottom: 8px;
            background: #f1f1f1;
            border-radius: 5px;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .todo-item[contenteditable="true"] {
            background: #fffde7;
            outline: 2px solid #ffd54f;
        }
        .delete-btn {
            background: #ff6b6b;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 3px;
            cursor: pointer;
            margin-left: 10px;
        }
    </style>
</head>
<body>
    <h2>Yapılacaklar Listem 📝</h2>
    <ul class="todo-list">
        <li class="todo-item" contenteditable="true">Kahvaltı yap</li>
        <li class="todo-item" contenteditable="true">Kodu gözden geçir</li>
        <li class="todo-item" contenteditable="true">Alışverişe çık</li>
    </ul>
    <button id="addBtn">Yeni Madde Ekle ➕</button>

    <script>
        const list = document.querySelector('.todo-list');
        const addBtn = document.getElementById('addBtn');

        // Yeni madde ekleme
        addBtn.addEventListener('click', () => {
            const newItem = document.createElement('li');
            newItem.className = 'todo-item';
            newItem.setAttribute('contenteditable', 'true');
            newItem.textContent = 'Yeni görev (buraya tıkla ve düzenle)';

            const deleteBtn = document.createElement('button');
            deleteBtn.className = 'delete-btn';
            deleteBtn.textContent = 'Sil';

            deleteBtn.addEventListener('click', (e) => {
                e.stopPropagation(); // Tıklamanın başka yerlere sıçramasını engelle
                list.removeChild(newItem);
            });

            newItem.appendChild(deleteBtn);
            list.appendChild(newItem);
            newItem.focus(); // Yeni eklenen maddeye odaklan
        });

        // Varolan maddelere sil butonu ekle (sayfa yüklendiğinde)
        document.querySelectorAll('.todo-item').forEach(item => {
            const deleteBtn = document.createElement('button');
            deleteBtn.className = 'delete-btn';
            deleteBtn.textContent = 'Sil';
            deleteBtn.addEventListener('click', (e) => {
                e.stopPropagation();
                item.remove();
            });
            item.appendChild(deleteBtn);
        });
    </script>
</body>
</html>

Bu kodda neler yaptık? 🧠
  • Her `li` elementine `contenteditable="true"` ekleyerek tıklanınca düzenlenebilir yaptık.
  • Düzenleme modundayken (`contenteditable="true`) arkaplan rengini değiştirerek kullanıcıya görsel geri bildirim verdik.
  • Her maddeye bir "Sil" butonu ekledik ve tıklanınca o maddeyi listeden kaldırdık.
  • "Yeni Madde Ekle" butonu ile dinamik olarak yeni düzenlenebilir maddeler ekleyebiliyoruz.

Dikkat Edilmesi Gerekenler ve Sınırlamalar
Her güçlü özellik gibi, bunun da dikkatli kullanılması gereken yanları var:
  • HTML Çıktısı Karışabilir: Kullanıcı metni kalın yapabilir, satır atlayabilir. Bu, `innerHTML`'yi doğrudan sunucuya gönderirken beklenmedik HTML tag'leri ile karşılaşmanıza neden olabilir. Çözüm için `.textContent` veya `.innerText` kullanabilir veya temizleme kütüphaneleri (DOMPurify) düşünebilirsiniz.
  • Tarayıcı Uyumsuzluğu: Temel özellikler her yerde çalışsa da, özellikle zengin metin komutları (`document.execCommand` - artık kullanım dışı) konusunda tarayıcılar arası farklar olabilir.
  • Erişilebilirlik (Accessibility): Düzenlenebilir bir alan olduğunu ekran okuyuculara doğru şekilde bildirmek için `role="textbox"` ve `aria-multiline="true"` gibi ARIA nitelikleri eklemeyi unutmayın.
  • State Yönetimi: Kullanıcı neyi değiştirdi? Değişiklikleri ne zaman kaydetmeli? Bu durumları yönetmek için JavaScript ile olay dinleyicileri (`input`, `blur`) kullanmanız gerekebilir.

Ne Zaman Kullanmayayım?
  • Karmaşık biçimlendirme (resim ekleme, tablo oluşturma, çoklu font ve renk seçenekleri) gerektiren tam teşekküllü bir blog editörü yapıyorsanız, bir RTE kütüphanesi kullanmak daha mantıklıdır.
  • Güvenlik odaklı, kullanıcı girdisinin tamamen kontrol edilmesi gereken durumlarda (yorum sistemi gibi) saf bir `textarea` daha güvenli bir başlangıç noktası olabilir.

**Sonuç Olarak:** 🚀
`contenteditable`, web geliştiricinin alet çantasındaki hızlı, pratik ve şaşırtıcı derecede güçlü bir alettir. Onu tanımak ve doğru yerlerde kullanmak, kullanıcı deneyimini artıran, prototipleri hızlandıran akıllı çözümler üretmenizi sağlar. Bir sonraki projenizde, kullanıcıya "burada bir şeyleri düzenleyebilirsin" hissini vermek istediğinizde, ilk aklınıza `contenteditable` gelsin!

Umarım bu rehber faydalı olmuştur. Denemeler yapın, kodları kurcalayın ve kendi harika düzenlenebilir bileşenlerinizi oluşturun. Sorularınız olursa yorumlarda bekliyorum! Kodla kalın. 💻
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri