Font-optimering — Webfonts, FOUT og SEO
Webfonts kan forsinke render og forårsage layout shift. WOFF2, font-display: swap og preload af kritiske fonte er de primære optimeringer.
Webfonts er noget nær universelle på moderne sites — og en hyppig kilde til performance-problemer. En webfont der hentes fra ekstern CDN, parseres og swappes ind over systemfonten kan koste 200-500ms ekstra på LCP og forårsage målbart CLS i processen. Korrekt font-optimering med WOFF2, preload og font-display er en konkret og direkte forbedring af Core Web Vitals.
WOFF2 er standarden
WOFF2 er det mest effektive webfont-format. Det komprimerer 30-50% bedre end WOFF og er understøttet af alle moderne browsere. Sørg for at dine fonte serveres som WOFF2 — det er det primære format i @font-face definitionen:
@font-face {
font-family: 'Inter';
src: url('/fonts/inter.woff2') format('woff2');
font-display: swap;
}
font-display styrer swap-adfærd
font-display bestemmer hvad browseren viser mens fonten indlæses:
swap— viser systemfont øjeblikkeligt, swapper til webfont når den er klar. FOUT, men ingen usynlig tekst.optional— giver fonten kort tid (100ms) til at indlæse fra cache; hvis ikke klar, bruges systemfont permanent for den session.block— skjuler tekst op til 3 sekunder mens fonten indlæses. Undgå.
For kritiske fonte (body font) er swap standardvalget. optional er stærkere for performance men kræver at brugeren accepterer systemfont ved første besøg.
Preload af kritiske fonte
For den primære body font og heading font er preload effektivt:
<link rel="preload" as="font" href="/fonts/inter.woff2" crossorigin type="font/woff2">
crossorigin er påkrævet selv for self-hosted fonte — fonte hentes med CORS-request. Uden crossorigin vil browseren hente fonten to gange.
Subsetting reducerer filstørrelse
En komplet Inter-font inkluderer tegn for alle sprog — kyrillisk, græsk, vietnamesisk. For et dansk site er langt størstedelen af disse tegn irrelevante. Subsetting fjerner ubrugte tegn og reducerer filstørrelsen dramatisk. Google Fonts genererer automatisk subsets baseret på unicode-range — self-hosted fonte kræver manuel subsetting med værktøjer som pyftsubset.
Self-hosted vs. Google Fonts
Google Fonts er populær, men kræver en ekstern request til fonts.googleapis.com. Med preconnect er det håndterbart. Self-hosted fonte eliminerer den externe afhængighed og giver fuld kontrol over caching — og er GDPR-cleanere da ingen request sendes til Google.
→ Denne artikel er en del af Web Performance — Core Web Vitals og teknisk hastighed.
Andre artikler i samme emne
- Animation performance — Frame rate og jank-fri bevægelse
- Billedoptimering — Formater, størrelser og SEO
- Browser rendering pipeline — Fra HTML til pixels
- CLS-problemer — Årsager til Cumulative Layout Shift og løsninger
- Core Web Vitals — LCP, INP og CLS forklaret
- CSS — Cascading Style Sheets og SEO
- CSS containment — Isolér rendering og accelerér layout
- HTTP/2 og HTTP/3 — Protokoller der eliminerer latency-overhead
- INP-optimering — Interaction to Next Paint og Core Web Vitals
- JavaScript bundle-optimering — Code splitting, tree shaking og analyse
- Kritisk renderingsti — Hvad browseren gør før du ser noget
- Latency — Forsinkelse i netværket og hvad du kan gøre ved det
- Lazy loading — Udskyd indlæsning af billeder og ressourcer
- LCP-optimering — Sådan forbedrer du Largest Contentful Paint
- Long Tasks og LoAF — Hvad blokerer main thread
- Navigation og resource timings — Browserens performance-API
- PageSpeed og SEO — Hastighed som rankingfaktor
- Performance budgets — Grænser der forhindrer regressioner
- Performance timings — Hvornår er det for langsomt?
- Resource hints — Preload, prefetch og preconnect til SEO
- Responsive images — srcset, sizes og art direction
- Responsivt design — Mobile-first og SEO
- RUM vs. syntetisk monitoring — To syn på web performance
- Service Workers — Offline caching og PWA performance
- Speculative loading — Prefetch og prerender af næste side
- Startup performance — Hurtig app-start og time to interactive
- Tredjeparts-scripts og performance — Impact og strategier
- Tredjepartsscripts — Analytics, ads og performance-konsekvenser
- TTFB og hosting — Server response time og SEO
- Video performance — Lazy loading, formater og indlæsningsstrategi
- Viewport tag — Meta viewport og mobil-rendering
- Web Workers — Parallel JavaScript uden main thread-blokning
Ofte stillede spørgsmål
- Hvad er FOUT og FOIT?
- FOUT (Flash of Unstyled Text) opstår når browseren viser systemfont mens webfonten indlæses, derefter swapper til webfonten. FOIT (Flash of Invisible Text) opstår når browseren skjuler tekst mens fonten indlæses. FOIT er værre fra UX-perspektiv — brugeren ser ingen tekst. font-display: swap producerer FOUT, som er den bedste kompromis.
- Påvirker webfonts CLS?
- Ja. Fontswap fra systemfont til webfont kan ændre tekstens layout og derved trigge Cumulative Layout Shift. Preload af kritiske fonte reducerer swap-forsinkelsen. font-display: optional undgår swap helt, men viser systemfont hvis fonten ikke er indlæst inden første render.
- Hvad er font subsetting og hvornår er det relevant?
- Font subsetting reducerer en webfonts filstørrelse ved at fjerne tegn der ikke bruges. En komplet Inter-font inkluderer tegn til alle verdenssprog — cyrillisk, græsk, arabisk. For et dansk site er de fleste tegnsæt overflødige. Subsetting kan reducere fontfilstørrelser fra 200-400KB til 20-50KB. Google Fonts subsetter automatisk. Self-hosted fonte kræver manuel subsetting med pyftsubset eller lignende værktøj.
- Hvad er unicode-range i @font-face og hvad gør det?
- unicode-range angiver præcist hvilke tegn en @font-face-regel dækker. Browseren downloader kun fontfilen hvis siden faktisk bruger tegn i det specificerede range. Google Fonts bruger automatisk unicode-range til at opdele fonte i subsets og sikre at kun relevante subsets downloades. For self-hosted fonte bør unicode-range konfigureres for at undgå unødvendige font-downloads.
- Er self-hosted fonte altid bedre end Google Fonts?
- Self-hosted fonte er GDPR-renere fordi ingen request sendes til Google, og de giver fuld kontrol over caching og filformater. Google Fonts understøtter dog browser-caching på tværs af sites — en bruger der har besøgt et andet site med samme font har den muligvis allerede cachet. Praktisk forskel er minimal for de fleste sites. Vælg self-hosting for GDPR-compliance, Google Fonts for enkel implementering.
Placering i ordbogen
- Animation performance — Frame rate og jank-fri bevægelse
- Billedoptimering — Formater, størrelser og SEO
- Browser rendering pipeline — Fra HTML til pixels
- CLS-problemer — Årsager til Cumulative Layout Shift og løsninger
- Core Web Vitals — LCP, INP og CLS forklaret
- CSS — Cascading Style Sheets og SEO
- CSS containment — Isolér rendering og accelerér layout
- HTTP/2 og HTTP/3 — Protokoller der eliminerer latency-overhead
- INP-optimering — Interaction to Next Paint og Core Web Vitals
- JavaScript bundle-optimering — Code splitting, tree shaking og analyse
- Kritisk renderingsti — Hvad browseren gør før du ser noget
- Latency — Forsinkelse i netværket og hvad du kan gøre ved det
- Lazy loading — Udskyd indlæsning af billeder og ressourcer
- LCP-optimering — Sådan forbedrer du Largest Contentful Paint
- Long Tasks og LoAF — Hvad blokerer main thread
- Navigation og resource timings — Browserens performance-API
- PageSpeed og SEO — Hastighed som rankingfaktor
- Performance budgets — Grænser der forhindrer regressioner
- Performance timings — Hvornår er det for langsomt?
- Resource hints — Preload, prefetch og preconnect til SEO
- Responsive images — srcset, sizes og art direction
- Responsivt design — Mobile-first og SEO
- RUM vs. syntetisk monitoring — To syn på web performance
- Service Workers — Offline caching og PWA performance
- Speculative loading — Prefetch og prerender af næste side
- Startup performance — Hurtig app-start og time to interactive
- Tredjeparts-scripts og performance — Impact og strategier
- Tredjepartsscripts — Analytics, ads og performance-konsekvenser
- TTFB og hosting — Server response time og SEO
- Video performance — Lazy loading, formater og indlæsningsstrategi
- Viewport tag — Meta viewport og mobil-rendering
- Web Workers — Parallel JavaScript uden main thread-blokning