Ga naar de inhoud

Specificity berekenen ​

Vorige week leerde je de rangorde: id verslaat class verslaat element. Dat volstond zolang je selectors uit één stuk bestonden.

Nu je selectors kan combineren, volstaat dat niet meer.
Wint main p.intro van #content p? Daarvoor moet je tellen.

tekken 3 stijl battle tussen selectoren

De som ​

Zet drie cijfers naast elkaar en tel per selector hoeveel er van elke soort in zit.

KolomWat je telt
#idid-selectors: #intro
.class, [attribute], :pseudo-classclass-selectors, attribute selectors en pseudo-classes: .box, [href], :hover
element, ::pseudo-elementelement-selectors en pseudo-elements: p, ::before

De linkse kolom weegt altijd zwaarder dan de rechtse, hoeveel er rechts ook staat. Tien classes verslaan nog altijd geen enkele id.

Selectoridclasselement
p001
p.intro011
main p.intro012
#content p101
a:hover011
p.plain.box:not(#bio):first-child131
main#main section:first-of-type p::after113

Dus #content p (1-0-1) wint van main p.intro (0-1-2), want de id-kolom beslist eerst.

Twee dingen tellen niet mee

De universal selector * telt voor niets. En :not() zelf telt niet mee, wel wat er binnenin staat. Daarom staat #bio in het voorbeeld hierboven in de id-kolom.

💡 devtools

In de devtools zie je meteen welke regel wint en welke doorstreept is.

Oefening ​

Welke kleur krijgt de paragraaf?

html
<main id="main">
    <h1>Hi, my name is</h1>
    <p id="intro" class="black">I'm Bart en ...</p>
</main>
css
p.black        { color: green; }
main > p       { color: red; }
p#intro        { color: blue; }
p              { color: black; }
Antwoord

Blauw.

Selectoridclasselement
p.black011
main > p002
p#intro101
p001

p#intro is de enige met een id, dus die wint, ongeacht waar hij staat.

De combinator > telt zelf niet mee. Hij zegt alleen iets over de relatie, niet over hoeveel elementen je selecteert.

En hier?

css
p.black  { color: green; }
p#intro  { color: blue; }
p        { color: black; }
p#intro  { color: red; }
Antwoord

Rood. Beide p#intro zijn even sterk (1-0-1), en bij gelijkspel wint de laatste. Dat is de cascade van vorige week.

Thuis ​

Bereken de specificity van deze drie:

css
main#main section:first-of-type p::after
main#main + footer > a[href^="tel:"]
img ~ p.caption span.author
Antwoord
Selectoridclasselement
main#main section:first-of-type p::after113
main#main + footer > a[href^="tel:"]113
img ~ p.caption span.author023

De eerste twee zijn precies even sterk. Botsen ze, dan beslist de volgorde in je bestand.

Op een test? ​

GEGARANDEED. Ik vraag elk jaar een reeks moeilijke selectoren om te berekenen.

Nooit ​

Inline styles en !important

Een inline style in je html (style="font-weight: bold;") verslaat je hele external stylesheet. Een !important verslaat zelfs dat.

Allebei zijn ze een manier om de cascade te omzeilen in plaats van te begrijpen.

De volgende keer dat jij of iemand anders iets wil aanpassen zit er maar één iets op en dat is nóg een !important toevoegen.
Zo eindig je met stylesheet spaghetti.

Kom je in de verleiding, dan is bijna altijd je selector het probleem. Een regel die je niet overschreven krijgt, is meestal een regel die te sterk is. Of omgekeerd, maak je nieuwe regel sterker.

Werk met de cascade, niet tegen de cascade.