Tananyag
13. lecke · Kijelölők I.

3. modul · CSS alapok · 13. lecke

Kijelölők I.

A CSS fele a megcélzás: pontosan azokat az elemeket kell eltalálnod, amiket formázni akarsz — se többet, se kevesebbet. Ebben a leckében megtanulod az összes alapvető kijelölőt, és azt a szóközt, ami két teljesen különböző dolgot jelenthet.

≈ 40 perc Előtte: 11–12. lecke 11 élő példa

Mit fogsz tudni a lecke végén

1Mi a kijelölő?

A kijelölő (angolul selector, magyarul szelektornak is hívjuk) a CSS-szabály első része: az a rész, ami a kapcsos zárójel előtt áll. Ez mondja meg a böngészőnek, hogy a szabály mely elemekre vonatkozik.

GONDOLJ RÁ KÉRDÉSKÉNT

A kijelölő valójában egy kérdés az oldal fastruktúrájához (3. lecke): „add ide az összes olyan elemet, amelyik…". A böngésző végigfut a fán, összegyűjti a találatokat, és mindegyikre alkalmazza a szabályt. Ha nulla találat van, nem történik semmi — és hibaüzenetet sem kapsz.

Amit ebben a leckében megtanulsz
KijelölőMit céloz meg?
pMinden p elemet
.dobozMinden elemet, amin ott a doboz osztály
#fejlecAzt az egy elemet, aminek az azonosítója fejlec
*Minden elemet
h1, h2Minden h1-et és minden h2-t
p.fontosAzokat a p elemeket, amelyeken ott a fontos osztály
.kartya pA .kartya belsejében lévő összes p-t
.menu > liA .menu közvetlen li gyerekeit
h2 + pAzt a p-t, ami közvetlenül egy h2 után áll
input[type="email"]Az e-mail típusú beviteli mezőket

2Elemszelektor

A legegyszerűbb: leírod az elem nevét, pont, vessző és kettőskereszt nélkül. A szabály az oldal összes ilyen elemére vonatkozik.

Minden bekezdés, minden listaelem
index.html
<h2>Hozzávalók</h2>
<p>Négy főre.</p>
<ul>
  <li>burgonya</li>
  <li>tojás</li>
</ul>
<p>Jó étvágyat!</p>
style.css
h2 {
  color: #be123c;
}

p {
  color: #7c6b74;
  font-style: italic;
}

li {
  color: #0369a1;
}
Eredmény a böngészőben
Mind a két bekezdés dőlt lett, és mind a két listaelem kék — akkor is, ha egymástól távol vannak. Az elemszelektor nem válogat.
EZ EGYBEN A KORLÁTJA IS

Mi van, ha csak az egyik bekezdést akarod megváltoztatni? Az elemszelektorral sehogy. Ezért van szükség osztályokra — az következik.

MIRE JÓ MÉGIS?

Alapbeállításokhoz. „Minden bekezdés ilyen betűméretű", „minden link ilyen színű", „a body ilyen betűtípusú". Ezek után jönnek az osztályok, amik a kivételeket kezelik.

3Osztályszelektor

Ez lesz a munkalovad — a CSS-ed 80%-a osztályszelektor lesz. A HTML-ben class="nev", a CSS-ben .nev, ponttal az elején.

Csak azok, amiket megjelöltél
index.html
<p>Ez egy sima bekezdés.</p>

<p class="fontos">Ez fontos!</p>

<p>Ez megint sima.</p>

<h3 class="fontos">Címsor is lehet fontos</h3>

<li class="fontos">Listaelem is</li>
style.css
.fontos {
  background-color: #fef3c7;
  border-left: 4px solid #d97706;
  padding: 6px 10px;
}
Eredmény a böngészőben
Az osztály elemtípustól független: ugyanaz a szabály hat egy bekezdésre, egy címsorra és egy listaelemre. Te döntöd el, mi tartozik össze — nem a HTML elemtípusa.
A PONT CSAK A CSS-BEN VAN!

HTML-ben: class="fontos"pont nélkül.
CSS-ben: .fontos { ... }ponttal.
Ez a két leggyakoribb kezdő elgépelés: class=".fontos" a HTML-ben, vagy fontos { } a CSS-ben. Egyik sem működik, és egyik sem ad hibaüzenetet.

4Azonosító-szelektor

A HTML-ben id="nev", a CSS-ben #nev, kettőskereszttel. Mivel az azonosító oldalanként egyedi, ez pontosan egy elemet céloz meg.

Osztály és azonosító egymás mellett
index.html
<div class="doboz">Első doboz</div>

<div class="doboz" id="kiemelt">Kiemelt doboz</div>

<div class="doboz">Harmadik doboz</div>
style.css
.doboz {
  border: 1px solid #9ca3af;
  padding: 8px 12px;
  margin-bottom: 8px;
}

#kiemelt {
  border-color: #be123c;
  border-width: 3px;
  background-color: #fff5f7;
}
Eredmény a böngészőben
Mindhárom dobozra hat a .doboz szabály, de a középsőre ráadásul a #kiemelt is. A két szabály összeadódik, és ahol ütköznek (a keret színe és vastagsága), ott az azonosító nyer.
EMLÉKEZTETŐ A 11. LECKÉBŐL

Stílusozáshoz lehetőleg ne azonosítót használj. Az azonosító a CSS-ben nagyon „erős": később csak még erősebb szabállyal lehet felülírni, és ez gyorsan fájdalmassá válik. (A 15. leckében kiderül, pontosan mennyivel erősebb.) Az id maradjon a horgonyoké, a label for attribútumáé és a JavaScripté.

5Univerzális és csoportos

A csillag: minden elem

A * az oldal összes elemét megcélozza. Önmagában ritkán használjuk, de van egy nagyon gyakori szerepe:

style.css
* {
  box-sizing: border-box;
}

Ezt a három sort szinte minden stíluslap tartalmazza — hogy miért, azt a 17. leckében (dobozmodell) érted majd meg. Most csak ismerd fel.

A vessző: több kijelölő egy szabályban

A vesszővel elválasztott kijelölők mindegyikére vonatkozik a szabály. A 12. leckében már láttad; most nézzük meg vegyesen.

Vegyes csoportos kijelölő
index.html
<h2>Címsor</h2>
<p>Sima bekezdés.</p>
<p class="megjegyzes">Megjegyzés.</p>
<div id="lablec">Lábléc</div>
style.css
h2, .megjegyzes, #lablec {
  font-family: Georgia, serif;
  color: #be123c;
}
Eredmény a böngészőben
Egyetlen szabály háromféle kijelölővel: elem, osztály és azonosító. Csak a sima bekezdés maradt ki, mert őt egyik sem célozta meg.
A VESSZŐ KIHAGYÁSA MÁST JELENT!

Ez a két sor teljesen mást céloz meg:

h2 ÉS .megjegyzes
h2, .megjegyzes { ... }
h2 BELSEJÉBEN lévő .megjegyzes
h2 .megjegyzes { ... }

Egyetlen vessző a különbség. A jobb oldali valószínűleg semmit nem talál — és nem szól érte.

6Kombinálás szóköz nélkül

Ha két kijelölőt szóköz nélkül írsz egymás után, az azt jelenti: „ugyanaz az elem, ami mindkettőnek megfelel".

KijelölőMit jelent?
p.fontosOlyan p, amin ott a fontos osztály
.doboz.kiemeltOlyan elem, amin mindkét osztály rajta van
div#fejlecOlyan div, aminek az azonosítója fejlec
Két osztály együtt
index.html
<p class="uzenet">Csak üzenet</p>

<p class="uzenet hiba">Üzenet + hiba</p>

<p class="hiba">Csak hiba</p>
style.css
.uzenet {
  border: 1px solid #9ca3af;
  padding: 6px 10px;
  margin-bottom: 6px;
}

.uzenet.hiba {
  border-color: #be123c;
  background-color: #fff5f7;
  color: #be123c;
  font-weight: bold;
}
Eredmény a böngészőben
A .uzenet.hiba csak a középsőre hat — arra, amelyiken mindkét osztály rajta van. A harmadik bekezdésen csak a hiba osztály van, így semmit nem kapott (nincs önálló .hiba szabály).
MIÉRT HASZNOS EZ?

Így építhetsz alap + változat rendszert: van egy .gomb szabályod az összes gombra, és mellé .gomb.veszelyes, .gomb.nagy szabályok a változatokra. A HTML-ben csak annyi a dolgod, hogy a megfelelő osztályokat egymás mellé írod.

7Leszármazott kijelölő

Most jön a lecke legfontosabb — és leggyakrabban félreértett — része. Ha két kijelölő közé szóközt teszel, az azt jelenti: „az elsőnek a belsejében lévő második".

EGY SZÓKÖZ, KÉT VILÁG
p.fontos — szóköz NÉLKÜL
p.fontos { ... }

Olyan p, amin rajta van a fontos osztály.

p .fontos — szóközzel
p .fontos { ... }

Olyan elem a fontos osztállyal, ami egy p belsejében van.

Ha véletlenül beütsz egy szóközt, a szabályod némán megszűnik működni. Ez a CSS egyik leggyakoribb, legnehezebben észrevehető hibája.

Ugyanaz a HTML, egyetlen szóköz különbség
index.html
<p class="fontos">
  Bekezdés a fontos osztállyal.
</p>

<p>
  Bekezdés, benne egy
  <span class="fontos">fontos span</span>.
</p>
style.css
/* szóköz NÉLKÜL: maga a p */
p.fontos {
  background-color: #fef3c7;
}

/* szóközzel: a p BELSEJÉBEN */
p .fontos {
  background-color: #dcfce7;
  font-weight: bold;
}
Eredmény a böngészőben
Az első bekezdés sárga (maga a p viseli az osztályt), a másodikban pedig csak a span zöld (ő van a p belsejében). A két szabály soha nem cserélhető fel.

A leszármazott bármilyen mélyen lehet

A leszármazott kijelölő nem csak a közvetlen gyerekeket találja meg, hanem az unokákat, dédunokákat is — bármilyen mélyen.

Mélyen beágyazott elem is találat
index.html
<div class="kartya">
  <h3>Cím</h3>
  <p>Közvetlen gyerek bekezdés.</p>
  <div>
    <div>
      <p>Három szinttel mélyebben.</p>
    </div>
  </div>
</div>

<p>Kártyán KÍVÜLI bekezdés.</p>
style.css
.kartya p {
  color: #be123c;
  background-color: #fff5f7;
  padding: 4px 8px;
}
Eredmény a böngészőben
Mindkét kártyán belüli bekezdés megváltozott — az is, amelyik három szinttel mélyebben van. A kártyán kívüli viszont érintetlen. Ezért nagyon hasznos ez a kijelölő: „ezen a részen belül minden bekezdés".

8Gyermek kijelölő

Ha csak a közvetlen gyerekeket akarod megcélozni, a szóköz helyett > jelet használsz.

div.kartya p div p gyerek unoka .kartya > p → csak a bal oldalit .kartya p → MINDKETTŐT
A > csak egy szintet lép lefelé, a szóköz bármennyit.
Szóköz és > egymás mellett
index.html
<ul class="menu">
  <li>Kezdőlap</li>
  <li>Termékek
    <ul>
      <li>Kabátok</li>
      <li>Cipők</li>
    </ul>
  </li>
  <li>Kapcsolat</li>
</ul>
style.css
/* CSAK a közvetlen gyerekek */
.menu > li {
  background-color: #fce7f3;
  border-left: 4px solid #be123c;
  padding-left: 6px;
  margin-bottom: 4px;
}
Eredmény a böngészőben
Csak a három fő menüpont kapott hátteret — a „Kabátok" és a „Cipők" nem, mert ők a belső ul gyerekei, nem a .menu elemé. Szóközzel (.menu li) mind az öt megváltozott volna.
MIKOR KELL A > ?

Leggyakrabban többszintű menüknél és egymásba ágyazott listáknál — ott, ahol ugyanaz az elemtípus ismétlődik több szinten. Ha nincs beágyazás, a szóköz és a > ugyanazt eredményezi — ilyenkor a szóköz az egyszerűbb.

9Testvér-kijelölők

Testvérek azok az elemek, amelyeknek ugyanaz a szülőjük. Két kijelölő van rájuk:

KijelölőMit céloz meg?
h2 + pKözvetlenül egy h2 után álló p — csak az egyet
h2 ~ pAz összes p, ami a h2 után áll (ugyanazon a szinten)
A + és a ~ különbsége
index.html
<p>Bekezdés a címsor ELŐTT.</p>

<h2>Címsor</h2>

<p>Első bekezdés a címsor után.</p>
<p>Második bekezdés.</p>
<p>Harmadik bekezdés.</p>
style.css
/* CSAK a közvetlenül utána álló */
h2 + p {
  font-weight: bold;
  color: #be123c;
}

/* MINDEGYIK utána álló */
h2 ~ p {
  border-left: 3px solid #fb7185;
  padding-left: 8px;
}
Eredmény a böngészőben
Az első bekezdés (a címsor előtt) semmit nem kapott — a testvér-kijelölők csak előrefelé működnek. A címsor utáni első bekezdés mindkét szabályt megkapta (félkövér és keretes), a másik kettő csak a keretet.
VISSZAFELÉ NEM MEGY

A CSS-ben nincs „az előtte álló elem" kijelölő, és szülőt sem lehet megcélozni a gyerek alapján. A kijelölők mindig lefelé és előre mutatnak a fában. Ha ilyesmire van szükséged, általában az a jó megoldás, hogy adsz egy osztályt a megfelelő elemnek.

MIRE JÓ A GYAKORLATBAN?

Tipikus eset: „a címsor utáni első bekezdés legyen bevezető stílusú", vagy „két egymás után következő gomb közé kerüljön térköz" (.gomb + .gomb { margin-left: 8px; }) — így az első gomb elé nem kerül felesleges hely.

10Attribútum-szelektorok

Elemeket attribútumaik alapján is megcélozhatsz, szögletes zárójellel. Ez főleg űrlapoknál és linkeknél hasznos.

KijelölőMit céloz meg?
[required]Minden elemet, amin van required attribútum (bármi az értéke)
input[type="email"]Azokat az inputokat, amiknek a típusa pontosan email
a[href^="https"]Linkek, amelyeknek a href attribútuma így kezdődik (^ = eleje)
a[href$=".pdf"]Linkek, amelyeknek a href attribútuma így végződik ($ = vége)
a[href*="wiki"]Linkek, amelyeknek a href attribútuma tartalmazza ezt (* = bárhol)
Kötelező és e-mail mezők megkülönböztetése
index.html
<p>
  <label for="a">Név *</label><br>
  <input type="text" id="a" name="nev" required>
</p>
<p>
  <label for="b">E-mail *</label><br>
  <input type="email" id="b" name="email" required>
</p>
<p>
  <label for="c">Becenév</label><br>
  <input type="text" id="c" name="becenev">
</p>
style.css
input {
  padding: 5px 8px;
  border: 1px solid #9ca3af;
}

input[required] {
  border-left: 4px solid #be123c;
}

input[type="email"] {
  background-color: #eff6ff;
}
Eredmény a böngészőben
A két kötelező mező bordó bal szegélyt kapott, az e-mail mező ráadásul kék hátteret. A becenév mező semmit — mert se nem kötelező, se nem e-mail. Egyetlen osztályt sem kellett kiírnod a HTML-be.
Külső link és PDF automatikus megjelölése
index.html
<p><a href="rolam.html">Belső link</a></p>

<p><a href="https://wikipedia.org">Külső link</a></p>

<p><a href="utmutato.pdf">Letölthető PDF</a></p>
style.css
a[href^="https"] {
  color: #047857;
  font-weight: bold;
}

a[href$=".pdf"] {
  color: #be123c;
  text-decoration: underline dotted;
}
Eredmény a böngészőben
A böngésző magától megkülönbözteti a belső, a külső és a letölthető linket — pusztán a href alapján. Ha holnap új PDF-linket teszel az oldalra, az is automatikusan megkapja a stílust.

11Melyiket mikor?

HelyzetAjánlott kijelölő
Alapbeállítás minden ilyen elemreElemszelektor: p, a, body
Egy ismétlődő komponens (kártya, gomb, üzenet)Osztály: .kartya — ez a fő eszköz
Ugyanannak a komponensnek egy változataKét osztály: .gomb.veszelyes
„Ezen a részen belül minden…"Leszármazott: .kartya p
Beágyazott listák, többszintű menüGyermek: .menu > li
Elemek közötti térköz, bevezető bekezdésTestvér: .gomb + .gomb, h2 + p
Űrlapmezők típus szerintAttribútum: input[type="email"]
Egyetlen, tényleg egyedi elemInkább osztály, mint azonosító
A LEGFONTOSABB TANÁCS: NE LÁNCOLJ TÚL SOKAT
✘ Törékeny
div.oldal div.tartalom
  ul.lista li a span { ... }
✔ Egyszerű és stabil
.menu-cimke { ... }

A hosszú lánc a HTML szerkezetéhez ragad: ha átrendezed a dobozokat, a szabály elromlik. Egy jól elnevezett osztály viszont ott marad az elemen, bárhova is kerül. Ha kettőnél több szintet láncolsz, gondold át, nem lenne-e jobb egy osztály.

Tipikus hibák

HibaMi történik?
Hiányzó pont: fontos { } A böngésző egy <fontos> nevű elemet keres. Ilyen nincs → nem történik semmi.
Pont a HTML-ben: class=".fontos" Az osztály neve tényleg .fontos lesz — a .fontos szelektor így nem talál rá.
Véletlen szóköz: p .fontos Nem a p-re hat, hanem a benne lévő elemre. Néma hiba.
Hiányzó vessző: h1 h2 { } Nem „h1 és h2", hanem „h1 belsejében lévő h2" — ami általában nem létezik.
Elgépelt osztálynév Nulla találat, nulla hibaüzenet. F12Styles: ha a szabály nem jelenik meg az elemnél, nem rá vonatkozik.
Túl hosszú lánc Működik, de törékeny, és nehéz felülírni (15. lecke).

Önellenőrző kérdések

Előbb válaszolj magadban, csak utána nézd meg a megoldást.

1. Mi a különbség a p.fontos és a p .fontos között?

p.fontos (szóköz nélkül): olyan bekezdés, amin rajta van a fontos osztály. p .fontos (szóközzel): olyan elem a fontos osztállyal, ami egy bekezdés belsejében van. Egy szóköz, két teljesen különböző jelentés.

2. Mit céloz meg ez: .kartya > p, és mit ez: .kartya p?

Az első csak a .kartya közvetlen bekezdés-gyerekeit. A második az összes bekezdést a kártyán belül, bármilyen mélyen — unokákat, dédunokákat is.

3. Mit jelent a vessző, és mit a szóköz két kijelölő között?

Vessző = „és": h1, h2 minden h1-re és minden h2-re hat. Szóköz = „belsejében": h1 h2 a h1-en belüli h2-t célozná meg (ami ritkán létezik).

4. Mikor hat a .doboz.kiemelt szabály egy elemre?

Csak akkor, ha az elemen mindkét osztály rajta van: class="doboz kiemelt". Ha csak az egyik, a szabály nem vonatkozik rá.

5. Hogyan adnál kék hátteret minden e-mail típusú beviteli mezőnek, osztály hozzáadása nélkül?

Attribútum-szelektorral: input[type="email"] { background-color: #eff6ff; }

6. Szeretnéd, hogy a címsor előtt álló bekezdés legyen kisebb betűs. Meg tudod ezt oldani kijelölővel?

Nem. A testvér-kijelölők csak előrefelé működnek (+ és ~), és szülőt sem lehet megcélozni a gyerek alapján. A megoldás: adj osztályt annak a bekezdésnek.

7. Miért rossz ez a szabály: div.oldal div.tartalom ul li a { color: red; }?

Mert a HTML pontos szerkezetéhez ragad: ha később átrendezed a dobozokat vagy kiveszel egy szintet, a szabály némán megszűnik működni. Ráadásul nagyon „erős", így később nehéz felülírni. Helyette adj egy beszédes osztályt a linknek, és arra hivatkozz.

8. A .fontos szabályod nem működik. Hogyan ellenőrzöd az F12-vel?

Jobb gomb az elemen → Vizsgálat, majd a jobb oldali Styles panel. Ha a szabály ott sincs, akkor a kijelölő nem talál rá (elgépelt név, véletlen szóköz, hiányzó pont). Ha ott van, de áthúzva, akkor egy erősebb szabály írta felül.

12Összefoglalás

  1. A kijelölő egy kérdés az elemfához: „add ide az összes olyan elemet, amelyik…". Nulla találat = néma hatástalanság.
  2. p = elemszelektor (alapbeállításokhoz) · .osztaly = a fő eszköz · #azonosito = egyetlen elem, stílushoz kerüld.
  3. A pont csak a CSS-ben van; a HTML-ben class="fontos".
  4. * = minden elem · a, b = „a és b".
  5. Szóköz nélkül összeírva: ugyanaz az elem felel meg mindkettőnek (p.fontos, .doboz.kiemelt).
  6. Szóközzel: leszármazott — „az első belsejében lévő második", bármilyen mélyen.
  7. >: csak a közvetlen gyerek — egy szint lefelé.
  8. +: a közvetlenül utána álló testvér · ~: az összes utána álló testvér. Visszafelé nincs.
  9. [attr], [attr="ertek"], ^= (eleje), $= (vége), *= (tartalmazza).
  10. Ne láncolj kettőnél több szintet. Egy jól elnevezett osztály stabilabb, mint egy hosszú szerkezeti lánc.