01. TÉMA · CSS

Szelektorok erőssége.

Melyik szabály nyer, ha több is ugyanarra az elemre vonatkozik?

1. FEJEZET

Ki dönt, ha két szabály ütközik?

Gyakran több CSS-szabály is ugyanannak az elemnek ugyanazt a tulajdonságát állítaná be. A böngésző ilyenkor nem „összekeveri” őket, hanem egy rögzített sorrendben dönt – ez a kaszkád (lépcső). A saját stíluslapjainkon belül ezt a négy lépést kell ismerni:

  1. Fontosságaz !important jelölésű deklaráció megelőzi a jelölés nélkülit
  2. Az elemhez csatolt stílusa style="…" attribútum megelőz minden stíluslapbeli szelektort
  3. Specificitása szelektor „erőssége”: (ID, osztály, típus) pontszám – a nagyobb nyer
  4. Sorrendha minden más egyenlő, a később leírt szabály nyer

A döntés lépcsőzetes: a következő lépést csak akkor nézi a böngésző, ha az előzőn döntetlen lett. A specificitás tehát a 3. lépés – nem tartozik bele sem a style attribútum, sem az !important.

A böngésző saját alapstílusa (pl. a linkek kék színe) és a felhasználó beállításai is részt vesznek a kaszkádban, de mindig a mi stíluslapunk „alatt” – ezért tudjuk felülírni őket egy egyszerű a { color: … } szabállyal.

2. FEJEZET

A specificitás kiszámolása

A specificitás három szám, amelyet a szelektor részeiből számolunk össze:

OszlopMit számolunk?Példák
A IDazonosító-szelektorok#fejlec
B osztályosztály-, attribútum- és pszeudo-osztály-szelektorok.menu, [type="text"], :hover, :nth-child(2)
C típuselem- (típus-) szelektorok és pszeudo-elemekp, li, ::before

Két szelektor összevetésekor balról jobbra haladunk: először az A oszlopot hasonlítjuk össze, és csak egyenlőség esetén nézzük a B-t, majd a C-t. Ezért 1-0-0 erősebb, mint 0-12-0: egyetlen ID legyőz akárhány osztályt. Nem számít: a csillag (*), a kombinátorok (szóköz, >, +, ~), és a :where() teljes tartalma.

PRÓBÁLD KI

Specificitás-számoló

írj be bármilyen szelektort

A :is(), a :not() és a :has() a legerősebb argumentumának specificitását kapja, a :where() mindig 0-0-0. A :where()-t ezért alapstílusokhoz használjuk: bármilyen egyszerű szabály felülírja.

3. FEJEZET

Ki nyer? – élő példa

Az alábbi bekezdésre öt szabály vonatkozik, mindegyik más színt adna. Kapcsold ki-be a szabályokat, add hozzá a style attribútumot vagy egy !important-ot, és figyeld, melyik győz. A szöveg színét a böngésző valóban így számolja ki – a magyarázat mellette ugyanezt a döntést vezeti le lépésenként.

PRÓBÁLD KI

Öt szabály, egy bekezdés

a HTML: <div class="doboz"><p id="cel" class="hir kiemelt">

    Az !important nem „végtelen erős”: ha több !important deklaráció ütközik, közöttük ugyanúgy a specificitás, majd a sorrend dönt. Ha mindenhová !important kerül, visszajutottunk a kiindulóponthoz – csak nehezebben javítható kóddal. Inkább írj pontosabb szelektort, vagy rendezd át a szabályokat.

    4. FEJEZET

    Döntetlen esetén a sorrend dönt

    Ha két szabály specificitása megegyezik, a később leírt nyer. Ez a stíluslapon belüli sorrendre és a stíluslapok betöltési sorrendjére (<link> elemek) is igaz.

    PRÓBÁLD KI

    Két egyforma erős szabály

    stilus.css

    ÖSSZEFOGLALÁS

    Gyakori szelektorok erőssége

    SzelektorSpecificitás (A-B-C)Megjegyzés
    *0-0-0univerzális szelektor
    :where(.kartya) p0-0-1a :where() nem számít
    p, ::before0-0-1típus-szelektor, pszeudo-elem
    ul li0-0-2két típus-szelektor
    .gomb, [type="text"], :hover0-1-0osztály, attribútum, pszeudo-osztály
    a.gomb:hover0-2-1
    #fejlec1-0-0azonosító
    :is(#fo, .oldalsav) p1-0-1a legerősebb argumentum számít
    style="…"–nem specificitás: minden stíluslapbeli szelektort megelőz
    !important–külön lépés: a jelölés nélküli deklarációkat előzi meg
    • Sorrend a döntésben: fontosság → style attribútum → specificitás → sorrend.
    • A specificitás három szám, balról jobbra hasonlítjuk össze.
    • Jó gyakorlat: alacsony, egyenletes specificitás (főleg osztályok), kevés ID a stíluslapon, !important csak kivételesen.