Artikel

CSS containment — Isolér rendering og accelerér layout

CSS containment via contain og content-visibility isolerer rendering-scope. content-visibility: auto er den nemmeste quick win — browseren skipper rendering af off-screen indhold til det er nødvendigt.

Browsers layout-motor behandler en sides elementer som et sammenkoblet system — en ændring i ét element kan potentielt kræve genberegning af hele sidens layout. CSS containment bryder denne kobling og fortæller browseren at visse elementer er isolerede, hvilket muliggør aggressiv optimering.

contain-egenskaben

contain styrer hvilke aspekter af et elements rendering der er isoleret:

/* Layout-isolation: interne ændringer påvirker ikke eksterne elementer */
.card { contain: layout; }

/* Paint-isolation: elementet males i eget lag, clippes til sin box */
.widget { contain: paint; }

/* Size-isolation: elementets størrelse er uafhængig af indhold */
.fixed-size { contain: size; }

/* content = layout + paint (anbefalet kombination) */
.isolated { contain: content; }

/* strict = size + layout + paint (stærkest) */
.fully-isolated { contain: strict; }

Praktisk effekt: En komponent med contain: layout der ændrer intern tekst kræver kun layout-genberegning inden for komponentens grænse — ikke for resten af siden. På en side med hundredvis af sådanne komponenter er gevinsten betydelig.

content-visibility: auto

content-visibility: auto er den nemmeste performance-win for lange sider:

article {
  content-visibility: auto;
  contain-intrinsic-size: auto 400px;  /* Estimeret størrelse for reserveret plads */
}

Browseren skipper rendering af article-elementer der er off-screen. De renderes on-demand når de nærmer sig viewport. Effekten er dokuemnteret af Chrome-teamet til 7x hurtigere initial rendering på lange nyhedssider.

contain-intrinsic-size er nødvendig for at undgå layout-skift: angiv en estimeret højde så browseren kan reservere korrekt plads i scrollbaren, selv om indholdet ikke er rendered.

Hvad der ikke renderes (men stadig er til stede):

  • Elementet er i DOM og tilgængeligt via JavaScript
  • Søgefunktionen (Ctrl+F) finder stadig tekst i ikke-renderede elementer
  • Accessibility-træ inkluderer elementet

@layer og CSS-layers

CSS Cascade Layers (@layer) er ikke direkte containment, men reducerer specificitets-beregnings-kompleksitet og gør CSS mere forudsigeligt:

@layer reset, base, components, utilities;

@layer reset {
  *, *::before, *::after { box-sizing: border-box; }
}

@layer components {
  .btn { /* component styles */ }
}

@layer utilities {
  .sr-only { /* utility styles */ }
}

will-change — eksplicit GPU-lag

will-change informerer browseren om kommende ændringer og promoverer element til eget compositor-lag:

/* Godt: animerede elementer */
.animated-card {
  will-change: transform;
}

/* Dårligt: global brug — for mange lag bruger GPU-hukommelse */
* { will-change: transform; }  /* Aldrig gør dette */

Brug will-change kun på elementer der faktisk animerer, og overvej at fjerne det dynamisk via JavaScript efter animationen:

element.addEventListener('animationend', () => {
  element.style.willChange = 'auto';
});

CLS og containment

contain: size forhindrer at dynamisk indsat indhold kan ændre forælderelementets størrelse — en direkte CLS-forebyggelse. Kombineret med eksplicitte width og height på billeder og embeds dækker det de hyppigste CLS-årsager.

content-visibility: auto kan potentielt introducere CLS hvis contain-intrinsic-size er unøjagtig — den estimerede og faktiske størrelse afviger. Test med CLS-monitorering efter implementering. → Denne artikel er en del af Web Performance — Core Web Vitals og teknisk hastighed.

Andre artikler i samme emne

Ofte stillede spørgsmål

Hvad gør content-visibility: auto?
content-visibility: auto instruerer browseren til at skippe rendering (layout og paint) af elementer der er off-screen. Elementet er stadig i DOM og er tilgængeligt for søgning og accessibility-træ, men browser beregner ikke layout og maler ikke pixels til det er ved at blive synligt. Effekten er størst på lange sider med meget indhold under fold.
Hvad er contain: layout vs contain: strict?
contain: layout fortæller browseren at elementets indre layout ikke påvirker ydre elementer — en typografisk ændring inde i elementet kræver ikke genberegning af hele sidens layout. contain: strict kombinerer size, layout og paint containment — det stærkeste niveau. contain: content (layout + paint) er mest praktisk og det MDN anbefaler som udgangspunkt.
Hvad er contain-intrinsic-size og hvornår er det nødvendigt?
contain-intrinsic-size angiver en estimeret størrelse på et element med content-visibility: auto. Uden det vil browseren behandle off-screen elementer som 0px høje, hvilket kan forstyrre scrollbar-beregning og give en hakkende scroll-oplevelse. Angiv en estimeret gennemsnitlig højde — værdien behøver ikke være præcis, men bør ligge tæt på det typiske indhold. Browsere understøtter auto-nøgleordet der husker den faktiske størrelse efter første rendering.
Er CSS containment understøttet af alle browsere?
content-visibility og contain er understøttet i alle moderne browsere — Chrome, Firefox, Safari og Edge. contain-intrinsic-size med auto-nøgleordet har bred support siden 2023. Test altid med fallback i tankerne: manglende support medfører blot at containment-optimeringen ikke aktiveres — siden fungerer stadig korrekt. Tjek aktuel browsersupport på MDN.
Hvad er performance-gevinsten ved content-visibility: auto på en lang side?
Google Chrome-teamet dokumenterede op til 7x hurtigere initial rendering-tid på lange nyhedssider med content-visibility: auto. Gevinsten er størst på sider med meget indhold under fold — lange artikler, produktlister, nyhedsfeeds. For sider der primært vises above the fold er gevinsten minimal, da browseren alligevel skal rendere det synlige indhold.

Placering i ordbogen

CSS containment — Isolér rendering og accelerér layout