İçeriğe geç
academia.sh

Ders 03 / 26

Seçiciler

Tür, sınıf, kimlik ve evrensel seçicilerin belge ağacında hangi kümeyi döndürdüğü; bileşik seçici kavramı ve sınıf adlarının anlamla adlandırılması.

İçindekiler

Önceki ders biçem dosyasını belgeye bağladı. Dosyadaki her kural bir seçiciyle başlıyor ve şimdiye kadar yazılan seçiciler yalnızca öge adıydı: body, h1, td. Bu, ölçüm çizelgesindeki bütün hücreleri aynı biçimde ele almak demektir. Oysa çizelgede eksik ölçümleri işaretleyen hücreler var ve onların ayrı görünmesi gerekiyor.

Bu ders dört temel seçiciyi tanımlar: tür, sınıf, kimlik ve evrensel seçici. Her birinin belge ağacında hangi kümeyi döndürdüğü, çalıştırılabilir bir eşleyiciyle ölçülür.

Seçici Bir Küme Döndürür

Bir seçicinin işi tektir: belge ağacındaki düğümlere bakar ve bir alt küme döndürür. Döndürülen kümenin büyüklüğü sıfır da olabilir; boş küme bir hata değildir, kuralın hiçbir ögeye uygulanmaması demektir.

Aşağıdaki program, önceki kurstaki istasyon sayfasının küçültülmüş bir ağacını kurar ve dört seçici türünü bu ağaç üzerinde eşler. Ağaç, düğüm adını, sınıf listesini ve varsa kimliğini taşır — seçici eşlemesi için gereken bilgi budur.

// secici-esle.mjs — kucuk bir belge agaci uzerinde temel secicileri esler
const agac = {
  ad: "body", sinif: [], kimlik: null, cocuk: [
    { ad: "header", sinif: ["kunye"], kimlik: null, cocuk: [
      { ad: "h1", sinif: [], kimlik: null, cocuk: [] },
      { ad: "p", sinif: ["ozet"], kimlik: null, cocuk: [] },
    ]},
    { ad: "main", sinif: [], kimlik: "icerik", cocuk: [
      { ad: "table", sinif: ["olcum-cizelgesi"], kimlik: null, cocuk: [
        { ad: "tr", sinif: [], kimlik: null, cocuk: [
          { ad: "td", sinif: ["deger"], kimlik: null, cocuk: [] },
          { ad: "td", sinif: ["deger", "eksik"], kimlik: null, cocuk: [] },
        ]},
      ]},
      { ad: "p", sinif: ["ozet", "not"], kimlik: null, cocuk: [] },
    ]},
  ],
};

function* tumDugumler(d, yol = []) {
  const kendiYolu = [...yol, etiketle(d)];
  yield { dugum: d, yol: kendiYolu.join(" > ") };
  for (const c of d.cocuk) yield* tumDugumler(c, kendiYolu);
}

function etiketle(d) {
  return d.ad + (d.kimlik ? `#${d.kimlik}` : "") + d.sinif.map((s) => `.${s}`).join("");
}

// yalnizca basit secici: tur | .sinif | #kimlik | *
function esler(secici, d) {
  if (secici === "*") return true;
  if (secici.startsWith(".")) return d.sinif.includes(secici.slice(1));
  if (secici.startsWith("#")) return d.kimlik === secici.slice(1);
  return d.ad === secici;
}

const seciciler = ["*", "p", ".ozet", "#icerik", ".deger", ".eksik", "td", "#deger"];
for (const s of seciciler) {
  const bulunan = [...tumDugumler(agac)].filter(({ dugum }) => esler(s, dugum));
  console.log(`${s.padEnd(8)} -> ${bulunan.length} oge`);
  for (const b of bulunan) console.log(`           ${b.yol}`);
}
*        -> 10 oge
           body
           body > header.kunye
           body > header.kunye > h1
           body > header.kunye > p.ozet
           body > main#icerik
           body > main#icerik > table.olcum-cizelgesi
           body > main#icerik > table.olcum-cizelgesi > tr
           body > main#icerik > table.olcum-cizelgesi > tr > td.deger
           body > main#icerik > table.olcum-cizelgesi > tr > td.deger.eksik
           body > main#icerik > p.ozet.not
p        -> 2 oge
           body > header.kunye > p.ozet
           body > main#icerik > p.ozet.not
.ozet    -> 2 oge
           body > header.kunye > p.ozet
           body > main#icerik > p.ozet.not
#icerik  -> 1 oge
           body > main#icerik
.deger   -> 2 oge
           body > main#icerik > table.olcum-cizelgesi > tr > td.deger
           body > main#icerik > table.olcum-cizelgesi > tr > td.deger.eksik
.eksik   -> 1 oge
           body > main#icerik > table.olcum-cizelgesi > tr > td.deger.eksik
td       -> 2 oge
           body > main#icerik > table.olcum-cizelgesi > tr > td.deger
           body > main#icerik > table.olcum-cizelgesi > tr > td.deger.eksik
#deger   -> 0 oge

Dört Tür

Tür seçici (type selector) öge adını yazar ve o adı taşıyan bütün ögeleri döndürür. p seçicisi iki paragrafı da döndürdü: biri künyede, biri ana içerikte. Tür seçici belgedeki yerine bakmaz.

Sınıf seçici (class selector) nokta ile başlar ve class özniteliğinde o adı taşıyan ögeleri döndürür. Bir öge birden çok sınıf taşıyabilir; class="deger eksik" yazan hücre hem .deger hem .eksik seçicisiyle eşleşti. Sınıf adları boşlukla ayrılmış bir listedir ve sıraları anlam taşımaz.

Kimlik seçici (id selector) diyez ile başlar ve id özniteliği eşleşen ögeyi döndürür. Kimlikler belge içinde benzersiz olmalıdır; bu yüzden kimlik seçicisi en çok bir öge döndürür. #icerik bir öge döndürdü.

Evrensel seçici (universal selector) yıldızdır ve her ögeyle eşleşir. Örnekteki ağaçta on düğüm vardı ve on düğümü de döndürdü.

Son satır bir ayrımı gösterir: #deger sıfır öge döndürdü, çünkü deger bir sınıf adıdır, kimlik değil. Nokta ile diyezin karıştırılması, boş küme döndüren ve hiçbir uyarı üretmeyen bir kuraldır. Bir kuralın işlememesinin en sık sebeplerinden biri budur.

Bileşik Seçici

Basit seçiciler aralarında boşluk bırakılmadan yan yana yazıldığında bileşik seçici (compound selector) oluşur ve hepsini birden sağlayan ögeleri döndürür. Küme işlemleriyle söylenirse: kesişim.

td.eksik      { color: #8a1c1c; }
p.ozet.not    { font-style: italic; }

Birinci seçici, hem td olan hem eksik sınıfını taşıyan hücreleri döndürür. Örnek ağaçta bu tek hücredir. İkinci seçici üç koşulu birden ister ve yine tek ögeye ulaşır.

Bileşik seçicide tür seçici varsa en başta yazılır: td.eksik geçerlidir, .eksikt d başka bir şeydir. Tür seçici yazılmadığında evrensel seçici varsayılır; .eksik ile *.eksik aynı kümeyi döndürür.

Sınıf mı, Kimlik mi

İkisi de belgeye yazarın koyduğu adlardır. Aralarındaki teknik fark tektir: kimlik benzersizdir, sınıf değildir. Bu farktan iki ayrı sonuç çıkar.

Kimlik, belgeye tek bir yere işaret eden bir çapa koyar. Bağlantı hedefi (href="#icerik"), etiket–alan ilişkisi (for özniteliği) ve erişilebilirlik başvuruları kimlikle kurulur. Bunlar biçemle ilgili değildir; kimliğin asıl işi budur.

Sınıf ise bir sınıfa ait olmayı bildirir. Biçemin ihtiyaç duyduğu şey tam olarak budur: “bu hücre eksik ölçüm taşır”, “bu paragraf özettir”. Aynı bildirim belgede kaç kez geçerse geçsin aynı biçemi almalıdır.

Biçemde kimlik seçicisi kullanmanın sorunu, işlemediğinde değil, işlediğinde ortaya çıkar: kimlik seçicisinin özgüllüğü sınıf seçicisinden yüksektir ve bir kez yazıldığında onu bastırmak için yine bir kimlik seçicisi gerekir. Bu hesabı basamaklama ve özgüllük dersinde sayıyla yapacağız. Şimdilik uygulanabilir kural şudur: biçem sınıfla yazılır, kimlik başvuru içindir.

Sınıf Adı Anlamı Adlandırır, Görünümü Değil

Bir sınıf adı iki türlü seçilebilir. .kirmizi görünümü adlandırır; .eksik durumu adlandırır. İkisi de aynı hücreye takılabilir ve başlangıçta aynı sonucu verir.

Fark, karar değiştiğinde görünür. Eksik ölçümlerin kırmızı yerine gri gösterilmesine karar verilirse, .kirmizi adı yalan söylemeye başlar: adı kırmızı, rengi gri bir sınıf kalır. Düzeltmek için belgenin kendisine dokunmak, sınıf adını her geçtiği yerde değiştirmek gerekir. .eksik adında ise değişen tek şey bir bildirimin değeri olur; belge sabit kalır.

Bu, Web’in Temelleri ve HTML kursunda kurulan yapı–sunum ayrımının sınıf adlarındaki karşılığıdır: belge ne olduğunu söyler, biçem dosyası nasıl görüneceğini.

İstasyon sayfasının sınıf adları bu ilkeye göre seçilmiştir:

/* istasyon.css — 2. adım: durum sınıfları */
.olcum-cizelgesi td.deger { text-align: right; }
.olcum-cizelgesi td.eksik { color: #8a1c1c; }
.kunye .ozet              { font-size: 1.125rem; }

Son kuralda iki seçici arasında bir boşluk var ve bu boşluk bir işleçtir — bileşik seçici değil, bir ilişki bildirimidir. Sonraki ders bu işleci ve akrabalarını tanımlar.

Özet

  • Bir seçici belge ağacından bir alt küme döndürür; boş küme döndürmesi hata değildir, yalnızca kuralın hiçbir ögeye uygulanmaması demektir.
  • Tür seçici öge adıyla, sınıf seçici nokta ile, kimlik seçici diyez ile yazılır; evrensel seçici yıldızdır ve her ögeyle eşleşir.
  • Basit seçiciler boşluksuz yan yana yazıldığında bileşik seçici olur ve koşulların kesişimini döndürür; tür seçici en başta yazılır.
  • Kimlik belge içinde benzersizdir ve asıl işi başvuru hedefi olmaktır; biçem sınıfla yazılır, çünkü bir biçem kararı birden çok ögeye uygulanır.
  • Sınıf adı görünümü değil anlamı adlandırır; görünümü adlandıran ad, biçem kararı değiştiğinde belgeyi de değiştirmeye zorlar.

Sonraki Adım

Bu dersteki seçiciler ögenin kendisine baktı: adı ne, hangi sınıfları taşıyor, kimliği var mı. Belge ağacındaki konumu hiç kullanılmadı — oysa “yalnızca ölçüm çizelgesinin içindeki hücreler” gibi bir istek, ögenin nerede durduğunu sormayı gerektirir. Sonraki ders ağaçtaki ilişkileri seçiciye taşıyan birleştiricileri tanımlar ve bir seçicinin sağdan sola nasıl değerlendirildiğini gösterir.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat