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
- 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
- Font-optimering — Webfonts, FOUT og SEO
- 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 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
- 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
- Font-optimering — Webfonts, FOUT og SEO
- 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