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.

Tailwind ile responsive navbar yaparken hamburger menü toggle state'ini sadece CSS ile nasıl yönettiğim

asternix

Üye
Katılım
14 Mart 2026
Mesajlar
35
Merhaba arkadaşlar, bugün başımı çok ağrıtan bir sorunu ve onun en temiz çözümünü anlatacağım. Responsive bir navbar yaparken, hamburger menüyü açıp kapamak için genelde hemen JavaScript'e sarılıyoruz değil mi? "Bu butona tıklandığında şu class'ı toggle'la" falan... Ama ben, özellikle basit projelerde veya JS yükünü minimumda tutmak istediğimde, bu işi sadece CSS ile halletmenin ne kadar zarif olabileceğini fark ettim. İşte size anlatacağım yöntem de tam olarak bu: checkbox hack ve Tailwind'in gücünü birleştirmek.

🔥 Neden JavaScript Kullanmak İstemeyebilirsiniz?

Bazen proje küçüktür, bazen sadece menüyü açıp kapatacak kadar basit bir etkileşim için bile bir framework (React, Vue) veya vanilla JS yazmak fazla gelebilir. Hem sayfa hızı hem de bakım kolaylığı açısından, eğer yapabiliyorsanız, bu tarz UI state'lerini CSS'te tutmak bence çok şık. Tabii kompleks durumlar için JS şart, ama basit toggle işlemleri için CSS yetiyor da artıyor.

🎯 Çözümün Anahtarı: Gizli Checkbox

Mantık şu: Ekranda gözükmeyen bir checkbox input'u oluşturacağız. Hamburger ikonumuz da bu checkbox'a bağlı bir label olacak. Checkbox'ın :checked durumunu CSS'te yakalayıp, ona bağlı menümüzü görünür veya gizli yapacağız. Tailwind'in peer ve peer-checked modifier'ları burada devreye giriyor ve işi çok basitleştiriyor.

⚙️ Koda Dalalım: HTML ve Tailwind Yapısı

İşte benim kullandığım en temiz çözüm. Önce HTML yapısını kuralım. Dikkat edin, input ve onun label'ı kardeş (sibling) elementler olmalı.

HTML:
<nav class="bg-gray-800 p-4">
  <!-- Gizli Checkbox -->
  <input type="checkbox" id="menu-toggle" class="hidden peer" />

  <!-- Hamburger Label (Buton) -->
  <label for="menu-toggle" class="md:hidden block text-white cursor-pointer">
    <!-- Hamburger İkonu -->
    <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
      <path id="menu-open-icon" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
      <path id="menu-close-icon" class="hidden" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
    </svg>
  </label>

  <!-- Ana Menü (Mobile'de gizli, desktop'ta görünür) -->
  <div class="hidden peer-checked:flex flex-col md:flex md:flex-row md:space-x-4 absolute md:static top-full left-0 w-full md:w-auto bg-gray-800 md:bg-transparent p-4 md:p-0">
    <a href="#" class="text-white hover:bg-gray-700 p-2 rounded">Anasayfa</a>
    <a href="#" class="text-white hover:bg-gray-700 p-2 rounded">Hakkımızda</a>
    <a href="#" class="text-white hover:bg-gray-700 p-2 rounded">İletişim</a>
  </div>
</nav>

🎨 Sihir Nasıl İşliyor? Adım Adım Açıklama

1. input#menu-toggle: Bu bizim gizli state'imiz. `hidden` class'ı ile görünmez yaptık. Asıl önemli olan peer class'ı. Bu, kardeş elementlerin bu input'un durumuna göre stil almasını sağlayacak.

2. label: `for="menu-toggle"` attribute'ü ile input'a bağlı. Kullanıcı hamburger ikonuna tıkladığında, aslında bu label'a tıklıyor ve bu da gizli checkbox'ı işaretli/iptal ediyor. `md:hidden` diyerek desktop'ta hamburger butonunu gizliyoruz.

3. Menü Div'i: Burası en kritik nokta. Normalde mobilde `hidden` (gizli). Ancak, `peer-checked:flex` sayesinde, kardeşi olan checkbox `:checked` durumuna geçtiğinde `display: flex` olarak görünür hale geliyor. Desktop için olan stiller de `md:` prefix'leri ile ayrıca tanımlanıyor.

4. İkon Değişimi (Bonus!): SVG içinde iki farklı ikon path'i var. Biri çizgi (açık menü), diğeri çarpı (kapalı menü). CSS ile onları da yönetebiliriz. Checkbox'a bağlı label'ın içindeki SVG child'larını hedefleyebilirsiniz. Bu örnekte basit bir `hidden` class toggle'ı ile yapıldı, daha detaylı kontrol için de `peer-checked:` modifier'ı kullanılabilir.

Bu yöntemle, navbar'ınızın açık/kapalı state'i tamamen CSS'te yönetiliyor. Sayfa yenilendiğinde veya JS yüklenmeden bile çalışıyor. Hem hafif hem de kullanışlı.

Peki siz daha önce bu yöntemi denediniz mi? Ya da responsive menülerinizde state yönetimi için farklı, hafif CSS çözümleriniz var mı? Benzer bir sorunu Vue veya React'ta farklı nasıl çözersiniz? Yorumlarda fikir alışverişi yapalım!
 

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