Webbutveckling · område 3
Guide – CSS: form och layout
Här står allt som prov 2 kan fråga om, och allt du behöver för Projekt 2. Guiden fungerar utan att du varit på lektionen.
Exemplen är hämtade ur referensprojektet Fyrar längs Bohuskusten – samma sajt
som i område 2, nu stilsatt. Öppna stil.css i den mappen bredvid guiden:
den är indelad i tio numrerade avsnitt och kommenterad.
Vad du kan efter guiden
- Koppla en extern stilmall och förstå varför den ska vara extern
- Välja rätt selektor, och räkna ut vilken regel som vinner när två krockar
- Räkna ut ett elements faktiska bredd, och veta varför
border-boxgör det enkelt - Skriva färg på tre sätt och veta när
hslär enklast att arbeta med - Sätta typografi som följer besökarens egen textstorlek
- Lägga stilguidens värden som variabler så att en ändring räcker
- Bygga en rad med flexbox och ett rutnät med grid, och veta vilket som passar var
- Ge en komponent alla dess tillstånd, inte bara viloläget
- Läsa av mått ur en mockup i stället för att gissa
1. Stilmallen och hur den kopplas
CSS står för Cascading Style Sheets. HTML säger vad något är, CSS säger hur det ska se ut. Att de är åtskilda är hela poängen: samma markering kan se ut hur som helst, och en sida utan CSS ska fortfarande gå att läsa.
link-elementet
Stilmallen är en egen fil, och den kopplas i head på varje sida:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fyrar längs Bohuskusten</title>
<link rel="stylesheet" href="stil.css">
</head>
rel="stylesheet" säger vad filen är, href var den ligger.
Sökvägen är relativ, precis som i område 2.
Tre sätt att skriva CSS, varav ett är rätt
| Var | Hur det ser ut | När |
|---|---|---|
| Extern fil | <link rel="stylesheet"> |
Alltid. En fil, alla sidor |
| Inbäddad | <style> i head |
Aldrig i den här kursen |
| Inline | style="color: red" på elementet |
Aldrig i den här kursen |
Skälet till att den externa filen vinner: en ändring på ett ställe når alla sidor. Har du färgen inskriven på tjugo element ska den ändras tjugo gånger, och du kommer att missa ett. Inline-stilar är dessutom nästan omöjliga att skriva över – mer om det i avsnitt 3.
Syntaxen
h1 {
font-size: 2.25rem;
color: #1c2733;
}
- Selektorn står först:
h1. Den bestämmer vilka element regeln träffar. - Deklarationerna står inom klamrarna: egenskap, kolon, värde, semikolon.
- Semikolon efter varje deklaration. Glömmer du ett slutar resten av regeln fungera.
Kommentarer skrivs /* så här */. CSS har ingen radkommentar –
// fungerar inte.
Koppla en tom stil.css till alla dina sidor och skriv en enda regel:
body { background: hotpink; }. Öppna varje sida. Blir någon inte rosa är
sökvägen fel på just den sidan, och det är bättre att veta nu än i november.
2. Selektorer
Selektorn avgör vilka element regeln träffar. Fyra sorter räcker långt.
Elementselektor
p { margin: 0 0 1rem; }
Alla stycken på hela sajten. Bra för grundvärden, trubbig när du vill åt något särskilt.
Klasselektor
Punkt före namnet. Träffar alla element med den klassen:
.tillbaka { font-size: 0.9rem; }
<a href="#toppen" class="tillbaka">Tillbaka till toppen</a>
Klassen är den selektor du ska använda mest. Den går att sätta på flera element,
på olika sorters element, och att återanvända på nästa sida. Ett element kan ha flera
klasser, åtskilda med mellanslag: class="knapp knapp-stor".
Id-selektor
#toppen { font-size: 1.15rem; }
Ett id är unikt per sida, så regeln går aldrig att återanvända, och den
är obehagligt svår att skriva över. Id hör hemma som mål för ankarlänkar och som
koppling mellan label och fält – det du lärde dig i område 2.
Pseudoklasser
Ett kolon och ett tillstånd. Träffar elementet när något gäller:
a:hover { text-decoration-thickness: 2px; }
| Pseudoklass | Gäller när |
|---|---|
:hover | Muspekaren är över elementet |
:focus-visible | Elementet har fokus och markeringen behövs, alltså vid tangentbord |
:disabled | Ett formulärfält eller en knapp är avstängd |
:invalid | Ett fält inte uppfyller sina regler |
:first-child, :last-child | Elementet är först respektive sist bland sina syskon |
Selektorer som kombineras
nav a { text-decoration: none; } /* a någonstans inuti nav */
nav > ul { display: flex; } /* ul direkt inuti nav, inte djupare */
h1, h2, h3 { line-height: 1.25; } /* alla tre, samma regel */
Mellanslag betyder inuti. Större-än betyder direkt barn till. Komma
betyder och. Kommat är det som brukar glömmas: h1 h2 betyder en
h2 inuti en h1, vilket aldrig finns.
Öppna referensprojektet och hitta de fyra sorterna i stil.css avsnitt 4.
Byt sedan färg på a-regeln och ladda om. Länkarna i navigeringen ändras
inte – nästa avsnitt förklarar varför.
3. Kaskaden och specificitet
Två regler kan träffa samma element och säga olika saker. Något måste avgöra. Det som avgör är, i ordning:
- Specificitet – hur exakt selektorn är.
- Ordning i filen – står det lika vinner den som kommer sist.
Ordningen är alltså den sista utslagsgivaren, inte den första. Det är den vanligaste missuppfattningen i hela området.
Räkna specificitet
Räkna tre tal: id, klasser, element.
| Selektor | id | klass | element | Läses |
|---|---|---|---|---|
a | 0 | 0 | 1 | 0-0-1 |
nav a | 0 | 0 | 2 | 0-0-2 |
.tillbaka | 0 | 1 | 0 | 0-1-0 |
nav a.tillbaka | 0 | 1 | 2 | 0-1-2 |
#toppen | 1 | 0 | 0 | 1-0-0 |
Jämför från vänster. En enda klass slår hur många element som helst: 0-1-0 vinner över 0-0-9. Och ett id slår alla klasser tillsammans.
Det är därför länkarna i navigeringen inte ändrades i förra avsnittets övning.
nav a är 0-0-2 och a är 0-0-1, så nav a vinner
oavsett vilken som står sist.
Ärvning
| Ärvs | Ärvs inte |
|---|---|
color, font-family, font-size,
line-height |
margin, padding, border |
text-align, letter-spacing |
background, width, height |
Därför räcker det att sätta typsnittet en gång på body – hela sidan får
det. Men marginaler måste sättas där de ska gälla.
Ett undantag som biter: formulärfält ärver inte typsnitt. input,
select, textarea och button får webbläsarens
eget. Lösningen står i avsnitt 10.
!important
Den som skriver !important har oftast ett specificitetsproblem och löser
det med våld. Nästa gång något ska ändras behövs ett !important till.
Sedan ett till. Behöver du den betyder det nästan alltid att du har en id-selektor
eller en inline-stil i vägen – ta bort dem i stället.
Skriv två regler som båda träffar samma stycke, en med en klass och en med två element. Gissa vilken som vinner innan du laddar om. Byt sedan plats på dem i filen och se att det inte gjorde någon skillnad.
4. Boxmodellen
Varje element är en låda, och lådan har fyra lager. Inifrån och ut:
┌─────────────────────────────┐
│ margin │
│ ┌───────────────────────┐ │
│ │ border │ │
│ │ ┌─────────────────┐ │ │
│ │ │ padding │ │ │
│ │ │ ┌───────────┐ │ │ │
│ │ │ │ content │ │ │ │
│ │ │ └───────────┘ │ │ │
│ │ └─────────────────┘ │ │
│ └───────────────────────┘ │
└─────────────────────────────┘
| Lager | Vad det är |
|---|---|
content | Innehållet självt |
padding | Luft innanför kanten. Bakgrunden når hit |
border | Kanten |
margin | Luft utanför kanten. Bakgrunden når inte hit |
Tumregeln: vill du ha mer luft inuti en ruta med bakgrundsfärg, är det
padding. Vill du ha avstånd mellan två rutor, är det
margin.
box-sizing
*,
*::before,
*::after {
box-sizing: border-box;
}
Utan den räknar width bara innehållet. Ett element med
width: 300px, padding: 20px och border: 1px blir
då 342 px brett – 300 + 20 + 20 + 1 + 1. All layout blir en räkneövning.
Med border-box räknar width in padding och border. 300 px
betyder 300 px.
Det är inget knep – det är bara ett bättre förval än det webben råkade få 1996.
Kortformer
margin: 1rem; /* alla fyra sidor */
margin: 1rem 2rem; /* över/under, höger/vänster */
margin: 1rem 2rem 3rem; /* över, höger/vänster, under */
margin: 1rem 2rem 3rem 4rem; /* över, höger, under, vänster */
Fyra värden går medurs från toppen. Minns du inte ordningen, skriv
margin-top, margin-right och så vidare – det är längre men
aldrig fel.
Marginalkollaps
Två marginaler som möts lodrätt smälter ihop till en, och den större vinner. Har ett stycke 20 px under sig och nästa 30 px över sig blir avståndet 30, inte 50.
Det är inte ett fel, men det överraskar. Enklaste sättet att slippa tänka på det: sätt marginal bara nedåt på löpande text.
p { margin: 0 0 1rem; }
Sätt background: yellow på ett stycke och ge det padding: 1rem
och margin: 1rem. Titta på var det gula slutar. Det är gränsen mellan
padding och margin, och nu ser du den.
5. Färg
Tre skrivsätt, samma färger.
| Skrivsätt | Exempel | Vad talen betyder |
|---|---|---|
| Hex | #17607a | Rött, grönt, blått – två tecken var, 00 till ff |
| rgb | rgb(23 96 122) | Samma tre kanaler, 0 till 255 |
| hsl | hsl(196 68% 28%) | Kulör 0–360, mättnad, ljushet |
Alla tre ger identiskt resultat. Skillnaden är hur lätta de är att ändra.
Varför hsl är värt att kunna
I hex är det omöjligt att se vad som händer om du vill ha samma färg lite mörkare. I hsl sänker du sista talet:
--accent: hsl(196 68% 28%);
--accent-morkare: hsl(196 68% 20%);
--accent-ljus: hsl(196 55% 94%);
Samma kulör, olika ljushet. En hel färgskala ur ett enda tal. Välj ett skrivsätt och håll dig till det – referensprojektet blandar alla tre bara för att visa dem.
Kontrast
Text måste ha tillräcklig kontrast mot sin bakgrund. Kravet i WCAG är 4,5:1 för brödtext och 3:1 för stor text.
Ljusgrå text på vit bakgrund är den vanligaste överträdelsen, och den ser stilren ut på en ny skärm i ett upplyst rum. Den är oläsbar på en telefon i solsken.
Kontrastkraven och hur de mäts hör till Gränssnittsdesign. Här gäller att din CSS ska hålla de värden stilguiden satte – och att du kan kontrollera dem.
Ta din accentfärg och skriv den i alla tre skrivsätten. Gör sedan en ljusare och en mörkare variant genom att bara ändra ljusheten i hsl.
6. Typografi
Typografi avgör om en sida går att läsa. Det är också det billigaste att göra rätt.
Typsnittsstackar
font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
En lista, inte ett typsnitt. Webbläsaren tar det första som finns på besökarens dator.
Sista ledet ska alltid vara en generisk familj – sans-serif,
serif eller monospace – för den finns alltid.
Webbtypsnitt
Stacken ovan använder typsnitt som redan finns på besökarens dator. Vill du ha ett som inte gör det måste det hämtas, och då finns två vägar.
Hämta från en tjänst. Ett link-element i head, före din
egen stilmall:
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inter&display=swap">
Lägg filen i projektet. Du laddar ned typsnittet, lägger det i en mapp och beskriver det själv:
@font-face {
font-family: "Inter";
src: url("typsnitt/inter.woff2") format("woff2");
font-display: swap;
}
Sedan används det som vanligt, och stacken behövs fortfarande:
body { font-family: "Inter", system-ui, sans-serif; }
| Väg | Fördel | Nackdel |
|---|---|---|
| Tjänst | En rad, inget att ladda ned | Sidan blir beroende av någon annans server |
| Egen fil | Fungerar även om tjänsten ligger nere | Du måste hålla ordning på filerna själv |
Tre saker som gäller båda vägarna:
- Kontrollera licensen. Alla typsnitt får inte användas på webben. Det togs upp i Gränssnittsdesignens typografipass.
- Håll nere antalet. Varje vikt och stil är en egen fil som ska hämtas. Två typsnitt i två vikter räcker nästan alltid.
display=swaprespektivefont-display: swapgör att texten visas i ett reservtypsnitt medan det riktiga hämtas, i stället för att sidan står tom. Utan det kan texten vara osynlig i upp till tre sekunder.
Stacken räcker för alla betyg. Behöver din stilguide ett särskilt typsnitt är det här du hämtar det.
Enheter
| Enhet | Räknar mot | Använd till |
|---|---|---|
rem | Rotens teckenstorlek | Teckenstorlek. Alltid |
em | Elementets egen teckenstorlek | Avstånd som ska följa texten |
px | Bildpunkter | Kanter och små radier. Inte text |
% | Elementet omkring | Bredder |
ch | Bredden på tecknet 0 | Radlängd |
Ändrar besökaren sin webbläsares textstorlek – och många gör det – följer
rem med, medan px står still. För den som behöver större text
är det skillnaden mellan en läsbar sajt och en oanvändbar.
line-height utan enhet
body { line-height: 1.6; }
Ingen enhet. Det betyder 1,6 gånger elementets egen teckenstorlek. Skriver du
1.6rem räknas det i stället mot rotens storlek och ärvs som ett fast tal –
rubriker med stor text får då för trånga rader.
Vilka värden du ska ha står i din stilguide. Radavstånd som typografisk fråga hör till Gränssnittsdesign – här handlar det bara om hur du skriver in det. Har guiden inga värden ännu fungerar 1,6 för brödtext och 1,25 för rubriker som platshållare tills den har det.
Radlängd
p { max-width: 68ch; }
ch är bredden på tecknet 0, så 68ch blir
ungefär 68 tecken. Vilken radlängd din sajt ska ha bestämde du i stilguiden –
varför ögat tappar raden när den blir för lång är Gränssnittsdesignens typografipass,
inte det här.
Det som hör hit är att raden ovan är den som genomför beslutet, och att en sida utan den låter brödtexten bli lika bred som fönstret.
Sätt max-width på dina stycken och dra fönstret brett. Läs samma stycke
med och utan begränsningen.
7. Variabler
En variabel är ett värde med ett namn. Ändras värdet ändras det överallt.
:root {
--accent: #17607a;
--steg-2: 1rem;
}
.knapp {
background: var(--accent);
padding: var(--steg-2);
}
- Namnet börjar med två bindestreck. Det är inte ett stavfel, det är syntaxen.
- Värdet hämtas med
var(--namnet). :rootär dokumentets rot, alltsåhtml. Variabler som deklareras där ärvs ned till allt annat.
CSS-variabler heter formellt egna egenskaper, custom properties. Båda namnen används.
Din stilguide kommer att ändras efter att du skrivit CSS:en. Ligger färgen på fyrtio
ställen är en ändring en halvdags arbete och tre missade förekomster. Ligger den i
:root är den en rad.
Namngivning
| Bra | Dåligt | Varför |
|---|---|---|
--accent | --morkbla | Byts färgen till grön blir namnet en lögn |
--text-dov | --gra | Samma sak |
--steg-2 | --sexton-px | Talet kan ändras, rollen består |
En skala för avstånd
:root {
--steg-1: 0.5rem;
--steg-2: 1rem;
--steg-3: 1.5rem;
--steg-4: 2.5rem;
--steg-5: 4rem;
}
Fem värden räcker till en hel sajt. Att avstånden är släkt med varandra är det som gör att sidan ser sammanhållen ut – svårt att uppnå med lösryckta tal som 7, 15 och 23.
Flytta varje hårdkodad färg i din CSS till :root. Byt sedan ut en enda
variabel mot en helt annan färg och ladda om. Ändrades allt som skulle ändras? Om inte
har du hittat det du missade.
8. Flexbox
Flexbox lägger saker på en rad eller i en kolumn, och fördelar utrymmet mellan dem.
nav ul {
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1.5rem;
}
display: flex på behållaren. Barnen blir flexbarn och lägger sig på
rad.
| Egenskap | Gör | Vanliga värden |
|---|---|---|
flex-direction | Åt vilket håll | row (förval), column |
justify-content | Fördelning längs raden | flex-start, center, space-between |
align-items | Placering tvärs raden | stretch (förval), center |
flex-wrap | Får barnen bryta till ny rad | nowrap (förval), wrap |
gap | Avstånd mellan barnen | 1rem, eller rad kolumn |
De två som förväxlas är justify-content och align-items.
Minnesregeln: justify följer riktningen, align går tvärs över. Byter du
flex-direction till column byter de två också håll.
flex-wrap är inte valfritt
Utan den klämmer flexbox ihop barnen tills de inte går att läsa, eller låter dem sticka ut ur sidan. Sätt den på varenda rad som kan innehålla mer än två saker. Navigeringen är det självklara fallet.
gap i stället för marginaler
gap sätter avstånd mellan barnen, inte utanför de yttersta. Med
marginaler får du alltid ett överskott i ena kanten. gap fungerar i både
flexbox och grid.
Gör din navigering till en flexrad med gap. Dra ihop fönstret tills
punkterna inte får plats. Lägg till flex-wrap: wrap och gör om samma
sak.
9. Grid
Grid lägger saker i ett rutnät – rader och kolumner samtidigt.
.kortlista {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
gap: 1rem;
}
fr-enheten
grid-template-columns: 1fr 1fr 1fr; /* tre lika breda */
grid-template-columns: 3fr 1fr; /* den första tre gånger så bred */
grid-template-columns: 200px 1fr; /* fast första, resten till den andra */
fr betyder fraction, en andel av det lediga utrymmet. Den finns bara
i grid, och gör procenträkning onödig: 1fr 1fr är alltid exakt halva var,
oavsett gap.
repeat, auto-fit och minmax
Läs raden inifrån och ut:
minmax(16rem, 1fr)– varje kolumn är minst 16rem och högst en andel av det lediga.auto-fit– lägg så många sådana kolumner som får plats.repeat(...)– upprepa.
Resultatet är ett galleri som räknar ut antalet kolumner själv. Tre kort på en bred skärm, två på en surfplatta, ett på en telefon – utan en enda media query. Lär dig raden utantill.
grid-template-areas
.sida {
display: grid;
grid-template-columns: 3fr 1fr;
grid-template-areas:
"rubrik rubrik"
"innehall sido";
}
.sida > h1 { grid-area: rubrik; }
.sida > article { grid-area: innehall; }
.sida > aside { grid-area: sido; }
Layouten går att läsa direkt i CSS:en. Men den låser antalet kolumner: varje rad i
namnrutnätet måste ha lika många kolumner, och därför går grid-template-areas
inte att kombinera med auto-fit. Vill du ha båda behöver du en media
query.
grid-column
.sidlayout > h1 { grid-column: 1 / -1; }
Från första linjen till den sista, alltså hela raden oavsett hur många kolumner det blev.
När grid och när flexbox
| Situation | Verktyg |
|---|---|
| Upprepning av lika saker: kort, galleri, produktlista | Grid med auto-fit |
| En rad som ska tåla att brytas: navigering, knapprad | Flexbox med wrap |
| Sidlayout med huvudinnehåll och sidospalt – olika saker | Grid med bestämda kolumner |
| Två saker bredvid varandra, ingen exakt placering | Flexbox |
auto-fit löser upprepning av lika stora saker. En artikel med
sidospalt är inte det. Där måste du bestämma kolumnerna själv, och då behövs en
brytpunkt.
Media query
@media (min-width: 56rem) {
.sidlayout {
grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);
}
}
Läs den som: är fönstret minst 56rem brett, gör kolumnerna så här. Under den bredden gäller regeln inte, och layouten faller tillbaka på en kolumn.
Bygg alltid i den ordningen – smalt först, bredd som tillägg. Det är principen från Gränssnittsdesign, och den är enklare att koda också: en kolumn är förvalet i grid, så det smala fallet behöver oftast ingen kod alls.
Bygg ett galleri med repeat(auto-fit, minmax(16rem, 1fr)) och dra fönstret
från smalt till brett. Räkna kolumnerna. Du skrev aldrig något om antalet.
10. Komponenter och tillstånd
En komponent är en del som återanvänds: en knapp, ett kort, ett formulärfält. Den är inte klar när den ser rätt ut i vila.
| Tillstånd | Väljs med | Måste synas |
|---|---|---|
| Vila | selektorn själv | – |
| Muspekaren över | :hover | Ja |
| Tangentbordsfokus | :focus-visible | Alltid |
| Avstängd | :disabled | Ja |
| Felaktigt ifylld | :invalid | Ja |
.knapp {
background: var(--accent);
color: #fff;
border: 1px solid transparent;
border-radius: 6px;
padding: 0.5rem 1.5rem;
cursor: pointer;
}
.knapp:hover { background: hsl(196 65% 24%); }
.knapp:disabled { background: var(--linje); cursor: not-allowed; }
focus-visible är inte valfri
a:focus-visible,
button:focus-visible,
input:focus-visible {
outline: 3px solid var(--accent);
outline-offset: 2px;
}
Den som navigerar med tangentbord ser annars inte var hen är, och sajten blir omöjlig att använda. Det är inte en detalj – det är skillnaden mellan användbar och obrukbar för den som inte kan använda mus.
:focus-visible är den moderna varianten: den slår till vid tangentbord men
inte när du klickar med musen, vilket var invändningen mot den gamla
:focus.
Formulärfält ärver inte typsnitt
input,
select,
textarea,
button {
font: inherit;
}
Utan den raden får fälten webbläsarens eget typsnitt, oftast mindre än resten av sidan. Det ser trasigt ut och det är inget du gjort fel – det är ett arv från tidiga webbläsare.
Klasser som går att återanvända
| Bra | Dåligt |
|---|---|
.knapp | .knapp-i-formularet |
.faktaruta | .hoger-ruta |
.kortlista | .tre-kolumner |
Flyttas rutan till vänster blir .hoger-ruta en lögn. Blir korten fyra i
stället för tre blir .tre-kolumner det.
Tabba dig genom din sajt utan att röra musen. Ser du hela tiden var du är? Kommer du åt varje länk och varje fält? Det tar två minuter och det är områdets viktigaste test.
11. Att bygga efter en mockup
En mockup är en bild. Din uppgift är att läsa av den, inte att gissa.
| Ur mockupen | Hur |
|---|---|
| Färger | Färgkod ur stilguiden, inte pipetten på en skärmdump |
| Teckenstorlekar | Ur stilguidens skala |
| Avstånd | Mät, och avrunda till närmaste steg i din skala |
| Radlängd | Ungefär hur många tecken en rad rymmer |
| Tillstånd | Finns hover och fokus ritade? Ofta inte |
Avrundningen är viktig. Mäter du 23 px och din skala har 24, använd 24. Mockupen är en skiss av en avsikt, inte en ritning med toleranser.
Vad du frågar om i stället för att gissa
- Hur ser det ut på en telefon?
- Vad händer med en rubrik som är dubbelt så lång?
- Hur ser knappen ut vid hover och fokus?
- Vad händer när listan har ett objekt? Eller femtio?
- Vilken färg har en länk inuti brödtexten?
I det här projektet är designern du själv, vilket gör det enklare – men skriv ändå ned svaren. Det är precis de här frågorna en frontendutvecklare ställer till en designer varje vecka.
Sidan ska bli det bilden ville, i ett medium som har rörliga bredder och användare som zoomar. En sida som stämmer på pixeln vid 1440 px och går sönder vid 1200 är sämre byggd än en som är några pixlar bredvid överallt men håller ihop.
Lägg mockupen bredvid din sida i webbläsaren. Skriv ned tre skillnader. Avgör för var och en om det är ett fel i CSS:en eller något mockupen inte hade svar på.
12. Ta det längre
För dig som siktar mot C och A.
- Ordna CSS:en i avsnitt. Numrerade kommentarer, samma ordning som du bygger: variabler, grund, typografi, layout, komponenter. En annan person ska hitta i din fil utan att fråga.
- Skriv aldrig samma värde två gånger. Står
1.5rempå sex ställen ska det vara en variabel. - Kontrollera med stilmallen avstängd. Ta bort
link-elementet tillfälligt. Går sidan fortfarande att läsa och navigera? Då ligger CSS:en ovanpå markeringen, som den ska. - Lär dig
:is()och:has(). De hör inte till området, men de finns i alla webbläsare nu. - Läs andras CSS. Öppna utvecklarverktygen på en sajt du tycker om och titta på en knapp.
13. Felsökning
14 rader
| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
| Ingenting händer när jag ändrar CSS | Filen är inte kopplad, eller sökvägen är fel | Titta i utvecklarverktygens nätverksflik – laddas
stil.css? |
| Ingenting händer, men filen laddas | En annan regel med högre specificitet vinner | Högerklicka, välj Inspektera. Överstruken rad = överskriven |
| Ändringen syns inte fastän allt ser rätt ut | Webbläsaren har filen i cacheminnet | Ladda om med Ctrl+F5 |
| Regeln under den trasiga fungerar inte heller | Semikolon saknas | Leta uppåt från den första regel som inte fungerar |
| Elementet blir bredare än jag skrev | box-sizing
saknas | Lägg border-box överst i filen |
| Avståndet blev mindre än summan | Marginalkollaps | Sätt marginal bara åt ett håll |
| Sidan har vågrät rullningslist | Något är bredare än skärmen | max-width: 100% på bilder, overflow-x: auto på
tabeller |
| Flexbarnen sticker ut ur sidan | flex-wrap saknas |
Lägg till flex-wrap: wrap |
| Galleriet har en tom kolumn | auto-fit fyller ut med tomma
spår | Normalt, inte ett fel |
| Formulärfälten har fel typsnitt | Fält ärver inte typsnitt | font: inherit på fälten |
| Jag ser inte var jag är när jag tabbar | Fokusmarkeringen är borttagen | Ta bort outline: none, sätt en egen
:focus-visible |
| Färgen ändras inte fast jag bytte variabeln | Värdet står hårdkodat någon annanstans också | Sök i filen på det gamla värdet |
| Bilden är utdragen | Bara ena måttet är satt | Sätt
height: auto när du satt width |
// fungerar inte som kommentar | CSS har ingen radkommentar | Skriv /* så här */ |
14. Snabbreferens: egenskaperna
Använd den inför prov 2. Ordträningen nedan drar slumpvis ur tabellen.
Ordträning
30 rader
| Egenskap eller begrepp | Betyder |
|---|---|
| link rel="stylesheet" | Kopplar en extern stilmall i head |
| box-sizing: border-box | width räknar in padding och border |
| margin | Luft utanför kanten. Bakgrunden når inte hit |
| padding | Luft innanför kanten. Bakgrunden når hit |
| border | Kanten runt elementet |
| border-radius | Rundade hörn |
| max-width | Största bredd elementet får ta |
| marginalkollaps | Två lodräta marginaler smälter ihop, den större vinner |
| specificitet | Hur exakt en selektor är. Avgör före ordning i filen |
| klasselektor | Punkt före namnet. Den du ska använda mest |
| id-selektor | Brädgård före namnet. Undvik som krok för CSS |
| :hover | Gäller när muspekaren är över elementet |
| :focus-visible | Gäller vid tangentbordsfokus. Får aldrig saknas |
| :disabled | Gäller för avstängda fält och knappar |
| :invalid | Gäller för fält som inte uppfyller sina regler |
| !important | Slår all specificitet. Använd den inte |
| font-family | Typsnittsstack, generisk familj sist |
| rem | Räknar mot rotens teckenstorlek. Använd till text |
| em | Räknar mot elementets egen teckenstorlek |
| ch | Bredden på tecknet 0. Används till radlängd |
| line-height | Radavstånd. Skrivs utan enhet |
| hsl | Kulör, mättnad, ljushet. Lättast att göra varianter ur |
| :root | Dokumentets rot. Där variablerna deklareras |
| var() | Hämtar värdet ur en variabel |
| display: flex | Gör behållaren till en flexbehållare |
| flex-wrap: wrap | Låter flexbarnen bryta till ny rad |
| gap | Avstånd mellan barnen i flexbox och grid |
| fr | Andel av ledigt utrymme. Finns bara i grid |
| repeat(auto-fit, minmax()) | Galleri som räknar kolumner själv |
| grid-template-areas | Layout ritad med namn. Låser antalet kolumner |