Webbutveckling 1 · område 3 · guide
CSS – form, layout och designsystem
Områdets uppslagsbok. Allt från lektion 22 till 26 står här, i den ordning det gås igenom. Var du borta en lektion är det hit du går, och slår du i den under ett arbetspass hittar du rätt genom innehållsförteckningen eller sökrutan i felsökningen.
Exemplen är hämtade ur områdets förlaga – den stilsatta versionen av Vikstads naturreservat, samma sajt som du såg ostilad i område 2. Kraven guiden stödjer står i Projekt 2.
Vad du kan efter guiden
- Koppla en extern stilmall till en sajt och skriva regler som gör det du tänkt.
- Välja selektor efter vad du vill träffa, och veta vilken som vinner när två krockar.
- Räkna ut varför en regel slår en annan, i stället för att skriva
!important. - Förklara varför ett element blir bredare än du sagt, och laga det.
- Bygga en navigering med Flexbox som radbryter av sig själv.
- Bygga ett rutnät med Grid som väljer antal kolumner själv.
- Samla färg, typografi och avstånd i variabler, och byta hela sajtens utseende på ett ställe.
- Öppna DevTools och se vilken regel som faktiskt gäller.
Avsnitt 1–4 hör till tisdag 6/10, avsnitt 5–7 till fredag 9/10, avsnitt 8 till måndag 12/10, avsnitt 9 till tisdag 13/10 och avsnitt 10 till fredag 16/10.
1. Stilmallen och syntaxen
Extern stilmall
CSS skrivs i en egen fil och kopplas in i head på varje sida:
<link rel="stylesheet" href="stil.css">
En fil, alla sidor. Ändrar du en färg där byts den på hela sajten. Det är hela
poängen med extern CSS, och det är därför style-attribut i HTML är
förbjudna i uppgiften – de går inte att återanvända och är nästan omöjliga att
skriva över.
Raden ska ligga i head. Ligger den i body fungerar den
ofta ändå, men sidan visas då först ostilad och hoppar till när stilen kommer.
En regel
h1 {
font-size: 2rem;
color: #1e4b3f;
}
| Del | Vad det är |
|---|---|
h1 | Selektorn – vad regeln träffar |
{ } | Deklarationsblocket |
font-size | En egenskap |
2rem | Egenskapens värde |
; | Avslutar deklarationen |
Glömmer du ett slutar nästa rad att fungera – och felet syns på raden efter den trasiga, inte på den trasiga. Det är den vanligaste tidstjuven i hela området.
Kommentarer skrivs så här, och CSS har bara den här sorten –
// fungerar inte:
/* Sidhuvudet och menyn */
Ordningen i filen
Skriv från allmänt till särskilt: variabler, grunder, layout, komponenter, detaljer. Det är samma ordning som kaskaden läser filen i, och det gör att senare regler kan bygga på tidigare i stället för att slåss med dem.
Skapa stil.css, koppla in den i head på alla dina
sidor och skriv en enda regel: body { background: #fbfaf6; }. Ladda
om varje sida och kontrollera att bakgrunden ändrats på alla fyra. Gör den inte
det saknas link-raden på någon av dem.
2. Selektorer
p { } /* alla p-element */
.ingress { } /* alla element med class="ingress" */
#faglar { } /* elementet med id="faglar" */
Element-selektorn träffar allt, vilket är bra för grunder och dåligt för
detaljer. Id-selektorn träffar exakt ett element och är så specifik att den blir
svår att skriva över – därför är den förbjuden för formgivning i Projekt 2.
Ett id är till för ankarlänkar och för label for, inte
för färg.
Kombinationer
.kortrutnat article { } /* article någonstans inuti .kortrutnat */
body > header { } /* header som är direkt barn till body */
input + label { } /* label som står direkt efter en input */
h1, h2, h3 { } /* alla tre – komma grupperar */
Mellanslag betyder någonstans inuti, > betyder direkt
barn. Skillnaden spelar roll när något är nästlat i flera lager.
Attributselektorn
.huvudmeny a[aria-current="page"] {
color: var(--accent-djup);
}
Den här träffar länken till sidan man står på. Attributet finns redan i HTML:en och betyder redan "du är här" – då behöver vi ingen klass som säger samma sak en gång till. Låt formen följa innebörden.
input[type="checkbox"] { width: auto; }
Samma sak för fälttyper: en kryssruta ska inte vara 22 rem bred som ett textfält.
Pseudoklasser
En pseudoklass beskriver ett tillstånd eller en position, inte ett element.
| Pseudoklass | Träffar |
|---|---|
:hover | Elementet muspekaren är över |
:focus-visible | Elementet som har tangentbordsfokus |
:first-child, :last-child | Första respektive sista barnet |
:nth-child(even) | Varannat barn |
:visited | Besökt länk |
tbody tr:nth-child(even) {
background: var(--yta);
}
Varannan tabellrad tonad, utan att en enda rad behöver märkas i HTML:en. Det är pseudoklassernas styrka: de väljer utifrån hur sidan ser ut, inte utifrån vad du hunnit skriva klasser på.
Ge navigationen på din sajt en klass och formge den. Lägg sedan till en regel med
:hover och en med :focus-visible. Tabba dig fram till
länkarna med Tab och se att markeringen syns.
3. Kaskaden, specificitet och arv
Två regler säger olika saker om samma element. Vilken vinner? Webbläsaren ställer tre frågor, i den här ordningen.
Fråga 1: gäller regeln alls?
Träffar selektorn elementet? Gör den inte det spelar resten ingen roll. Det låter självklart, och det är ändå det vanligaste felet: regeln fungerar inte för att selektorn träffar något annat än du tror.
Fråga 2: vilken är mest specifik?
Specificitet räknas som tre siffror: id, klass, element.
| Selektor | id | klass | element | Läses som |
|---|---|---|---|---|
p | 0 | 0 | 1 | 0-0-1 |
.ingress | 0 | 1 | 0 | 0-1-0 |
.kortrutnat p | 0 | 1 | 1 | 0-1-1 |
a[aria-current="page"] | 0 | 1 | 1 | 0-1-1 |
#faglar | 1 | 0 | 0 | 1-0-0 |
Jämför siffra för siffra från vänster. En enda klass slår hur många element som helst: 0-1-0 är större än 0-0-9.
Ett riktigt exempel ur förlagan. Först sätts ett läsmått på all brödtext:
p, li, dd {
max-width: var(--las);
}
Sedan tas det bort inuti korten, där kortet redan bestämmer bredden:
.kortrutnat p {
max-width: none;
}
Den andra regeln vinner med 0-1-1 mot 0-0-1. Inte för att den står sist, utan för att den är mer specifik.
Fråga 3: vilken står sist?
Är specificiteten lika vinner den som står längst ned i filen. Därför spelar ordningen i stilmallen roll, och därför skriver man allmänt först och särskilt sist.
Arv
Vissa egenskaper ärvs nedåt i dokumentet, andra inte.
| Ärvs | Ärvs inte |
|---|---|
color, font-family, font-size, line-height, text-align | margin, padding, border, background, width, display |
Tumregeln: det som handlar om text ärvs, det som handlar om lådan gör det
inte. Därför räcker det att sätta typsnittet en gång på body. Och
därför måste du sätta background på varje element som ska ha en – den
droppar inte ner av sig själv.
font: inherit på formulärfält är ett undantag värt att kunna: fält
ärver inte typsnittet automatiskt, så utan den raden ser ditt formulär ut som
1998.
!important går förbi hela specificitetsräkningen. Det löser
problemet en gång och gör nästa problem svårare, eftersom det enda som slår ett
!important är ett till.
Behöver du det betyder det nästan alltid att någon selektor längre upp är för
specifik. Sänk den i stället. I Projekt 2 ligger "inga !important" på
utmaningsnivå.
Skriv två regler som träffar samma element – en med elementselektor och en med klass – och ge dem olika färg. Gissa vilken som vinner innan du laddar om. Byt sedan ordning på dem och gissa igen.
4. Felsökning i DevTools
Att gissa varför en regel inte fungerar är slöseri. Webbläsaren kan visa dig svaret.
Öppna: F12, eller högerklicka på elementet och välj Inspektera.
Elements och Styles
Till vänster ser du HTML:en, till höger alla regler som träffar det markerade elementet, i ordning: mest specifik överst. Tre saker att titta efter:
- Överstruken text betyder att deklarationen är överskriven av något annat. Det som står kvar oöverstruket är det som gäller.
- Filnamn och radnummer till höger om varje regel visar var i din stilmall den står.
- Fliken Computed visar slutresultatet: vad elementet faktiskt fick, oavsett hur många regler som slogs om det.
Ändra live
Du kan klicka i värdena och skriva nya. Sidan uppdateras direkt, ingenting sparas. Det är det snabbaste sättet att prova sig fram till ett värde – och sedan skriver du in det i din riktiga stilmall.
Bocka i och ur kryssrutan bredvid en deklaration för att stänga av den. Det svarar på frågan "vad gör den här raden egentligen?" på en sekund.
Längst ned i Styles ligger en figur med lådans fyra lager och måtten i. Den svarar på "varför är det här elementet 340 pixlar brett när jag sa 300?" utan att du behöver räkna själv.
Inspektera en länk i din navigation. Hitta regeln som ger den sin färg, och läs
vilken rad i stil.css den kommer från. Stäng av deklarationen med
kryssrutan och se vad som händer.
5. Boxmodellen
Varje element är en låda med fyra lager, inifrån och ut:
+-----------------------------------+
| margin |
| +-----------------------------+ |
| | border | |
| | +-----------------------+ | |
| | | padding | | |
| | | +-----------------+ | | |
| | | | content | | | |
| | | +-----------------+ | | |
| | +-----------------------+ | |
| +-----------------------------+ |
+-----------------------------------+
- content – texten eller bilden.
- padding – luft innanför kanten. Har elementets bakgrundsfärg.
- border – kanten.
- margin – luft utanför. Är alltid genomskinlig.
Padding eller margin? Ska luften ha bakgrundsfärgen är det padding. Ska den skilja elementet från grannen är det margin.
border-box
Det här är områdets viktigaste enskilda rad:
*,
*::before,
*::after {
box-sizing: border-box;
}
Utan den betyder width: 300px att innehållet blir 300 pixlar,
och padding och border läggs ovanpå. Ett element med width: 300px,
padding: 20px och border: 1px blir då 342 pixlar brett.
Med border-box betyder 300 pixlar 300 pixlar. Sätt raden överst i
varje stilmall du skriver, resten av livet.
Kortform
margin: 1rem; /* alla fyra sidor */
margin: 1rem 2rem; /* uppe/nere höger/vänster */
margin: 1rem 2rem 3rem; /* uppe höger/vänster nere */
margin: 1rem 2rem 3rem 4rem; /* uppe höger nere vänster – medurs */
Två lodräta marginaler som möts slås ihop till en – den största vinner, de
adderas inte. Har ett stycke margin-bottom: 2rem och nästa
margin-top: 1rem blir avståndet 2rem, inte 3rem.
Det gäller bara lodrätt, och inte inuti flex- eller grid-behållare. Det är ett av
skälen att gap är trevligare än marginaler så fort du har en
layout.
Ge ett element width: 300px, padding: 20px och en
synlig border. Mät det i DevTools. Ta sedan bort
box-sizing-regeln, ladda om och mät igen.
6. Färg
color: darkgreen; /* namn – 147 stycken finns */
color: #2f6f5e; /* hex – två tecken per kanal */
color: rgb(47 111 94); /* rött, grönt, blått 0–255 */
color: hsl(164 40% 31%); /* nyans, mättnad, ljushet */
Hex är vanligast och det du kommer att se överallt. #2f6f5e är
2f rött, 6f grönt, 5e blått. Korta formen
#fff betyder #ffffff.
HSL är det enda av de fyra som går att räkna i huvudet. Samma nyans och
mättnad med olika ljushet ger en färgskala som hänger ihop –
hsl(164 40% 31%) och hsl(164 40% 45%) är samma färg,
ljusare. Det är ett bra sätt att bygga en palett.
box-shadow: 0 1px 3px rgb(31 36 32 / 8%);
Det fjärde värdet efter snedstrecket är alfa: 0 % är osynligt, 100 % är helt täckande.
Färg som ser fin ut på din skärm kan vara oläslig på en annan. Kontrasten mellan text och bakgrund mäts som ett förhållande, och riktvärdet är 4,5:1 för brödtext. DevTools visar värdet när du inspekterar en färgruta.
Vanligaste missen: grå text på vit bakgrund som ser stilren ut och hamnar på 3:1.
Välj tre färger till din sajt: en bakgrund, en textfärg och en accentfärg. Kontrollera kontrasten mellan text och bakgrund i DevTools. Ligger den under 4,5 – mörka texten.
7. Typografi och enheter
font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
En stack är en lista över typsnitt i fallande ordning. Webbläsaren tar det
första som finns på användarens dator. Sista värdet ska alltid vara en generisk
familj – sans-serif, serif eller monospace –
så att det finns något kvar att falla tillbaka på. Namn med mellanslag i skrivs inom
citattecken.
px, rem och em
| Enhet | Betyder | Använd till |
|---|---|---|
px | Absoluta pixlar | Kanter och sådant som verkligen ska vara fast |
rem | Gånger sidans grundstorlek | Typografi och avstånd |
em | Gånger elementets egen storlek | Sällan. Ihopväxande vid nästling |
% | Andel av föräldern | Bredder |
Varför rem och inte px? En användare som ställt in
större text i webbläsaren får den större om du använder rem. Med
px händer ingenting – du har låst storleken över huvudet på någon som
behöver den. 1rem är normalt 16 pixlar.
em växer ihop: ett element med font-size: 1.2em inuti ett
annat med 1.2em blir 1,44 gånger. Det är sällan det du vill.
line-height utan enhet
line-height: 1.6;
Skriv den utan enhet. Då betyder den 1,6 gånger elementets egen textstorlek,
och den ärvs som faktor i stället för som fast värde. Med
line-height: 24px får rubriken samma radavstånd som brödtexten, vilket
ser fel ut. Riktvärde: 1,5–1,7 för brödtext, tätare för rubriker.
Text blir också svårläst i långa rader. Runt 60–75 tecken är lagom:
p, li, dd {
max-width: 34rem;
}
clamp
font-size: clamp(1.9rem, 1.2rem + 2.4vw, 2.8rem);
Tre värden: minsta, önskade, största. Rubriken växer med fönstret men aldrig under 1,9rem och aldrig över 2,8rem. Det är ett sätt att få något att skala utan en enda media query.
Sätt font-family, font-size och
line-height på body. Ändra sedan
font-size på html till 20px och ladda om –
allt som är satt i rem ska följa med.
8. Flexbox
Flexbox lägger element i en rad eller en kolumn och fördelar utrymmet mellan dem. Använd den när sakerna hör ihop i en riktning: en meny, en knapprad, ett kort med bild och text bredvid varandra.
.huvudmeny ul {
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1.5rem;
list-style: none;
margin: 0;
padding: 0;
}
Det är hela navigationen i förlagan. display: flex på
behållaren – barnen behöver ingenting.
| Egenskap | Vad den gör | Vanliga värden |
|---|---|---|
flex-direction | Åt vilket håll | row (förval), column |
justify-content | Fördelning längs riktningen | flex-start, center, space-between |
align-items | Placering tvärs riktningen | stretch (förval), center, flex-start |
flex-wrap | Får radbryta? | nowrap (förval), wrap |
gap | Avstånd mellan barnen | Vilket mått som helst |
Det som förvirrar: justify-content och align-items byter
håll när du sätter flex-direction: column. De följer riktningen, inte
skärmen.
Utan flex-wrap: wrap pressas barnen ihop tills de blir oläsliga när
fönstret smalnar. Med den radbryter de av sig själva. Det är så menyn i förlagan
klarar en telefonskärm utan en enda media query, och det är precis vad området
handlar om.
gap sätter avstånd mellan barnen, inte utanför det första och
sista. Det är nästan alltid det du vill, och det är ett bör-krav i Projekt 2.
På barnen behöver du bara en enda egenskap i det här projektet:
.sok input { flex: 1; }
flex: 1 betyder "ta det som blir över". Sätter du det på ett barn av
tre växer just det och de andra behåller sin storlek.
| Symptom | Orsak |
|---|---|
| Barnen ligger under varandra | flex-direction: column står kvar |
| Inget radbryter | flex-wrap saknas |
gap gör ingenting | Elementet är inte display: flex |
| Punkterna syns kvar i menyn | list-style: none saknas på ul |
| Menyn ligger inte till vänster | padding på ul – nollställ den |
Gör din navigation till en flex-behållare med wrap och
gap. Smalna fönstret tills menyn radbryter. Sätt sedan
flex-direction: column och se vad som händer med
justify-content.
9. Grid
Grid lägger element i rader och kolumner samtidigt. Använd den när du har ett rutnät eller en sidlayout – alltså när sakerna ska ligga i linje åt två håll.
.kortrutnat {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
gap: 1.5rem;
}
Tre rader, och det är hela kortrutnätet i förlagan.
fr-enheten
fr är en andel av det som blir över.
grid-template-columns: 1fr 1fr 1fr; /* tre lika breda */
grid-template-columns: 2fr 1fr; /* dubbelt så bred som den andra */
grid-template-columns: 200px 1fr; /* en fast, en som tar resten */
auto-fit och minmax
grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
Läs den inifrån och ut:
minmax(16rem, 1fr)– varje kolumn är minst 16rem och högst sin andel av resten.repeat(auto-fit, ...)– lägg in så många sådana kolumner som får plats.
Resultatet är ett rutnät som väljer antal kolumner själv: tre på en laptop, en på en telefon, utan att du skrivit en enda media query. Det här är områdets enskilt mest användbara rad.
Placera ett barn över alla kolumner
.kortrutnat > h2 {
grid-column: 1 / -1;
}
1 / -1 betyder från första linjen till den sista. Rubriken i
fågelavsnittet är ett barn till rutnätet precis som artiklarna, och den här raden
låter den sträcka sig över hela bredden – i stället för att vi lindar artiklarna i
en div som inte betyder något.
Namngivna områden
body {
display: grid;
grid-template-areas:
"topp"
"innehall"
"fot";
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
body > header { grid-area: topp; }
body > main { grid-area: innehall; }
body > footer { grid-area: fot; }
Så är sidans skelett byggt i förlagan. grid-template-areas ritar
layouten i text – du ser den i koden. auto 1fr auto gör att toppen och
foten tar den plats de behöver och innehållet resten, så att sidfoten hamnar längst
ned även på en kort sida. Namngivna områden ligger på utmaningsnivå i Projekt 2.
Ett grid-item har min-width: auto – "bli aldrig smalare än ditt
innehåll". Ligger en bred tabell i ett spår växer spåret i stället för att hålla
emot, och hela sidan börjar scrolla i sidled.
grid-template-columns: minmax(0, 1fr);
minmax(0, ...) säger att spåret får bli hur smalt som helst. Då är det
innehållet som måste hantera trängseln – till exempel genom att scrolla i sin egen
ruta:
.tabellsvep {
overflow-x: auto;
}
Det här är den enda div som lagts till i hela förlagan, och den är
motiverad: ingen befintlig struktur kunde bära scrollningen.
Grid eller Flexbox?
| Situation | Välj |
|---|---|
| En rad länkar som ska radbryta | Flexbox |
| Ett kortgalleri | Grid med auto-fit |
| Sidans skelett | Grid med grid-template-areas |
| Ikon och text bredvid varandra | Flexbox |
| Något ska ligga i linje åt två håll | Grid |
Tumregeln: en riktning är Flexbox, två riktningar är Grid. Går det med båda, ta den som ger minst kod.
Gör ett avsnitt på din sajt till ett rutnät med
repeat(auto-fit, minmax(16rem, 1fr)). Dra i fönstret och räkna
kolumnerna. Lägg sedan grid-column: 1 / -1 på avsnittets rubrik.
10. CSS-variabler och designsystem
:root {
--accent: #2f6f5e;
}
a {
color: var(--accent);
}
Namnet börjar med två bindestreck. :root är dokumentets rot –
variabler du lägger där gäller på hela sidan, eftersom de ärvs nedåt precis som
color. var(--accent) hämtar värdet, och
var(--accent, green) ger ett reservvärde om variabeln saknas.
Vad ett designsystem är
De återkommande värdena, samlade på ett ställe och namngivna efter vad de är till för. Tre skalor räcker för ett projekt av den här storleken:
:root {
/* Färg */
--bakgrund: #fbfaf6;
--yta: #ffffff;
--text: #1f2420;
--dov: #5c665e;
--accent: #2f6f5e;
--accent-djup: #1e4b3f;
--linje: #dcdcd2;
/* Typografisk skala – varje steg ungefär 1,25 gånger det förra */
--text-liten: 0.875rem;
--text-bas: 1rem;
--text-mellan: 1.25rem;
--text-stor: 1.5rem;
/* Avståndsskala – fem steg räcker för hela sajten */
--rum-1: 0.5rem;
--rum-2: 1rem;
--rum-3: 1.5rem;
--rum-4: 2.5rem;
--rum-5: 4rem;
}
Poängen med en skala är att du slutar hitta på värden. Behöver du luft väljer du
--rum-2 eller --rum-3, inte 13px för att det
såg lagom ut. Sajten blir jämn på ett sätt som är svårt att peka på men lätt att
se.
--accent går att byta till blått. --gron gör det inte –
namnet ljuger så fort du byter. Variabelnamn som säger vad värdet är till
för överlever en ommålning, och det är skillnaden mellan ska- och bör-nivå i
matrisen.
Mörkt läge
@media (prefers-color-scheme: dark) {
:root {
--bakgrund: #141815;
--yta: #1c221e;
--text: #e8ede9;
--accent: #7fc9b2;
}
}
Ligger allt i variabler byter du bara värdena. Ingen enda regel längre ned i filen behöver skrivas om – de hämtar redan sin färg härifrån. Det är det bästa beviset på att ett designsystem sitter ihop, och det ligger på utmaningsnivå i Projekt 2.
En sak att tänka på: en färg som fungerar mot en ljus bakgrund kan bli oläslig mot en mörk. Knappen i förlagan har därför en egen variabel för sin textfärg, som vänds i mörkt läge.
Så refaktorerar du
Har du redan skrivit stilmallen med hårdkodade värden gör du så här, i den ordningen:
- Sök efter en färg du använt på flera ställen.
- Lägg den på
:rootmed ett namn som säger vad den är till för. - Byt ut alla förekomster mot
var(--namnet). - Ladda om. Ser sidan likadan ut har du gjort rätt.
- Ta nästa färg.
Gör en färg i taget och ladda om mellan varje. Byter du tjugo värden på en gång och något går sönder vet du inte vilket.
Lägg de tre färgerna du valde i avsnitt 6 på :root och byt ut dem i
din stilmall. Ändra sedan --accent till något helt annat och ladda om
– allt som använder accenten ska byta på en gång.
11. Ta det längre
För dig som har ska-kraven på plats och siktar mot C eller A.
- Hela systemet i variabler. Inte bara färg: avståndsskala, hörnradie, skugga och typografisk skala. Då går hela sajtens utseende att ändra på ett ställe.
grid-template-areasför sidlayouten. Layouten ritad i text, läsbar i koden.- Mörkt läge som byter enbart värden. Måttstocken: behöver du skriva om en
enda regel utanför
:rootsitter systemet inte ihop än. :focus-visibleskilt från:hover. Musanvändaren behöver ingen ram runt länken hen just klickade på. Tangentbordsanvändaren behöver den.- Låg specificitet. Inga
!important, inga selektorer längre än två steg. Målet är att nästa regel du skriver ska gå att skriva utan att slåss. clamp()för det som ska skala. Rubriker och innehållsbredd som växer med fönstret, utan media queries.- Läsbar filstruktur. Numrerade avsnitt med en kommentar överst i varje, i en ordning som går från allmänt till särskilt.
Det är att systemet hänger ihop och att du kan säga varför varje regel ser ut som den gör.
12. Felsökning
27 rader
| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
| Stilmallen gör ingenting alls | link-raden ligger i body, eller filnamnet stämmer inte | Raden hör hemma i head. Jämför filnamnet tecken för tecken |
| Stilen fungerar på startsidan men inte på de andra | link-raden saknas där | Varje sida behöver sin egen rad |
| En regel fungerar, nästa gör det inte | Semikolon saknas efter värdet innan | Semikolon efter varje deklaration. Felet syns på raden efter |
| Allt efter en viss punkt slutar gälla | En klammer är ostängd | Räkna klamrarna |
| Min ändring syns inte | Webbläsaren visar en sparad version | Ladda om med Ctrl + F5 |
| Regeln syns överstruken i DevTools | En annan regel vinner | Läs vilken. Sänk dess specificitet eller höj din |
| Färgen slår inte igenom | En id-selektor eller !important vinner | Id slår klass. Byt id-selektorn mot en klass |
| Elementet blir bredare än jag satt | padding och border läggs på bredden | box-sizing: border-box |
| Avståndet blir mindre än summan | Marginalkollaps – två lodräta marginaler blir en | Använd gap eller padding i stället |
| Bakgrundsfärgen syns inte på barnen | background ärvs inte | Sätt den på det element som ska ha den |
| Formuläret har fel typsnitt | Fält ärver inte font-family | font: inherit på input, select, textarea |
| Rubriken har samma radavstånd som brödtexten | line-height satt med enhet | Skriv den utan: line-height: 1.6 |
| Texten skalar inte när jag zoomar | Storlekarna är satta i px | rem för typografi |
| Flex-barnen ligger under varandra | flex-direction: column | Förvalet är row |
| Flexbox radbryter inte | flex-wrap saknas | flex-wrap: wrap |
gap gör ingenting | Elementet är varken flex eller grid | gap gäller bara där |
| Punkterna syns kvar i menyn | list-style inte nollställd | list-style: none på ul |
| Menyn börjar en bit in | ul har standard-padding | padding: 0 |
| Grid-kolumnerna blir olika breda | fr blandat med fasta värden | 1fr är en andel av det som blir över, inte en bredd |
| Rutnätet skalar inte | Fasta kolumnvärden | repeat(auto-fit, minmax(16rem, 1fr)) |
| Hela sidan scrollar i sidled | Ett grid-item vägrar krympa, ofta en tabell | minmax(0, 1fr) på spåret, overflow-x: auto på innehållet |
| Bilden spränger sin spalt | Ingen maxbredd | img { max-width: 100%; height: auto; } |
| Variabeln gör ingenting | Definierad i fel block, eller stavad olika | Definiera på :root, använd med var(--namn) |
var(--namn) syns som text | Bindestrecken saknas i definitionen | Två bindestreck: --namn |
| Fokusmarkeringen är borta | outline: none utan ersättning | Sätt något annat, eller använd :focus-visible |
| Knappen är oläslig i mörkt läge | Textfärgen är hårdkodad vit | Egen variabel för knapptext, vänd den i mörkt läge |
| CSS-validatorn klagar på något jag inte skrivit | Den läser hela filen | Läs radnumret – validatorn pekar rätt |
13. Snabbreferens
| Egenskap | Gör | Avsnitt |
|---|---|---|
box-sizing | Räknar padding och border inåt | 5 |
margin, padding, border | Lådans lager | 5 |
color, background | Textfärg, bakgrund | 6 |
font-family | Typsnittsstack | 7 |
font-size | Textstorlek. rem | 7 |
line-height | Radavstånd, utan enhet | 7 |
max-width | Största bredd. Läsmått och bilder | 7 |
clamp() | Minsta, önskade, största | 7 |
display: flex | En riktning | 8 |
flex-direction | row eller column | 8 |
justify-content | Fördelning längs riktningen | 8 |
align-items | Placering tvärs riktningen | 8 |
flex-wrap | Låt barnen radbryta | 8 |
gap | Avstånd mellan barnen | 8, 9 |
flex: 1 | Barnet tar det som blir över | 8 |
display: grid | Två riktningar | 9 |
grid-template-columns | Kolumnernas mått | 9 |
fr | Andel av det som blir över | 9 |
repeat(auto-fit, minmax(a, b)) | Rutnät som väljer antal kolumner själv | 9 |
grid-template-areas | Layouten ritad i text | 9 |
grid-column: 1 / -1 | Sträck över alla kolumner | 9 |
minmax(0, 1fr) | Spår som får krympa | 9 |
overflow-x: auto | Scrolla i sidled inuti elementet | 9 |
--namn / var(--namn) | Egen egenskap och uppslag | 10 |
:root | Dokumentets rot. Här bor variablerna | 10 |
:hover, :focus-visible | Muspekare respektive tangentbordsfokus | 2 |
:nth-child(even) | Varannat barn | 2 |
[attribut="värde"] | Attributselektor | 2 |
@media (prefers-color-scheme: dark) | Användarens val av mörkt läge | 10 |
14. Ordlista
Klicka på en rad för att visa betydelsen, eller träna på orden med knapparna nedan.
Ordträning
| Ord | Betyder |
|---|---|
| regel | Selektor plus deklarationsblock |
| selektor | Det som säger vad regeln träffar |
| deklaration | Ett par av egenskap och värde |
| kaskaden | Ordningen webbläsaren avgör krockar i |
| specificitet | Hur exakt en selektor är, räknad som id-klass-element |
| arv | Att textegenskaper faller nedåt i dokumentet |
| pseudoklass | Väljer på tillstånd eller position, som :hover |
| boxmodellen | Content, padding, border, margin |
| border-box | Att bredden räknar in padding och border |
| marginalkollaps | Två lodräta marginaler som blir en |
| typsnittsstack | Lista av typsnitt i fallande ordning |
| rem | Gånger sidans grundstorlek |
| flexbox | Layout i en riktning |
| grid | Layout i två riktningar |
| fr | Andel av det utrymme som blir över |
| gap | Avstånd mellan barnen i flex eller grid |
| egen egenskap | CSS-variabel, skriven --namn |
| token | Ett namngivet värde i ett designsystem |
| designsystem | De återkommande värdena, samlade och namngivna |