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 Modern CSS: `:has()` Seçicisi ile Devrim Yaratın 🎯

codrix

Üye
Katılım
14 Mart 2026
Mesajlar
9
Web Geliştirmede Modern CSS: `:has()` Seçicisi ile Devrim Yaratın 🎯

Selam dostlar! Uzun zamandır forumda takılıyorum ve bugün sizlere CSS dünyasının son birkaç yıldır en çok konuşulan, adeta bir "game-changer" olan bir özelliğinden bahsetmek istiyorum: `:has()` seçicisi. Eğer "Ebeveyn seçici" diye bir şey duyup da "CSS'te böyle bir şey yok ki?" diye hayıflandıysanız, artık var! 🚀

Geleneksel CSS'te her zaman çocukları veya kardeşleri seçtik. Ancak bir ebeveyne, içindeki bir öğeye göre stil vermek imkansızdı. İşte `:has()` tam olarak bu sorunu çözüyor. JavaScript'e başvurmadan, saf CSS ile inanılmaz mantıksal kontroller yapmamızı sağlıyor.

:has() Nedir ve Nasıl Çalışır?

Basitçe söylemek gerekirse, `:has()` bir elementi, belirttiğiniz koşulu sağlayan bir başka elementi içeriyorsa seçmenizi sağlar. Fonksiyonel bir pseudo-class'tır.

Örneğin:
Kod:
/* İçinde resim (img) olan linklere (a) kenarlık ekle */
a:has(img) {
    border: 2px solid blue;
}

/* İçinde .alert sınıfı olan bir div'in kendisini seç ve arkaplanını değiştir */
div:has(.alert) {
    background-color: #fff3cd;
}

Gördüğünüz gibi, artık bir elementi, içeriğine göre şekillendirebiliyoruz. Bu, özellikle dinamik içeriklerle çalışırken veya CMS'lerden gelen verileri stilize ederken inanılmaz bir güç katıyor.

Pratik Kullanım Alanları ve Harika Örnekler

Hadi biraz kod yazalım ve bu sihirli seçicinin gücünü görelim. 💻

  • Form Validasyon Görsel Geri Bildirimi: Geçersiz bir input içeren bir form alanının (div) etrafını kırmızı yapmak ister misiniz? JavaScript yok!
Kod:
.form-group:has(input:invalid) {
    border-left: 4px solid #dc3545;
    padding-left: 1rem;
}
/* Sadece focus olmuş ve invalid olan input'un olduğu .form-group'u seç */
.form-group:has(input:invalid:focus) {
    background-color: #ffe6e6;
}

  • İçerik Varlığına Göre Düzen: Bir kart bileşeniniz var. İçinde buton yoksa kartın alt boşluğunu (padding-bottom) azaltmak isteyebilirsiniz.
Kod:
.card {
    padding: 2rem;
    padding-bottom: 3rem; /* Buton için ekstra alan */
}
.card:not(:has(.btn)) {
    padding-bottom: 2rem; /* Buton yoksa normal padding */
}
Burada `:not(:has(...))` kombinasyonuna dikkat! "İçinde .btn olmayan .card"ı seçiyoruz. Ne kadar zarif değil mi?

  • Navigasyonu Aktif Öğeye Göre Vurgulama: Bir dropdown menüde, alt öğelerinden biri aktif (`.active`) olan ana menü öğesini vurgulayalım.
Kod:
nav li:has(> ul li.active) > a {
    font-weight: bold;
    color: #2ecc71;
}

Tarayıcı Desteği ve Geriye Dönük Çözümler

Burada durup gerçekçi olmamız lazım. `:has()` seçicisi güçlü ama nispeten yeni. Temmuz 2024 itibariyle Firefox hariç tüm modern tarayıcılar (Chrome, Edge, Safari) destekliyor. Firefox'ta da deneysel olarak aktif edilebiliyor ve yakında tam destek gelecek.

Peki ya eski tarayıcılar? İşte burada "İlerici Geliştirme" (Progressive Enhancement) prensibi devreye giriyor. `:has()` olmadan da çalışan temel stilleri yazıyor, `:has()` ile gelen gelişmiş, daha akıllı stilleri ise bir feature query (`@supports`) içine alıyoruz.
Kod:
.card {
    padding: 2rem; /* Herkes için temel stil */
}

@supports selector(:has(.btn)) {
    /* Sadece :has() destekleyen tarayıcılar bu kodu uygulayacak */
    .card:has(.btn) {
        padding-bottom: 3rem;
    }
}

Dikkat Edilmesi Gerekenler ve Performans

Bu kadar güç, sorumluluk da getirir. ⚙️
  • Karmaşıklık: Çok derin ve karmaşık `:has()` seçicileri yazmak kodun okunabilirliğini bozabilir. Basit tutmaya çalışın.
  • Performans: Tarayıcılar `:has()` için oldukça optimize olsa da, sayfanızda binlerce element üzerinde çalışan çok karmaşık bir `:has()` kuralı, render performansını etkileyebilir. Her şeyde olduğu gibi ölçülü kullanın.
  • Spesifiklik (Specificity): `:has()` seçicisi, içinde belirtilen seçicinin spesifikliğini almaz. Kendi spesifikliği normal bir pseudo-class (0,1,0) gibidir. Bu, stil çakışmalarında beklediğiniz gibi davranmayabileceği anlamına gelir, dikkatli olun.

**Sonuç Olarak**
`:has()` seçicisi, CSS'e programlama dilindeki "if" koşulunun kapılarını aralıyor. Daha temiz, daha mantıklı, JavaScript'e daha az bağımlı stil sayfaları yazmamızı sağlıyor. Henüz tam desteklenmese de, geleceğin CSS'inin bir parçası olduğu kesin.

Projelerinizde denemeye başlayın, @supports ile güvenle kullanın ve stil dünyanızda yepyeni bir boyut keşfedin. Sorularınız olursa yorumlarda bekliyorum, birlikte tartışalım! 👨‍💻

Umarım bu rehber faydalı olmuştur. Bir sonraki yazıda görüşmek üzere, kodunuz bol, hatalarınız az olsun!
 

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