0 gün Seviye 1 Avar Teknolojileri

Yapısal Seçiciler

Ders 6/14 · 9 dakika · 3 soru · 2 egzersiz

Bu dersin sonunda elemanları sırasına göre seçebilecek, bir koşulu dışarıda bırakabilecek ve içeriğine göre üst elemana stil verebileceksiniz.

Sıraya göre seçmek

Bir listenin ilk maddesini veya tablonun her ikinci satırını seçmek için her elemana sınıf yazmanız gerekmez. Yapısal seçiciler bunu kardeşler arasındaki sıraya bakarak yapar.

  • :first-child Üst elemanın ilk çocuğu.
  • :last-child Üst elemanın son çocuğu.
  • :only-child Üst elemanın tek çocuğu.
  • :nth-child(3) Üçüncü çocuk.
  • :nth-last-child(2) Sondan ikinci çocuk.
<ul>
  <li>Bir</li>
  <li>İki</li>
  <li>Üç</li>
  <li>Dört</li>
</ul>
li:first-child {
  color: teal;
}

li:last-child {
  color: crimson;
}

li:nth-child(2) {
  font-weight: bold;
}

:nth-child formülleri

Parantezin içine bir sayıdan fazlası yazılabilir:

YazımSeçilenler
oddTek sıradakiler: 1, 3, 5…
evenÇift sıradakiler: 2, 4, 6…
3nHer üçüncü: 3, 6, 9…
3n+11, 4, 7, 10…
n+3Üçüncüden itibaren hepsi
-n+3İlk üç

n sırasıyla 0, 1, 2… değerlerini alır ve 1’den küçük sonuçlar yok sayılır. 3n+1 için 1, 4, 7 çıkar.

En yaygın kullanımı satırları sırayla renklendirmektir. Değerleri değiştirip deneyin:

<table>
  <tr><td>Ali</td><td>90</td></tr>
  <tr><td>Ayşe</td><td>85</td></tr>
  <tr><td>Can</td><td>70</td></tr>
  <tr><td>Deniz</td><td>95</td></tr>
  <tr><td>Ece</td><td>80</td></tr>
</table>
table {
  border-collapse: collapse;
  width: 100%;
}

td {
  padding: 8px;
}

tr:nth-child(even) {
  background-color: whitesmoke;
}

Tuzak: :first-child ve :first-of-type

p:first-child “ilk paragraf” demek değildir. “Üst elemanının ilk çocuğu olan paragraf” demektir. İlk çocuk bir başlıksa hiçbir paragraf seçilmez.

Türe göre saymak için -of-type kullanılır:

  • :first-of-type Türünün ilki.
  • :last-of-type Türünün sonuncusu.
  • :nth-of-type(2) Türünün ikincisi.
<article>
  <h2>Başlık</h2>
  <p>İlk paragraf</p>
  <p>İkinci paragraf</p>
</article>
/* Bu kural çalışmaz, ilk çocuk h2 etiketidir */
p:first-child {
  color: crimson;
}

/* Bu kural ilk paragrafı bulur */
p:first-of-type {
  font-weight: bold;
}

:not: Hariç tutmak

:not() parantezin içindeki koşula uymayan elemanları seçer. Listelerde son madde hariç çizgi çekmek klasik bir kullanımıdır.

<ul class="liste">
  <li>Bir</li>
  <li>İki</li>
  <li>Üç</li>
</ul>
.liste {
  list-style-type: none;
  padding: 0;
}

.liste li {
  padding: 8px 0;
}

.liste li:not(:last-child) {
  border-bottom: 1px solid lightgray;
}

Özgüllük hesabında :not kendisi puan getirmez ama parantezinin içindeki seçicinin puanı sayılır.

:is ve :where: Kısaltmak

İkisi de parantezin içindeki herhangi bir seçiciye uyan elemanları seçer ve uzun listeleri kısaltır:

/* Uzun yazım */
article h1, article h2, article h3 {
  color: teal;
}

/* Aynı anlam */
article :is(h1, h2, h3) {
  color: teal;
}

Aralarındaki fark özgüllüktür. :is en güçlü içeriği kadar puan alır. :where ise hiç puan almaz, bu yüzden üzerine yazması en kolay seçimdir.

:has: İçeriğe göre seçmek

CSS’te uzun yıllar yalnızca aşağı doğru seçim yapılabiliyordu. :has() bunu değiştirdi: Bir elemanı içindekilere göre seçer. Modern tarayıcıların tamamı destekler.

<article class="kart">
  <h2>Resimli kart</h2>
  <img src="baldiyetapanadam.png" alt="Örnek resim" width="80">
</article>

<article class="kart">
  <h2>Resimsiz kart</h2>
</article>

<label class="secim">
  <input type="checkbox">
  Beni işaretleyin
</label>
.kart {
  padding: 12px;
  margin-bottom: 8px;
  border: 1px solid lightgray;
}

.kart:has(img) {
  background-color: lightyellow;
}

.secim:has(input:checked) {
  background-color: lightgreen;
}

Diğer yararlı seçiciler

  • :empty Hiç içeriği olmayan eleman.
  • :root Belgenin kökü, yani html elemanı. Değişkenler dersinde kullanacaksınız.
Sık yapılan hatalar

p:first-child ile ilk paragrafı seçtiğini sanmak. İlk çocuk başka bir elemansa çalışmaz. p:first-of-type kullanın.

:nth-child saymaya 0’dan başlamak. CSS’te sayım 1’den başlar.

:not içine virgülsüz birden çok seçici yazmak. Birden çok koşul için virgül kullanın: :not(.a, .b)

Stil için fazla uzun sıra zincirleri yazmak. HTML’e bir madde eklendiğinde bozulur. Gerekirse sınıf kullanın.

Soru 1

Tablodaki her ikinci satırı hangi seçici seçer?

  • tr:nth-child(even) :: Doğru.
  • tr:nth-child(1) :: Bu yalnızca ilk satırı seçer.
  • tr:even :: even tek başına seçici değildir.
Soru 2

Bir h2 ve ardından iki paragraf içeren bir article var. p:first-child kaç eleman seçer?

  • Hiçbirini :: Doğru. İlk çocuk h2 etiketidir.
  • İlk paragrafı :: İlk paragraf üst elemanın ilk çocuğu değildir.
  • İki paragrafı da :: Paragrafların hiçbiri ilk çocuk değildir.
Soru 3

İçinde img bulunan kartları hangi seçici seçer?

  • .kart img :: Bu, kartı değil resmi seçer.
  • .kart:has(img) :: Doğru.
  • .kart:not(img) :: Bu, img olmayan kartları seçer.
Çizgili tablo satırları

Hedefteki kodu yazın. li:nth-child(odd) için background-color değeri whitesmoke olsun. Altına Bir, İki ve Üç yazan üç maddeli bir ul ekleyin.

<style>
  li:nth-child(odd) {
    background-color: whitesmoke;
  }
</style>

<ul>
  <li>Bir</li>
  <li>İki</li>
  <li>Üç</li>
</ul>
Sonuncu hariç

Hedefteki kodu yazın. p:not(:last-child) için border-bottom değeri 1px solid gray olsun. Altına bir div içinde Birinci ve Son yazan iki paragraf ekleyin.

<style>
  p:not(:last-child) {
    border-bottom: 1px solid gray;
  }
</style>

<div>
  <p>Birinci</p>
  <p>Son</p>
</div>

Bu derste öğrendikleriniz

  • :first-child, :last-child ve :nth-child() kardeşler arasındaki sıraya bakar.
  • -of-type seçicileri yalnızca aynı türdeki elemanları sayar.
  • :not() bir koşulu dışarıda bırakır, :is() ve :where() listeleri kısaltır.
  • :has() bir elemanı içindekilere göre seçer.

Dersi bitirdin mi?Bu dersi tamamladın.

İlerlemen bu tarayıcıda saklanır.