Kaskaden

Hur ska webbläsaren göra när ett element får flera olika värden till ett attribut från flera olika regler? Då måste det finnas tydliga regler för vilket värde som är viktigast. Det är denna ordning som kaskaden handlar om.

Tre delar

Det är många delar som samspelar och det kan därför upplevas som ganska svårt och krångligt. Utvecklarverktygen i webbläsaren är ett bra hjälpmedel för att förstå vilka regler som prioriteras. De tre delar som kaskaden består av är:

  1. Importance
  2. Specificity
  3. Source order

Vi går igenom dem i omvänd ordning.

Source order

När allt annat är lika är det ordningen i källkoden som gäller. En regel som står längre ner i en css-fil är viktigare. Detsamma gäller ordningen som css-filer länkats in i. Även där anses en fil som länkats in senare vara viktigare.

Använder du en återställnings-CSS likt [Normalize.css], [minireset.css] eller [Reboot] är det viktigt att den länkas in först. Annars riskerar du att återställa dina egna regler!

Specificity

Med specificity menas den vikt som en CSS-regel får baserat på antalet selektortyper i den matchande selektorn.

Typ av selektor Beskrivning
1 typ Väljer element utifrån namn, till exempel h1 eller nav. Även pseudo-element (exempelvis::before) tillhör denna kategori.
2 klass Väljer element utifrån innehållet i class-attributet, till exempel .exempel. Här hör även attribut-selektorer (exempelvis [type="radio"]) och pseudoklasser (exempelvis :hover) hemma.
3 ID Väljer element utifrån id-attributet, till exempel #start.

Om två regler skulle få samma specificity används source order för att välja.

Stilmallar som läggs till direkt i HTML-taggen (som <span style="color: purple;">) ersätter alltid alla externa stilmallar. Det är en god anledning att försöka lösa problemet på något annat vis.

På [Specifishity] finns en illustration över hur det fungerar.

Importance

Med importance menas den process som används när CSS-regler från flera källor ska kombineras.

User-agent stylesheet
Varje webbläsare har en grundläggande stilmall inbyggd. En del webbläsare använder CSS-filer medans andra har den inbyggd i programkoden.

Standarden har vissa begränsningar för hur denna stilmall får se ut men det finns stora möjligheter för utvecklarna av webbläsaren att välja utformning. Eftersom webbläsarna har lite olika standardutseende är det vanligt att använda någon form av CSS-återställare (exempelvis [Normalize.css], [minireset.css] eller [Reboot]).

Author stylesheet
Den typ av stilmall som man vanligtvis tänker på. Dessa stilmallar bestämmer design och utseende för webbsidan och skapas av webbsidans skapare. Det vanligaste är externa stilmallar som länkas till HTML-filen men det kan även vara CSS skriven i <style>-taggen eller med style-attributet.

User stylesheet
Användaren kan i vissa webbläsare göra egna stilmallar och anpassa presentationen utifrån sina egna förutsättningar.

Ordning

Webbläsaren samlar ihop alla regler från olika källor. Sedan filtrerar den ut de regler som hör till ett visst element.

Sen sorteras reglerna utifrån om de åtföljs av ett !importance och deras ursprung. Sorteringen görs enligt tabellen nedan. Regler med !important är viktigare än de utan.

Origin Importance
1 user agent normal
2 user normal
3 author normal
4 animations
5 author !important
6 user !important
7 user agent !important
8 transitions

Om flera regler får samma importance används specificity för att avgöra vilken som ska väljas.

Innan du använder !important

När !important används ersätter den alla andra regler. Att använda !important anses vara dålig stil! Eftersom det blir mycket svårare att felsöka bör !important undvikas in i det längsta!

  • Försök alltid använda specificity innan du ens tänker på !important.
  • Använd endast !important för CSS specifik för den aktuella sidan och som behöver ersätta CSS från främmande källor (exempelvis Normalize.css eller Bootstrap)
  • Använd aldrig !important om du skriver CSS som andra förväntas använd!
  • Använd aldrig !important för CSS som gäller för hela din sajt!