Gå til indhold
Jan Engelbrecht Pederseb Logo

Avanceret CSS og webdesign

Et komplet kursus fra de grundlæggende regler i CSS til komplekse layouts med Grid, animationer og skalerbar arkitektur i store projekter.

Avanceret CSS og webdesign

Et komplet kursus fra de grundlæggende regler i CSS til komplekse layouts med Grid, animationer og skalerbar arkitektur i store projekter.

Del 1: Introduktion og de grundlæggende regler (Niveau: Begynder)

Del 2: Boks-modellen, farver og typografi

Del 3: Layouts og positionering (Niveau: Øvet)

Del 4: Responsivt design og interaktivitet

Del 5: Avancerede CSS-funktioner og animationer (Niveau: Avanceret)

Del 6: Moderne CSS-værktøjer og arkitektur

Del 1: Introduktion og de grundlæggende regler

Dette modul klæder dig på til at forstå, hvordan CSS taler sammen med din HTML-kode, og hvordan du vælger de helt rigtige elementer at style.

Lektion 1: Hvad er CSS?

CSS (Cascading Style Sheets) er det sprog, vi bruger til at designe og layoute hjemmesider. Hvor HTML definerer indholdet og strukturen (f.eks. "dette er en overskrift"), bestemmer CSS udseendet (f.eks. "overskriften skal være 32px stor, blå og centreret").

Grundlæggende syntaks
CSS-kode er bygget op af en Selector (vælger) og en Declaration block (deklarationsblok), der indeholder egenskaber og værdier:

selector {
  property: value;
}
            

  • Selector (Vælger): Fortæller browseren, hvilket HTML-element der skal styles (f.eks. p for alle paragraffer).
  • Property (Egenskab): Hvad du vil ændre (f.eks. color for tekstfarve eller font-size for størrelse).
  • Value (Værdi): Den nye indstilling (f.eks. blue eller 16px).
  • Husk: Hver linje inde i tuborgklammerne {} skal afsluttes med et semikolon ;.

Tre måder at tilføje CSS på

Metode Eksempel Fordele & Ulemper
Inline CSS
(Direkte på HTML-tagget)
<p style="color: red;">Tekst</p> Ulempe: Gør HTML-koden ekstremt rodet og uoverskuelig. Bør undgås.
Internal CSS
(I HTML-dokumentets <head>)
<style>
p { color: red; }
</style>
Fordel: Godt til hurtig test på én enkelt side.
Ulempe: Skal kopieres til alle filer, hvis websiden har flere undersider.
External CSS
(I en særskilt .css fil)
<link rel="stylesheet" href="style.css"> Best Practice: Én CSS-fil styrer udseendet på hele din hjemmeside. Nemt at vedligeholde.

Fortolkning og CSS Selectors

Lektion 2: Hvordan CSS tolkes (The Cascade & Specificity)

Ordet Cascading betyder "at falde som et vandfald". Browseren læser din CSS-fil oppefra og ned. Hvis to regler rammer det samme element, vinder den regel, der står nederst i filen – medmindre en af reglerne er mere specifik.

Specificitet (Specificity) – Hvem vinder kampen?
Browseren bruger et pointsystem til at afgøre, hvilken CSS-regel der er vigtigst, hvis der opstår en konflikt:

  1. Element-selector (f.eks. p eller h1) = 1 point (Lavest prioritet)
  2. Class-selector (f.eks. .min-tekst) = 10 point
  3. ID-selector (f.eks. #hoved-boks) = 100 point (Højest prioritet)
/* Eksempel: Hvilken farve får overskriften? */

h1 { color: blue; }          /* 1 point */
.titel { color: green; }     /* 10 point */
#hoved-titel { color: red; } /* 100 point */

/* Resultat: Overskriften bliver RØD, selvom den blå regel står først, 
   fordi et ID altid slår en klasse og et element. */
            

Arv (Inheritance)
Nogle CSS-egenskaber nedarves automatisk fra forældre-elementer til deres "børn". Hvis du f.eks. sætter en skrifttype eller en tekstfarve på din <body>, vil alle knapper, paragraffer og overskrifter indeni automatisk bruge den samme skrifttype, medmindre du aktivt giver dem en anden regel.

  • Nedarves: Tekstfarve (color), skrifttyper (font-family, font-size), linjeafstand.
  • Nedarves IKKE: Margins, padding, baggrundsfarver, borders (kanter).

Den farlige genvej: !important
Du kan tvinge en CSS-regel til at vinde uanset pointsystemet ved at tilføje !important før semikolonet: color: purple !important;.

  • Advarsel: Dette betragtes som meget dårlig praksis i branchen. Det ødelægger det naturlige vandfald og gør det utrolig svært at fejlfinde i din kode senere. Brug det kun i absolutte nødstilfælde.

Lektion 3: CSS Selectors (Vælgere)

For at style professionelt skal du kunne ramme dine HTML-elementer med stor præcision.

1. Grundlæggende selectors

/* Element-vælger: Rammer ALLE <p> tags på hele siden */
p {
  line-height: 1.5;
}

/* Klasse-vælger: Rammer alle elementer med class="knap" */
.knap {
  background-color: gray;
}

/* ID-vælger: Rammer det ÉNESTE element med id="logo" */
#logo {
  width: 150px;
}
            

2. Kombinerede og avancerede selectors
Du kan parre selectors sammen for at ramme mere specifikt:

/* Descendant Selector (Efterkommer): 
   Rammer alle <a> tags, der ligger INDENI et <nav> tag */
nav a {
  text-decoration: none;
}

/* Child Selector (Direkte barn): 
   Rammer kun <li> tags, der er direkte børn af en <ul> (ikke under-menuer) */
ul > li {
  list-style: square;
}

/* Grupperings-vælger: 
   Giv h1, h2 og h3 præcis de samme indstillinger på én gang med komma */
h1, h2, h3 {
  font-family: 'Arial', sans-serif;
  color: #333333;
}
            

Del 2: Boks-modellen, farver og typografi

Dette modul lærer dig at styre dimensioner, afstande og det visuelle udtryk på dine websider med millimeterpræcision.

Lektion 4: Boks-modellen (The Box Model)

Hvert eneste element på en hjemmeside betragtes af browseren som en usynlig, firkantet boks. Boks-modellen består af fire lag, som tælles indefra og ud:

┌───────────────────────────────────────────┐
│                 MARGIN                    │  <-- Udvendig afstand til andre elementer
│   ┌───────────────────────────────────┐   │
│   │             BORDER                │   │  <-- Elementets kant
│   │   ┌───────────────────────────┐   │   │
│   │   │         PADDING           │   │   │  <-- Indvendig afstand fra kant til indhold
│   │   │   ┌───────────────────┐   │   │   │
│   │   │   │     CONTENT       │   │   │   │  <-- Selve indholdet (tekst, billede, etc.)
│   │   │   └───────────────────┘   │   │   │
│   │   └───────────────────────────┘   │   │
│   └───────────────────────────────────┘   │
└───────────────────────────────────────────┘
            

Det store problem og løsningen: box-sizing: border-box;
Som standard i CSS lægger browseren padding og border oven i den bredde, du har givet elementet. Hvis du laver en boks, der er 300px bred, og tilføjer 20px padding og en 5px border, bliver boksen pludselig 350px bred i virkeligheden (300 + 20 + 20 + 5 + 5). Det ødelægger tit dine layouts.
Løsningen er egenskaben box-sizing: border-box;. Den tvinger browseren til at inkludere padding og border inde i den bredde, du har defineret.

/* Den gyldne regel: Sæt altid dette øverst i din CSS-fil for ALLE elementer (*) */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.boks {
  width: 300px;
  padding: 20px;
  border: 5px solid black;
  /* Med border-box forbliver boksen PRÆCIS 300px bred på skærmen */
}
            

Lektion 5: Typografi og tekst-styling

For at gøre din tekst læselig og flot, bruger vi en række specifikke typografiegenskaber.

Relative enheder: em vs. rem
Undgå at låse dine skrifttyper fast med px. Brug i stedet de moderne, relative enheder, som gør det nemmere at skalere teksten (f.eks. til mobil eller til svagtseende):

  • rem (Root EM): Baseret direkte på browserens standardskrifttype (typisk 16px). 1rem = 16px, 2rem = 32px, 0.5rem = 8px. Dette er standard best practice.
  • em: Baseret på skrifttypestørrelsen på det forælderelement, som koden ligger i. Kan hurtigt blive uforudsigeligt.
body {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  font-size: 16px; /* Hovedstørrelse */
}

h1 {
  font-size: 2.5rem;   /* 2.5 gange browserens standard = 40px */
  font-weight: 700;    /* Gør teksten fed */
  line-height: 1.2;    /* Linjeafstand - 1.2 gange tekstens størrelse */
  letter-spacing: 1px; /* Afstand mellem de enkelte bogstaver */
}
            

Lektion 6: Farver, baggrunde og skygger

CSS giver dig fuld kontrol over farverne på dine elementer samt muligheden for at lave dybde med skygger.

1. Farveformater i CSS
Du kan definere farver på flere måder:

  • HEX: #ff0000 (Rød)
  • RGB: rgb(255, 0, 0)
  • RGBA: rgba(255, 0, 0, 0.5) <- Det sidste tal (A for Alpha) styrer gennemsigtigheden fra 0 (helt usynlig) til 1 (helt solid). Her er den 50% gennemsigtig rød.

2. Skygger (box-shadow)
Skygger skaber en illusion af, at elementer "løfter" sig fra skærmen. Syntaksen for en skygge styres af 4 tal samt en farve:

/* box-shadow: [vandret-skub] [lodret-skub] [sløring/blur] [spredning] [farve]; */
.kort {
  background-color: #ffffff;
  border-radius: 8px; /* Afrunder hjørnerne */
  box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); 
  /* 0px til siderne, 4px nedad, 10px blød sløring, 10% gennemsigtig sort farve */
}
            

Praktisk eksempel: Et fuldendt "kort"-komponent
Lad os binde alt fra del 1 og del 2 sammen i et flot, moderne stykke kode:

.produkt-kort {
  /* Boks-model */
  width: 100%;
  max-width: 350px;
  padding: 1.5rem;
  margin: 1rem auto;
  box-sizing: border-box;
  
  /* Visuelt design */
  background-color: #ffffff;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.05);
}

.produkt-kort h2 {
  font-size: 1.25rem;
  color: #1e293b;
  margin-bottom: 0.5rem;
}

.produkt-kort p {
  font-size: 0.95rem;
  color: #64748b;
  line-height: 1.6;
}
            

Del 3: Layouts og positionering

Dette modul forvandler din evne til at arrangere elementer på en skærm. Du lærer at placere elementer præcist ved siden af hinanden, centrere ting fejlfrit og opbygge komplekse, professionelle gittersystemer.

Lektion 7: Traditionel positionering og display

Før vi dykker ned i de avancerede layoutsystemer, skal vi forstå, hvordan elementer opfører sig som standard, og hvordan vi kan fjerne dem fra det normale tekstflow.

1. display egenskaben
Hvert HTML-element har en standard display-type:

  • display: block; (f.eks. <div>, <p>, <h1>): Starter altid på en ny linje og fylder hele skærmens bredde ud. Kan modtage bredde (width) og højde (height).
  • display: inline; (f.eks. <span>, <a>, <strong>): Sætter sig på linje ved siden af andre elementer og fylder kun det, som selve teksten fylder. Kan ikke modtage bredde eller højde.
  • display: inline-block;: Sætter sig på linje som et inline-element, men tillader dig at styre bredde, højde, padding og margins som et blok-element.

2. position egenskaben
Med position kan du flytte et element væk fra dets naturlige placering på siden ved hjælp af retningskoordinater (top, bottom, left, right).

  • static: Standardindstillingen. Elementet følger sidens normale flow.
  • relative: Elementet kan flyttes i forhold til sin egen normale startposition. Selvom du flytter det, optager det oprindelige tomme hul stadig plads i layoutet.
  • absolute: Elementet fjernes helt fra sidens flow og svæver frit. Det placerer sig i forhold til det nærmeste forældre-element, der har en position sat (ofte position: relative;).
  • fixed: Elementet låses fast på skærmen i forhold til selve browservinduet. Det bliver siddende på præcis samme sted, selvom du scroller (f.eks. en topmenu eller en "chat nu"-knap).
  • sticky: En hybrid. Elementet opfører sig normalt, indtil du scroller forbi det, hvorefter det klistrer sig fast til toppen af skærmen.
/* Eksempel: En popup-luk-knap placeret øverst i højre hjørne af et kort */
.kort {
  position: relative; /* Gør kortet til referencepunkt for det absolutte barn */
  width: 300px;
  padding: 20px;
}

.luk-knap {
  position: absolute;
  top: 10px;
  right: 10px; /* Placeres præcist 10px fra kortets øverste højre hjørne */
}
            

Lektion 8: Flexbox (Det éndimensionelle layout)

Flexbox er skabt til at arrangere elementer i enten én række (vandret) eller én kolonne (lodret). Det er det ultimative værktøj til at fordele plads og centrere elementer.
Du aktiverer Flexbox ved at skrive display: flex; på forælderelementet.

Retning og justering (justify-content og align-items)
Når du bruger Flexbox, styrer du elementerne ud fra to akser. Hvis elementerne ligger på en vandret række (flex-direction: row;), fungerer akserne således:

  • justify-content (Hovedaksen / Vandret):
    • center: Centrerer alle elementer vandret.
    • space-between: Skubber det første element helt til venstre, det sidste helt til højre, og fordeler resten jævnt.
  • align-items (Tværaksen / Lodret):
    • center: Centrerer alle elementer lodret i forhold til hinanden (Løser det historiske problem med lodret centrering!).
/* En klassisk, professionel topmenu (Navbar) */
.navbar {
  display: flex;
  justify-content: space-between; /* Logo til venstre, links til højre */
  align-items: center;            /* Centrerer alt lodret */
  background-color: #1e293b;
  padding: 0 2rem;
  height: 60px;
}

.menu-links {
  display: flex;
  gap: 20px; /* Sætter et ensartet mellemrum mellem alle links */
}
            

Lektion 9: CSS Grid (Det todimensionelle layout)

Hvor Flexbox arbejder i én retning, arbejder CSS Grid i to retninger på samme tid (både rækker og kolonner). Det er det perfekte værktøj til at bygge hele sidelayouts, fotogallerier eller produktoversigter.
Du aktiverer det ved at skrive display: grid; på forælderen.

1. Definition af rutenet med fr og repeat()
Vi bruger enheden fr (fraction/andel), som automatisk beregner og fordeler den tilgængelige plads i lige store dele.

.billede-gitter {
  display: grid;
  /* Opretter 3 kolonner, der hver fylder 1 andel (1/3) af pladsen */
  grid-template-columns: 1fr 1fr 1fr; 
  
  /* En smartere måde at skrive det samme på ved brug af repeat() funktionen: */
  /* grid-template-columns: repeat(3, 1fr); */
  
  gap: 20px; /* Sætter 20px mellemrum mellem alle celler (både rækker og kolonner) */
}
            

2. Elementspænd (grid-column)
Du kan fortælle et specifikt underelement (en celle), at det skal strække sig over flere kolonner i gitteret.

/* Et avanceret layout med en stor hovedblok og en mindre sidebar */
.layout-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* 3 lige store kolonner */
  gap: 15px;
}

.hoved-indhold {
  grid-column: span 2; /* Dette element fylder 2 ud af de 3 kolonner */
  background-color: #3b82f6;
}

.sidebar {
  grid-column: span 1; /* Fylder den sidste kolonne */
  background-color: #cbd5e1;
}
            

Oversigt: Flexbox vs. CSS Grid

Egenskab Flexbox CSS Grid
DimensionÉndimensionel (Række eller kolonne).Todimensionel (Rækker og kolonner samtidig).
Primært fokusIndholdet styrer layoutet (Fleksible størrelser på elementer).Strukturen styrer layoutet (Elementerne tvinges ind i et fastlagt gitter).
Bedste brugsscenarieNavigationsbarer, knaprækker, lister, centrering af enkelte elementer.Hele sidelayouts, komplicerede dashboards, produktoversigter.

Del 4: Responsivt design og interaktivitet

Dette modul lærer dig at bygge fleksible websider, der automatisk tilpasser sig brugerens skærm, samt at skabe interaktive visuelle effekter, når brugeren interagerer med siden.

Lektion 10: Responsivt webdesign & Media Queries

I dag besøges hjemmesider fra tusindvis af forskellige enheder. Vi bruger Media Queries (@media) til at fortælle browseren, at den skal ændre eller overskrive CSS-reglerne, hvis skærmen har en bestemt størrelse.

1. Det uundværlige viewport meta-tag
For at responsivt CSS overhovedet virker i mobilbrowsere, skal du have denne linje kode stående inde i din HTML-fils <head>:

<meta name="viewport" content="width=device-width, initial-scale=1.0">
            

Dette tag tvinger mobilbrowseren til at respektere telefonens reelle skærmbredde i stedet for at zoome ud på en stor desktop-version.

2. Mobil-først breakpoints i praksis
Det anbefales næsten altid at bruge en mobil-først-strategi. Det betyder, at din standard-CSS-kode gælder for små mobilskærme. Derefter bruger du @media (min-width: ...) til at tilføje regler for større skærme.

/* --- 1. Standard CSS (Gælder for Mobiltelefoner) --- */
.galleri {
  display: grid;
  grid-template-columns: 1fr; /* 1 kolonne på mobilen, så elementerne stables lodret */
  gap: 1rem;
}

.titel {
  font-size: 1.5rem;
}

/* --- 2. Breakpoint for Tablets (Skærme fra 768px bredde og op) --- */
@media (min-width: 768px) {
  .galleri {
    grid-template-columns: repeat(2, 1fr); /* Skifter til 2 kolonner på tablets */
  }
  .titel {
    font-size: 2rem; /* Større tekst på større skærme */
  }
}

/* --- 3. Breakpoint for Computerskærme (Fra 1024px bredde og op) --- */
@media (min-width: 1024px) {
  .galleri {
    grid-template-columns: repeat(4, 1fr); /* Skifter til 4 kolonner på laptops */
  }
}
            

3. Responsive enheder: vw og vh
Udover procenter (%), har moderne CSS to kraftfulde enheder, der kigger direkte på browserens vinduesstørrelse (viewport):

  • 1vw (Viewport Width): Svarer til 1% af browserens fulde bredde.
  • 1vh (Viewport Height): Svarer til 1% af browserens fulde højde.
  • Eksempel: En boks med height: 100vh; vil altid fylde præcis hele skærmens højde ud, hvilket er genialt til flotte velkomstskærme (hero-sektioner).

Lektion 11: Pseudo-klasser og pseudo-elementer

Pseudo-klasser og pseudo-elementer bruges til at style elementer baseret på deres aktuelle tilstand eller til at indsætte ekstra dekorative elementer uden at tilføje mere HTML-kode.

1. Interaktive tilstande (Pseudo-klasser)
En pseudo-klasse kendes på, at den starter med et enkelt kolon (:). De mest populære bruges til brugerinteraktion:

.knap {
  background-color: #3b82f6; /* Blå */
  color: white;
  padding: 10px 20px;
  border: none;
  cursor: pointer;
}

/* :hover - Aktiveres når musen føres over elementet */
.knap:hover {
  background-color: #1d4ed8; /* Mørkere blå */
}

/* :focus - Aktiveres når elementet klikkes i eller vælges med Tab-tasten (Vigtigt til inputfelter!) */
.input-felt:focus {
  outline: 2px solid #6366f1;
}
            

2. Strukturelle pseudo-klasser (:nth-child)
Du kan vælge elementer ud fra deres placering i en liste. Det er perfekt til f.eks. at lave stribede rækker i en tabel for at øge læseligheden.

/* Rammer kun det absolut første element i rækken */
li:first-child {
  font-weight: bold;
}

/* :nth-child(even) rammer alle lige numre (2, 4, 6...) */
tr:nth-child(even) {
  background-color: #f8fafc; /* Lys grå baggrund på hver anden række */
}
            

3. Pseudo-elementer (::before og ::after)
Pseudo-elementer kendes på de dobbelte kolon (::). De gør det muligt at generere "virtuelt" indhold i starten eller slutningen af et element direkte fra din CSS-fil. De skal altid indeholde en content-egenskab (selvom den bare er tom "").

/* Tilføjer automatisk en lille rød stjerne foran alle påkrævede felter */
.paakraevet::before {
  content: "* ";
  color: #ef4444;
  font-weight: bold;
}

/* Bruges ofte til at lave smarte, dekorative streger under overskrifter */
.overskrift-streg {
  position: relative;
}
.overskrift-streg::after {
  content: "";
  position: absolute;
  bottom: -5px;
  left: 0;
  width: 50px;
  height: 3px;
  background-color: #3b82f6; /* Blå streg under teksten */
}
            

Del 5: Avancerede CSS-funktioner og animationer

Dette modul dækker avancerede funktioner og visuel interaktion. Vi bevæger os væk fra statiske sider og skaber levende brugerflader med høj brugervenlighed.

Lektion 12: CSS Variabler (Custom Properties)

Ligesom i rigtige programmeringssprog kan du i moderne CSS gemme værdier (som farvekoder, skrifttyper eller afstande) i variabler. Det betyder, at hvis virksomheden ændrer sin logofarve, skal du kun rette den ét enkelt sted i stedet for 200 steder i din CSS-fil.

Definition og brug af variabler
Globale variabler defineres i pseudo-klassen :root, hvilket svarer til det absolut øverste niveau i dit HTML-dokument. Variabler skal altid starte med to bindestreger (--).

/* 1. Definer dine variabler i :root */
:root {
  --primary-color: #3b82f6;   /* Blå */
  --secondary-color: #1e293b; /* Mørkegrå */
  --text-main: #334155;       /* Slate-grå tekst */
  --border-radius-md: 8px;    /* Genanvendelig afrunding */
}

/* 2. Brug dine variabler i koden med var() funktionen */
body {
  color: var(--text-main);
}

.knap-primaer {
  background-color: var(--primary-color);
  color: #ffffff;
  border-radius: var(--border-radius-md);
  padding: 10px 20px;
  border: none;
}
            

Det geniale trick: Nemt mørkt tema (Dark Mode)
Ved blot at overskrive variablerne i en enkelt CSS-klasse, kan du ændre hele hjemmesidens udseende med ét splitsekund (f.eks. når JavaScript tilføjer klassen .dark til dit <body> tag):

/* Når body får klassen .dark, ændres værdien af variablerne automatisk overalt */
body.dark {
  --secondary-color: #0f172a; /* Meget mørkere baggrund */
  --text-main: #f8fafc;       /* Lys tekst */
}
            

Lektion 13: Transitioner og transformer

Når et element ændrer sig – f.eks. når du holder musen over en knap – må farveskiftet ikke ske øjeblikkeligt og hakkende. Det skal ske glidende.

1. Transitioner (Glatte overgange)
En transition fortæller browseren, at en ændring skal animeres over et kort stykke tid. Du definerer, hvilken egenskab der skal animeres, og hvor længe det skal vare (i sekunder s eller millisekunder ms).

.kort {
  background-color: #ffffff;
  padding: 20px;
  border-radius: 8px;
  
  /* Vi vil animere alle ændringer over 300ms med en blød kurve (ease-in-out) */
  transition: all 0.3s ease-in-out;
}

.kort:hover {
  background-color: #f8fafc;
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
  /* Når musen rammer kortet, glider både farven og skyggen blødt ind */
}
            

2. Transformer (Skalering, rotation og flytning)
Med transform kan du manipulere et elements form, størrelse og placering i rummet uden at ødelægge resten af sidens layout.

  • scale(): Gør elementet større eller mindre (1.1 svarer til 10% større).
  • rotate(): Roterer elementet med urets retning i grader (deg).
  • translate(): Flytter elementet vandret (X) eller lodret (Y).
.ikon-knap:hover {
  /* Knappen bliver 5% større og roterer 15 grader, når man holder musen over den */
  transform: scale(1.05) rotate(15deg);
}
            

Lektion 14: CSS Animationer (@keyframes)

Hvor en transition kun fungerer, når et element går fra en starttilstand til en sluttilstand (f.eks. fra normal til hover), tillader CSS Animationer dig at bygge komplekse, uafhængige bevægelser, der kan køre i ring uendeligt.
Processen består af to trin:

  1. Definer selve animationen og dens tidslinje med @keyframes.
  2. Tildel animationen til det element, der skal bevæge sig, ved brug af animation-egenskaberne.

Eksempel: En pulserende indlæsningscirkel (Spinner)

/* Trin 1: Definer tidslinjen for animationen under navnet 'roter' */
@keyframes roter {
  0% {
    transform: rotate(0deg); /* Startposition */
  }
  100% {
    transform: rotate(360deg); /* Slutposition - en hel omgang rundt */
  }
}

/* Trin 2: Sæt animationen i gang på elementet */
.loading-spinner {
  width: 40px;
  height: 40px;
  border: 4px solid rgba(0, 0, 0, 0.1);
  border-top-color: #3b82f6; /* Kun toppen er blå for at skabe en cirkel-effekt */
  border-radius: 50%;        /* Gør boksen fuldstændig rund */
  
  /* Navn: roter | Varighed: 1s | Gentagelser: infinite (uendelig) | Hastighed: linear (ensartet tempo) */
  animation: roter 1s linear infinite;
}
            

Et andet eksempel: En "hoppende" opmærksomhedspil

@keyframes hop {
  0%, 100% {
    transform: translateY(0); /* Normal position i top og bund af tidslinjen */
  }
  50% {
    transform: translateY(-10px); /* Hopper 10px op på halvvejen */
  }
}

.pil-ned {
  /* Kører i ring hvert 1.5 sekund med en blød op-og-ned kurve */
  animation: hop 1.5s ease-in-out infinite;
}
            

Del 6: Moderne CSS-værktøjer og arkitektur

Dette modul klæder dig på til at indgå i professionelle udviklingsteams. Du lærer at skrive skalerbar, ren og fremtidssikret kode til store webapplikationer.

Lektion 15: CSS Preprocessorer (Sass / SCSS)

Når et webprojekt vokser til tusindvis af linjer kode, bliver almindelig CSS svær at vedligeholde. En preprocessor som Sass (Syntactically Awesome Stylesheets) giver dig ekstra superkræfter. Du skriver kode i en .scss-fil, som et program derefter automatisk oversætter (kompilerer) til en helt almindelig .css-fil, som browseren kan forstå.

De tre vigtigste fordele ved Sass/SCSS:

Funktion Beskrivelse Eksempel i SCSS
Nesting
(Indlejring)
Du kan placere dine CSS-selectors indeni hinanden, så koden følger den samme struktur som din HTML.
.kort {
padding: 20px;
h2 { color: blue; }
}
Mixins
(Genanvendelighed)
Fungerer som funktioner. Du kan gemme en hel samling af CSS-regler og genbruge dem overalt med én linje.
@mixin flex-center {
display: flex;
justify-content: center;
align-items: center;
}
Partials & Moduler Du kan dele din kode op i mange små filer (f.eks. _buttons.scss, _header.scss) og samle dem med @use.
@use 'buttons';
@use 'header';

Her er et eksempel på, hvordan Mixins og Nesting skrives i SCSS:

// Definition af en genanvendelig mixin
@mixin knap-styling($farve) {
  background-color: $farve;
  color: white;
  padding: 10px 20px;
  border-radius: 5px;
}

// Nesting i praksis
.hoved-menu {
  background-color: #333;
  padding: 10px;

  ul {
    display: flex;
    list-style: none;
  }

  .Logind-knap {
    @include knap-styling(blue); // Henter vores mixin
    
    &:hover {
      background-color: darkblue; // '&' refererer tilbage til .Logind-knap
    }
  }
}
            

Lektion 16: CSS-arkitektur i store projekter (BEM)

Hvis 10 forskellige udviklere arbejder på den samme hjemmeside uden regler, vil de hurtigt overskrive hinandens kode ved et uheld. For at løse dette bruger man navngivningssystemer. Det mest populære i verden hedder BEM (Block, Element, Modifier).
BEM tvinger dig til at navngive dine CSS-klasser ud fra en stram struktur:

  • Block (Blok): Den overordnede, uafhængige komponent (f.eks. .card eller .menu).
  • Element (Element): En del af blokken, som ikke giver mening alene. Kendes på to understreger (__). F.eks. .card__title eller .card__button.
  • Modifier (Modifikator): Bruges hvis en blok eller et element skal ændre udseende (f.eks. farve eller størrelse). Kendes på to bindestreger (--). F.eks. .card--featured eller .card__button--danger.
<!-- HTML struktureret efter BEM-standarden -->
<div class="card card--featured">
    <h2 class="card__title">Produktnavn</h2>
    <p class="card__text">Kort beskrivelse af produktet.</p>
    <button class="card__button card__button--danger">Slet</button>
</div>
            

Ved at bruge BEM holder du din specificitet ekstremt lav (kun 10 point pr. klasse), hvilket forhindrer, at dine CSS-regler kommer i krig med hinanden.

Lektion 17: Moderne indbyggede CSS Funktioner

Browserne udvikler sig i rivende hast. Mange af de ting, man før i tiden havde brug for værktøjer som Sass eller JavaScript til, kan moderne CSS nu klare helt af sig selv.

1. Indbygget CSS Nesting
Du behøver faktisk ikke længere installere Sass for at bruge basal indlejring. Moderne CSS understøtter nu nesting direkte i browseren:

/* Ren moderne CSS - virker direkte i browseren i dag */
.produkt-kort {
  background: white;
  padding: 2rem;

  .titel {
    font-size: 1.5rem;
    color: #111;
  }

  &:hover {
    box-shadow: 0 10px 20px rgba(0,0,0,0.1);
  }
}
            

2. Matematiske funktioner: clamp(), min() og max()
Disse funktioner gør det muligt at lave flydende og responsivt design uden at skrive hundredvis af Media Queries. Den absolut mest kraftfulde er clamp(), som låser en værdi fast mellem en minimums- og maksimumstørrelse, mens den skalerer flydende derimellem.

/* clamp(MINIMUM, FORETRUKKEN VÆRDI, MAKSIMUM) */
h1 {
  /* Skrifttypen vil ALDRIG blive mindre end 32px og ALDRIG større end 64px. 
     På tablets og laptops vil den flyde perfekt derimellem baseret på skærmens bredde (5vw) */
  font-size: clamp(2rem, 5vw, 4rem); 
}
            

Tag magten over dit webdesign

Brug denne viden til at bygge moderne, responsive og lynhurtige webløsninger med avanceret CSS-arkitektur.