Hangi Kural Kazanır?
Bu dersin sonunda aynı elemana birden çok kural uygulandığında hangisinin kazanacağını hesaplayabilecek ve “CSS’im neden çalışmıyor?” sorusunu kendiniz çözebileceksiniz.
Sorun
Aşağıdaki paragrafa üç kural aynı anda uygulanıyor ve üçü de farklı bir renk istiyor. Tarayıcı bir tanesini seçmek zorunda.
<p id="ozel" class="not">Ben hangi renkteyim?</p>#ozel {
color: blue;
}
.not {
color: green;
}
p {
color: red;
}p kuralı en sonda yazılmış olmasına rağmen yazı mavi. CSS’in adındaki cascade (basamaklı akış), bu kararı veren kurallar dizisidir.
Tarayıcı sırayla şu soruları sorar ve bir kazanan çıktığı anda durur:
- Önem: Birinde
!importantvar mı? - Özgüllük: Hangi seçici daha özgül?
- Sıra: Hangisi daha sonra yazılmış?
Özgüllük
Özgüllük bir seçicinin ne kadar belirgin olduğunu ölçer. Üç sütunlu bir puan gibi düşünün:
| Sütun | Ne sayılır? | Örnek |
|---|---|---|
id | id seçicileri | #menu |
| Sınıf | Sınıflar, nitelik seçicileri, durum seçicileri | .kart, [type="text"], :hover |
| Etiket | Etiketler ve sözde elemanlar | p, ::before |
Boşluk, >, +, ~, , ve * puan getirmez.
| Seçici | Puan |
|---|---|
p | 0, 0, 1 |
nav a | 0, 0, 2 |
.kart | 0, 1, 0 |
a:hover | 0, 1, 1 |
.menu .link | 0, 2, 0 |
#ust | 1, 0, 0 |
#ust .link | 1, 1, 0 |
Puanlar soldan sağa, sütun sütun karşılaştırılır. Soldaki sütunda farklılık varsa diğerlerine bakılmaz. Bu yüzden on bir sınıf bile tek bir id seçicisini yenemez.
<div class="kart">
<a class="link" href="#">Bu bağlantı ne renk?</a>
</div>.kart .link {
color: crimson;
}
a.link {
color: teal;
}
a {
color: gold;
}.kart .link puanı 0, 2, 0 olduğu için 0, 1, 1 puanlı a.link kuralını yener.
Eşitlikte sıra
Özgüllükler eşitse sonra yazılan kazanır. Stil dosyasındaki düzen bu yüzden önemlidir.
<p class="a b">İki sınıf, aynı puan</p>.a {
color: teal;
}
.b {
color: crimson;
}HTML’deki sınıfların sırası önemli değildir. class="b a" yazsanız da sonuç değişmez. Önemli olan CSS dosyasındaki sıradır.
style niteliği ve !important
style niteliği bütün seçicilerin önüne geçer. HTML bölümünde bu yüzden her zaman çalışıyordu.
Bir bildirimin sonuna !important yazarsanız o bildirim normal bildirimlerin hepsini, hatta style niteliğini de yener.
<p style="color: blue;">Satır içi mavi ama yeşil görünüyor</p>p {
color: green !important;
}!important kolay bir çözüm gibi görünür ama bir kez kullanıldığında onu yenmek için yine !important gerekir ve dosya hızla yönetilemez hâle gelir. Önce seçicilerinizi düzeltin. Kendi sitenizde neredeyse hiç ihtiyacınız olmaz.
Kalıtım her zaman kaybeder
Kalıtımla gelen bir değerin özgüllüğü yoktur. Elemanı doğrudan hedefleyen en zayıf kural bile kalıtımı yener.
<div id="kutu">
<p>Bu paragraf neden yeşil?</p>
</div>#kutu {
color: crimson;
}
p {
color: green;
}#kutu çok güçlü bir seçici ama paragrafı değil, kutuyu hedefliyor. Paragraf rengi yalnızca miras alır. p kuralı ise paragrafı doğrudan hedeflediği için kazanır.
Kalıtımı kendiniz yönetmek için üç özel değer vardır:
inheritDeğeri dıştaki elemandan al.initialCSS’in başlangıç değerine dön.unsetKalıtılan bir özellikse miras al, değilse başlangıç değerine dön.
Geliştirici araçlarıyla bulmak
Bir kural çalışmıyorsa elemana sağ tıklayıp İncele seçeneğini seçin. Styles bölümü kuralları kazanma sırasına göre listeler.
- Üzeri çizili bildirim, başka bir kurala kaybetmiştir.
- Yanında sarı üçgen olan bildirim geçersizdir.
- Kuralınız listede hiç yoksa seçiciniz o elemana uymuyordur.
Bu üç ihtimal, CSS sorunlarının çok büyük bölümünü açıklar.
İyi bir stil dosyasında seçicilerin çoğu tek bir sınıftır. id seçicileri ve uzun zincirler yazdıkça, sonradan yazacağınız kuralların kazanması zorlaşır.
Her sorunu !important ile çözmek. Asıl nedeni gizler. Önce Styles bölümüne bakın.
Sonda yazılanın her zaman kazandığını sanmak. Sıra yalnızca özgüllükler eşitse önemlidir.
Dıştaki elemana verilen rengin içeriyi zorla değiştireceğini sanmak. Kalıtım, doğrudan yazılmış her kurala kaybeder.
HTML’deki sınıf sırasını değiştirmeye çalışmak. Sonucu CSS’teki sıra belirler.
#ust a ile .menu .liste a aynı bağlantıyı hedefliyor. Hangisi kazanır?
-
#ust a:: Doğru. Puanı 1, 0, 1 olduğu için 0, 2, 1 puanlı seçiciyi yener. -
.menu .liste a:: Sınıf sayısıidsütununu geçemez. - Sonra yazılan :: Sıra yalnızca özgüllükler eşitse önemlidir.
.a { color: red; } kuralından sonra .b { color: blue; } yazılmış. Eleman class="b a" ise yazı ne renk olur?
- Kırmızı :: HTML’deki sınıf sırası sonucu etkilemez.
- Mavi :: Doğru. Özgüllükler eşit, CSS’te sonra yazılan kazanır.
- Mor :: Değerler karışmaz, bir tanesi kazanır.
Styles bölümünde bir bildiriminiz üzeri çizili görünüyor. Bu ne anlama gelir?
- Başka bir kurala kaybetmiştir :: Doğru.
- Dosya bulunamamıştır :: Dosya bulunamasaydı kural hiç görünmezdi.
- Silinecektir :: Yalnızca o eleman için kazanamadığını gösterir.
Hedefteki kodu yazın. Önce .uyari için color değeri crimson, sonra .onemli için color değeri navy olsun. Altına iki sınıfa da sahip, Dikkat yazan bir paragraf ekleyin. class değerini uyari onemli olarak yazın.
<style>
.uyari {
color: crimson;
}
.onemli {
color: navy;
}
</style>
<p class="uyari onemli">Dikkat</p>Hedefteki kodu yazın. .kutu için color değeri crimson olsun. .kutu p için color değeri teal olsun. Altına kutu sınıfına sahip bir div yazın. İçinde Merhaba yazan bir paragraf olsun.
<style>
.kutu {
color: crimson;
}
.kutu p {
color: teal;
}
</style>
<div class="kutu">
<p>Merhaba</p>
</div>Bu derste öğrendikleriniz
- Tarayıcı önce önemi, sonra özgüllüğü, sonra sırayı karşılaştırır.
- Özgüllük
id, sınıf ve etiket sütunlarıyla soldan sağa karşılaştırılır. !importantson çaredir, kalıtım ise doğrudan yazılan her kurala kaybeder.- Geliştirici araçlarının Styles bölümü hangi kuralın neden kazandığını gösterir.
Dersi bitirdin mi?Bu dersi tamamladın.
İlerlemen bu tarayıcıda saklanır.