🎨 CSS: selektory a kaskáda

Kdo vyhraje

O čem to je

HTML řekne, co je nadpis a co odstavec. Jak to bude vypadat, řeší CSS. Napíšeš „nadpisy budou modré“ a všechny nadpisy zmodrají.

Potíž nastane, když dvě pravidla chtějí pro tentýž element něco jiného. Jedno říká modrá, druhé červená. Kdo vyhraje? To rozhoduje kaskáda. Kdo ji nezná, tráví hodiny laděním, proč se styl „nechytá“.

Nové pojmy

CSSCascading Style Sheets, kaskádové styly. Jazyk, kterým se popisuje vzhled HTML: barvy, písmo, velikosti, rozložení.h1 { color: navy; }
Pravidlo, selektor, deklaracePravidlo = selektor + složené závorky s deklaracemi. Selektor vybírá, kterých elementů se pravidlo týká. Deklarace je dvojice vlastnost: hodnota;.V p { color: gray; } je p selektor, color vlastnost a gray hodnota.
Třída a idAtributy v HTML. class může mít stejnou hodnotu u mnoha elementů. id musí být na stránce jedinečné.<p class="upozorneni">, <section id="rozvrh">

Selektory: jak vybrat elementy

SelektorVyberePříklad
pvšechny elementy daného typuvšechny odstavce
.upozornenielementy s třídou (tečka)<p class="upozorneni">
#rozvrhelement s id (mřížka)<section id="rozvrh">
nav apotomek: a kdekoli uvnitř navodkazy v menu
a:hoverpseudotřída: stav elementuodkaz pod myší
*úplně všechnozákladní nastavení
PseudotřídaČást selektoru za dvojtečkou. Vybírá element podle stavu nebo pozice, ne podle značky.:hover (pod myší), :focus (aktivní pole), :first-child (první potomek).

Kaskáda: soutěž pravidel

KaskádaPostup, kterým prohlížeč vybere jednu hodnotu, když se o tutéž vlastnost téhož elementu přou různá pravidla.p { color: blue; } a .upozorneni { color: red; } – odstavec s třídou bude červený.
Specificita„Síla“ selektoru. Počítá se jako trojice (id – třídy – typy): kolik je v selektoru id, kolik tříd, atributů a pseudotříd, kolik typů elementů. Porovnává se zleva.#menu a má 1-0-1, .menu a má 0-1-1. Vyhrává #menu a.
Pravidlo s !important přebije pravidla bez něj.
Při stejné důležitosti vyhrává vyšší specificita.
Inline styl v atributu style je silnější než jakýkoli selektor.
Při stejné specificitě vyhrává pravidlo, které je v kódu později.
p { color: blue; }, .text { color: green; }, p { color: red; }. Jakou barvu má <p class="text">?
Specificity: p = 0-0-1, .text = 0-1-0. Třída má vyšší specificitu, takže vyhrává zelená. Že je p { color: red; } později, nevadí: pořadí rozhoduje jen při shodné specificitě.
Porovnej #hlavni p a .obsah .clanek p.
#hlavni p = 1-0-1. .obsah .clanek p = 0-2-1. Porovnává se zleva: 1 id > 0 id, vyhrává `#hlavni p`, i když má druhý selektor dvě třídy.

Dědičnost

DědičnostNěkteré vlastnosti (hlavně písmo a barva textu) přechází z rodiče na potomky. Jiné (okraje, rámečky, pozadí) se nedědí.body { font-family: sans-serif; } změní písmo celé stránky.
✗Styl se neuplatnil, tak přidám !important a je to.
✓Zjisti v nástrojích pro vývojáře (F12), které pravidlo vyhrává, a uprav specificitu nebo pořadí.

!important přebije všechno. Za chvíli potřebuješ další !important, abys přebil ten první, a styly se stanou neudržitelnými.

Selektor vybírá elementy (typ, .třída, #id, potomek, pseudotřída). Když se pravidla přou, rozhoduje kaskáda: důležitost, pak specificita (id – třídy – typy), pak pozdější pořadí. Písmo a barva textu se dědí.

Počítáme body

O čem to je

Specificita je jako bodování ve sportu se třemi koly. Kdo vyhraje první kolo, vyhrává. Teprve při remíze se hraje další kolo. Naučíš se body spočítat u jakéhokoli selektoru.

Nové pojmy

CSS a pravidloCSS je jazyk vzhledu webu. Pravidlo má selektor (co) a deklarace vlastnost: hodnota; (jak)..tlacitko { background: orange; }
SelektorVýraz, který vybírá elementy: podle typu (p), třídy (.cena), id (#kosik), stavu (:hover) nebo umístění (nav a).ul li vybere položky seznamu uvnitř ul.
SpecificitaBody selektoru ve tvaru A-B-C. A = počet id, B = počet tříd, atributových selektorů a pseudotříd, C = počet typů elementů a pseudoelementů. * a kombinátory (mezera, >) body nemají.nav a:hover = 0-1-2

Jak spočítat body

Spočítej #něco → číslo A.
Spočítej .něco, [atribut] a :pseudotřídy → číslo B.
Spočítej názvy elementů (p, div, a) a pseudoelementy (::before) → číslo C.
Porovnej A. Při rovnosti B. Při rovnosti C.
Při úplné shodě vyhrává pravidlo, které je v CSS později.
SelektorA (id)B (třídy…)C (typy)
p001
.cena010
ul li a003
.menu a:hover021
#kosik .polozka110
input[type="email"]011
  • h1 – 0-0-1
  • .nadpis – 0-1-0
  • #logo – 1-0-0
  • header .nadpis h1 – 0-1-2
  • a:focus – 0-1-1
  • #menu li.aktivni a – 1-1-2

Spočítej body selektoru na kartičce a pak ji otoč pro kontrolu.

Jakou barvu má odkaz <a class="btn"> v <nav id="menu">? Pravidla: #menu a { color: white; } a a.btn { color: black; }.
#menu a = 1-0-1. a.btn = 0-1-1. Rozhoduje první číslo: 1 > 0. Odkaz je bílý.
Dvě pravidla .cena { color: red; } a .akce { color: green; }, element <span class="cena akce">. Pravidlo .akce je v souboru druhé. Výsledek?
Obě mají 0-1-0, je remíza. Rozhoduje pořadí: později je .akce, cena bude zelená. Pořadí tříd v atributu class nerozhoduje.

Mimo body

  • Inline styl (style="color:red" přímo v HTML) přebije každý selektor.
  • `!important` přebije i inline styl bez !important. Je to nouzová brzda.
  • Dědičnost: hodnota zděděná od rodiče prohraje s jakýmkoli pravidlem, které cílí přímo na element.
✗.a .b .c .d .e .f .g .h .i .j .k (11 tříd) přebije #x, protože 11 > 1.
✓Vyhrává #x. Specificita 1-0-0 je větší než 0-11-0.

Body se nesčítají do jednoho čísla. Kola se porovnávají zleva a jedno id vyhraje nad libovolným počtem tříd.

Specificita = A-B-C (id – třídy, atributy, pseudotřídy – typy elementů), porovnává se zleva. Při remíze vyhrává pozdější pravidlo. Inline styl a !important stojí nad body a mají se používat výjimečně.