Billedoptimering i 2026: Komplet guide til AVIF, WebP og responsive billeder

Billeder udgør 60-70 % af en websides vægt — og de er direkte koblet til din LCP-score. Her er den komplette guide til AVIF, WebP, srcset, fetchpriority og lazy loading med konkrete kodeeksempler.

Hvorfor billedoptimering er den vigtigste hastighedsgevinst i 2026

Billeder udgør typisk 60–70 % af en websides samlede vægt. Det er ikke bare en statistik — det er den absolut største flaskehals for din sides indlæsningstid. Og i 2026, hvor Core Web Vitals direkte påvirker din Google-placering, er uoptimerede billeder en fejl, du simpelthen ikke har råd til.

Tænk over det et øjeblik: Når din bruger lander på din side, er det oftest et stort hero-billede, der udgør din Largest Contentful Paint (LCP). Hvis det billede vejer 2 MB i JPEG-format og serveres i fuld desktop-opløsning til en mobilbruger på 4G — ja, så har du allerede tabt kampen om en god brugeroplevelse, før en eneste linje JavaScript overhovedet er kørt.

Det er frustrerende. Men den gode nyhed? Billedoptimering er faktisk et af de områder, hvor du kan få mest effekt med relativt lille indsats.

I denne guide gennemgår vi alle de vigtige teknikker: fra valg af det rigtige format og responsive billeder med srcset, til prioritering med fetchpriority, korrekt lazy loading og automatisering i din build-pipeline. Alt med konkrete kodeeksempler, du kan bruge med det samme.

Moderne billedformater: AVIF, WebP og JPEG

Valg af det rigtige billedformat er det allerførste skridt — og ærligt talt det med størst umiddelbar effekt. I 2026 har vi tre relevante formater til fotografiske billeder på nettet.

AVIF: den nye standard for maksimal komprimering

AVIF (AV1 Image File Format) er udviklet af Alliance for Open Media og bygger på den avancerede AV1-videocodec. Formatet tilbyder markant bedre komprimering end både WebP og JPEG:

  • Op til 50 % mindre end JPEG ved sammenlignelig visuel kvalitet
  • 20–30 % mindre end WebP i de fleste tests
  • Understøtter både lossy og lossless komprimering
  • Understøtter HDR (High Dynamic Range) og wide color gamut med op til 10–12 bit farvedybde
  • Understøtter transparens (alpha-kanal)

Browserunderstøttelsen er nu over 93 % ifølge caniuse.com. Chrome har haft AVIF-support siden version 85, Firefox siden version 93, Safari siden iOS 16 og macOS Ventura, og Edge siden version 121. Kort sagt: alle større browsere — både desktop og mobil — er med.

Den primære ulempe? Encoding-hastighed. AVIF-encoding er 2–10 gange langsommere end WebP. I en build-pipeline er det sjældent et problem, men det kan være en reel flaskehals, hvis du konverterer brugeruploadede billeder i realtid.

WebP: den modne og pålidelige mellemmand

WebP blev udviklet af Google helt tilbage i 2010 og er i 2026 det mest etablerede af de moderne formater. Med over 97 % browserunderstøttelse er det simpelthen det sikreste valg:

  • 25–34 % mindre end JPEG ved sammenlignelig kvalitet
  • Hurtigere encoding og decoding end AVIF
  • Understøtter animation (en solid erstatning for GIF)
  • Understøtter transparens
  • Bred værktøjsunderstøttelse overalt

WebP er stadig det bedste valg til animerede billeder, hvor AVIF-understøttelsen fortsat er lidt inkonsistent.

JPEG: fallback for de sidste procent

JPEG forsvinder ikke — men det er nu et fallback-format, ikke dit primære valg. De 5–7 % af brugere på ældre browsere eller nicheenheder skal stadig have en funktionel oplevelse, og JPEG udfylder den rolle pålideligt.

Anbefalet strategi: AVIF → WebP → JPEG

Den optimale strategi i 2026 er enkel: server AVIF som førstevalg, WebP som fallback og JPEG som sidste udvej. Det gøres med HTML's <picture>-element:

<picture>
  <source type="image/avif" srcset="hero.avif">
  <source type="image/webp" srcset="hero.webp">
  <img src="hero.jpg" alt="Hero-billede" width="1200" height="600">
</picture>

Browseren vælger automatisk det første format, den understøtter. Moderne Chrome-brugere får AVIF (50 % besparelse), Safari-brugere på ældre versioner får WebP, og de allersidste får JPEG. Ingen JavaScript påkrævet — det hele sker i browseren.

Responsive billeder med srcset og sizes

At servere det rigtige format er kun halvdelen af løsningen. Den anden halvdel er at servere den rigtige størrelse.

En desktop-bruger med en 27-tommer skærm har brug for et 1920px bredt hero-billede. Men en mobilbruger på en 375px bred iPhone? Absolut ikke. Og alligevel er det præcis, hvad der sker på overraskende mange sites.

Width descriptors (w) og sizes-attributten

Den mest fleksible tilgang bruger srcset med width descriptors og en sizes-attribut, der fortæller browseren, hvor bredt billedet vil blive vist ved forskellige viewport-bredder:

<img
  src="hero-800.jpg"
  srcset="
    hero-400.jpg 400w,
    hero-800.jpg 800w,
    hero-1200.jpg 1200w,
    hero-1600.jpg 1600w,
    hero-2000.jpg 2000w
  "
  sizes="
    (max-width: 600px) 100vw,
    (max-width: 1200px) 80vw,
    60vw
  "
  alt="Hero-billede"
  width="2000"
  height="1000"
>

Her siger sizes-attributten til browseren: "På skærme op til 600px bred fylder billedet hele viewport-bredden (100vw). På skærme op til 1200px fylder det 80 %. Ellers fylder det 60 %." Browseren kombinerer den information med enhedens pixel-densitet og vælger det mest passende billede fra srcset.

Vigtigt: Uden sizes-attributten antager browseren, at billedet fylder hele viewport-bredden — og den vil altid downloade det største billede. Det er en klassisk fejl (og en jeg selv har lavet mere end én gang), der koster unødvendig båndbredde på mobilenheder.

Pixel density descriptors (x) til ikoner og logoer

Til billeder med fast størrelse uanset viewport — logoer, ikoner, avatarer — er pixel density descriptors mere passende:

<img
  src="logo-200.png"
  srcset="
    logo-200.png 1x,
    logo-400.png 2x,
    logo-600.png 3x
  "
  alt="Firmalogo"
  width="200"
  height="60"
>

Browseren vælger logo-400.png på en Retina-skærm (2x pixel-densitet) og logo-200.png på en standard skærm. Simpelt og effektivt.

Det komplette eksempel: format + responsivitet

Okay, lad os kombinere det hele. For den bedste kombination af format-optimering og responsive billeder kan du bruge <picture>-elementet sammen med srcset og sizes:

<picture>
  <source
    type="image/avif"
    srcset="
      hero-400.avif 400w,
      hero-800.avif 800w,
      hero-1200.avif 1200w,
      hero-1600.avif 1600w
    "
    sizes="(max-width: 768px) 100vw, 75vw"
  >
  <source
    type="image/webp"
    srcset="
      hero-400.webp 400w,
      hero-800.webp 800w,
      hero-1200.webp 1200w,
      hero-1600.webp 1600w
    "
    sizes="(max-width: 768px) 100vw, 75vw"
  >
  <img
    src="hero-800.jpg"
    srcset="
      hero-400.jpg 400w,
      hero-800.jpg 800w,
      hero-1200.jpg 1200w,
      hero-1600.jpg 1600w
    "
    sizes="(max-width: 768px) 100vw, 75vw"
    alt="Hero-billede med optimerede formater"
    width="1600"
    height="800"
    fetchpriority="high"
  >
</picture>

Ja, det er mere markup. Men resultatet er, at en mobilbruger på Chrome downloader et 400px bredt AVIF-billede på måske 15 KB — i stedet for et 1600px bredt JPEG på 300 KB. Det er en reduktion på over 95 %. Det er svært at argumentere imod.

Prioritering af LCP-billeder med fetchpriority

Her er noget, mange overser: browseren kan faktisk ikke vide, hvilket billede der er dit vigtigste. Dit hero-billede, der driver din LCP-score? Browseren gætter baseret på position i HTML'en og synlighed i viewporten, men det er ikke altid præcist nok.

fetchpriority="high" på dit LCP-billede

Attributten fetchpriority="high" fortæller browseren eksplicit, at dette billede skal have høj prioritet i download-køen:

<img
  src="hero.avif"
  alt="Hero-billede"
  width="1200"
  height="600"
  fetchpriority="high"
>

I Googles egne tests forbedrede dette LCP fra 2,6 sekunder til 1,9 sekunder — en forbedring på 27 %. Etsy rapporterede en LCP-forbedring på 4 %, og nogle sites ser forbedringer på 20–30 % i lab-tests. For én enkelt attribut er det ganske imponerende.

Vigtige regler for fetchpriority:

  • Brug kun fetchpriority="high"ét billede — dit LCP-billede. Flere high-priority billeder konkurrerer med hinanden og med kritisk CSS/JavaScript.
  • Brug fetchpriority="low" på billeder, der er synlige i viewporten, men ikke vigtige — f.eks. karruselbilleder efter det første.
  • I et <picture>-element sættes attributten på det indre <img>-element, ikke på <source>.

Preload for CSS-baggrundsbilleder

Hvis dit LCP-element er et CSS-baggrundsbillede, kan browseren først opdage det, når CSS'en er parset. Det skaber en forsinkelse, der er helt unødvendig. Løsningen er at preloade billedet i <head>:

<link
  rel="preload"
  as="image"
  href="/images/hero-bg.avif"
  fetchpriority="high"
>

For responsive baggrundsbilleder kan du bruge imagesrcset og imagesizes:

<link
  rel="preload"
  as="image"
  href="/images/hero-bg-800.avif"
  imagesrcset="
    /images/hero-bg-400.avif 400w,
    /images/hero-bg-800.avif 800w,
    /images/hero-bg-1200.avif 1200w
  "
  imagesizes="100vw"
  fetchpriority="high"
>

Lazy loading: gør det rigtigt

Lazy loading er en af de mest effektive teknikker til at reducere initial sideindlæsningstid. Men — og det her er vigtigt — den kan også ødelægge din LCP-score, hvis den bruges forkert.

Den gyldne regel: lazy-load aldrig dit LCP-billede

Ifølge Chrome UX Report har sites, der lazy-loader deres LCP-element, 35 % langsommere LCP. Lad det lige synke ind.

Det er den vigtigste regel i denne sektion: billeder above-the-fold — og især dit hero-billede — skal aldrig have loading="lazy". Aldrig.

Korrekt implementation

For alle billeder under folden er native lazy loading den anbefalede tilgang. Sådan ser det ud i praksis:

<!-- Above-the-fold: INGEN lazy loading, HØJ prioritet -->
<img
  src="hero.avif"
  alt="Hero-billede"
  width="1200"
  height="600"
  fetchpriority="high"
>

<!-- Below-the-fold: lazy loading aktiveret -->
<img
  src="product-1.avif"
  alt="Produktbillede"
  width="400"
  height="400"
  loading="lazy"
>

<!-- Langt nede på siden: lazy loading + lav prioritet -->
<img
  src="testimonial-avatar.avif"
  alt="Kundebillede"
  width="80"
  height="80"
  loading="lazy"
  fetchpriority="low"
>

Undgå JavaScript-baseret lazy loading

I 2026 er der ingen grund til at bruge JavaScript-baserede lazy loading-biblioteker som den gamle lazysizes for standard billeder. Native loading="lazy" er understøttet i alle moderne browsere og kræver nul ekstra JavaScript. Færdig, basta.

Det eneste scenarie, hvor Intersection Observer stadig giver mening, er til mere komplekse use cases — lazy-loadede baggrundsvideoer eller animationer, der skal starte, når de bliver synlige:

// Kun nødvendigt for specielle use cases
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const video = entry.target;
      video.src = video.dataset.src;
      video.play();
      observer.unobserve(video);
    }
  });
}, { rootMargin: '200px' });

document.querySelectorAll('video[data-src]').forEach(video => {
  observer.observe(video);
});

Forebyg layout shifts med width og height

Billeder uden eksplicitte dimensioner er en af de hyppigste årsager til dårlige CLS-scores (Cumulative Layout Shift). Når browseren downloader et billede uden at kende dets dimensioner, kan den ikke reservere plads — og når billedet loader, skubber det alt indhold nedad. Dine brugere hader det, og Google straffer det.

Løsningen er heldigvis simpel: angiv altid width og height på dine <img>-elementer:

<!-- Dårligt: ingen dimensioner, forårsager layout shift -->
<img src="product.avif" alt="Produkt">

<!-- Godt: browseren reserverer plads baseret på aspect ratio -->
<img src="product.avif" alt="Produkt" width="400" height="300">

<!-- Endnu bedre: kombiner med CSS for fleksibel skalering -->
<style>
  img {
    max-width: 100%;
    height: auto;
  }
</style>
<img src="product.avif" alt="Produkt" width="400" height="300">

Browseren bruger width- og height-attributterne til at beregne aspect ratio og reservere den korrekte plads, selv før billedet er downloadet. Når CSS'en siger height: auto, skalerer billedet responsivt — men uden de irriterende layout shifts.

Automatisering i din build-pipeline

Manuel billedoptimering skalerer ikke. Punktum. I et professionelt setup bør billedkonvertering og -optimering være en automatiseret del af din build-pipeline.

Konvertering med Sharp (Node.js)

Sharp er det hurtigste Node.js-bibliotek til billedbehandling, og det bruges bredt i produktionsmiljøer. Her er et script, der genererer alle de varianter, du har brug for:

import sharp from 'sharp';
import { glob } from 'glob';
import path from 'path';

const WIDTHS = [400, 800, 1200, 1600];
const QUALITY = { avif: 50, webp: 75, jpeg: 80 };

async function optimizeImages() {
  const images = await glob('src/images/**/*.{jpg,jpeg,png}');

  for (const imagePath of images) {
    const name = path.basename(imagePath, path.extname(imagePath));
    const dir = 'dist/images';

    for (const width of WIDTHS) {
      const pipeline = sharp(imagePath).resize(width);

      // AVIF
      await pipeline
        .clone()
        .avif({ quality: QUALITY.avif })
        .toFile(`${dir}/${name}-${width}.avif`);

      // WebP
      await pipeline
        .clone()
        .webp({ quality: QUALITY.webp })
        .toFile(`${dir}/${name}-${width}.webp`);

      // JPEG fallback
      await pipeline
        .clone()
        .jpeg({ quality: QUALITY.jpeg, progressive: true })
        .toFile(`${dir}/${name}-${width}.jpg`);
    }
  }
}

optimizeImages();

Det genererer 12 varianter af hvert billede (4 bredder × 3 formater). Det lyder måske af meget, men storage er billigt — og båndbreddebesparelsen for dine brugere er massiv. Det er en afvejning, der er værd at lave.

CDN-baseret format-negotiation

En alternativ tilgang er at lade dit CDN håndtere formatkonverteringen automatisk baseret på brugerens Accept-header. Tjenester som Cloudflare Image Resizing, Imgix og Cloudinary kan servere AVIF til browsere, der understøtter det, og falde tilbage til WebP eller JPEG — alt fra én enkelt URL.

Med denne tilgang slipper du for at generere og opbevare flere formater i din build-pipeline. CDN'et klarer konvertering on-the-fly og cacher resultatet. Bare husk at konfigurere Vary: Accept-headeren, så cachen respekterer formatforskelle.

Vite-plugin til billedoptimering

Bruger du Vite som build-tool? Så kan du integrere billedoptimering direkte i din build:

// vite.config.js
import { defineConfig } from 'vite';
import { ViteImageOptimizer } from 'vite-plugin-image-optimizer';

export default defineConfig({
  plugins: [
    ViteImageOptimizer({
      png: { quality: 80 },
      jpeg: { quality: 80 },
      webp: { quality: 75 },
      avif: { quality: 50 },
    }),
  ],
});

Måling og validering af dine forbedringer

Optimering uden måling er gætværk. Og det gælder i særdeleshed for billeder, hvor effekten kan variere enormt afhængigt af dit specifikke setup.

Lighthouse billedrelaterede audits

Lighthouse har flere audits, der specifikt fokuserer på billeder:

  • Properly size images: Identificerer billeder, der serveres markant større end den viste størrelse.
  • Serve images in next-gen formats: Peger på billeder, der ville drage fordel af AVIF eller WebP.
  • Efficiently encode images: Finder billeder med suboptimal komprimering.
  • Image elements do not have explicit width and height: Advarer om manglende dimensioner, der kan give layout shifts.
  • Preload Largest Contentful Paint image: Foreslår preloading, hvis dit LCP-billede opdages sent.

Chrome DevTools Network-panelet

Et nyttigt trick: I Network-panelet kan du aktivere kolonnen "Priority" (højreklik på kolonneoverskrifterne) for at se, hvilken prioritet browseren giver hvert billede. Verificer, at dit LCP-billede har "High" prioritet, og at below-the-fold billeder har "Low".

Web Vitals-biblioteket til feltdata

For at måle den reelle effekt hos dine faktiske brugere kan du bruge Googles web-vitals-bibliotek til at indsamle LCP-data fra feltet:

import { onLCP } from 'web-vitals';

onLCP((metric) => {
  console.log('LCP:', metric.value, 'ms');

  // Identificer LCP-elementet
  const entry = metric.entries[metric.entries.length - 1];
  if (entry?.element) {
    console.log('LCP-element:', entry.element.tagName, entry.element.src);
  }

  // Send til analytics
  navigator.sendBeacon('/analytics/lcp', JSON.stringify({
    value: metric.value,
    rating: metric.rating,
    element: entry?.element?.tagName,
    url: entry?.url
  }));
});

Tjekliste: billedoptimering i 2026

Her er en hurtig tjekliste, du kan køre igennem for at sikre, at dine billeder er fuldt optimerede:

  1. Server billeder i AVIF med WebP og JPEG som fallback via <picture>-elementet
  2. Brug srcset med width descriptors og sizes til responsive billeder
  3. Tilføj fetchpriority="high" til dit LCP-billede — og kun det ene
  4. Preload LCP-billeder, der er CSS-baggrundsbilleder eller opdages sent
  5. Brug loading="lazy" på alle billeder under folden
  6. Angiv altid width og height for at undgå layout shifts
  7. Automatiser konvertering og komprimering i din build-pipeline
  8. Overvej CDN-baseret format-negotiation for enklere infrastruktur
  9. Mål med Lighthouse og feltdata — optimering uden data er gætværk

Ofte stillede spørgsmål

Hvordan påvirker billeder Core Web Vitals?

Billeder påvirker alle tre Core Web Vitals. Store eller sent indlæste billeder forsinker LCP direkte. Billeder uden eksplicitte dimensioner forårsager layout shifts, der skader CLS-scoren. Og tung billeddekodning på hovedtråden kan i sjældne tilfælde påvirke INP. Den vigtigste kobling er mellem billeder og LCP — da det billede, der udløser LCP, typisk er sidens største synlige element ved indlæsning.

Skal jeg bruge AVIF eller WebP i 2026?

Brug begge i en fallback-kæde — det er det korte svar. AVIF giver den bedste komprimering (op til 50 % mindre end JPEG), mens WebP har bredere browserunderstøttelse (97 % vs. 93 %) og hurtigere encoding. Ved at bruge <picture>-elementet med AVIF som første valg og WebP som fallback får du det bedste fra begge verdener. Hvis du kun kan vælge ét format, er WebP det sikreste valg.

Hvad er fetchpriority, og hvornår skal jeg bruge det?

fetchpriority er en HTML-attribut, der giver browseren et hint om, hvilken prioritet en ressource skal have i download-køen. Brug fetchpriority="high" på dit LCP-billede for at sikre, at det downloades først. Brug det kun på ét billede — flere high-priority billeder modarbejder faktisk hinanden. Googles tests viser LCP-forbedringer på op til 27 % med denne ene attribut.

Hvorfor er lazy loading af mit hero-billede dårligt?

Lazy loading forsinker download af et billede, til det er tæt på at blive synligt i viewporten. For dit hero-billede — som allerede er synligt ved sideindlæsning — betyder det en helt unødvendig forsinkelse. Chrome UX Report-data viser, at sites med lazy-loadet LCP-element har 35 % langsommere LCP. Brug loading="lazy" udelukkende på billeder under folden.

Hvordan automatiserer jeg billedoptimering i min workflow?

Der er to hovedtilgange. Build-time optimering bruger værktøjer som Sharp (Node.js), ImageMagick eller Vite/Webpack-plugins til at generere alle formatvarianter under build-processen. CDN-baseret optimering lader tjenester som Cloudflare Image Resizing, Imgix eller Cloudinary håndtere formatkonvertering og resizing automatisk baseret på brugerens browser. CDN-tilgangen er nemmere at sætte op, men giver lidt mindre kontrol over komprimeringskvaliteten.

Om Forfatteren Editorial Team

Our team of expert writers and editors.