CSS og web

Ydeevne for CSS-gradienter: gør gradienter et website langsomt?

En statisk CSS-gradient er næsten gratis. Omkostningerne kommer af det, folk gør med gradienter: enorme sløringer, baggrunde der gentegnes ved scroll, og animationer, der aldrig stopper. Sådan kender du forskel.

GradientlyVerificeret Gradiently-konto··6 min. læsning
Forside: Burnt Mist · GR·3M7T·BR

Kort fortalt

  • En statisk CSS-gradient koster næsten intet at indlæse, fordi den er en linje tekst og ikke en fil, der skal downloades og afkodes.
  • Gradienter koster tegnetid, som vokser med det tegnede areal og antallet af lag, men en statisk gradient tegnes én gang og genbruges derefter.
  • De reelle ydeevnerisici er store slørefiltre, baggrunde der gentegnes under scroll, og gradientanimationer, der gentegner hver frame.
  • At animere transform eller opacity på et gradientlag er som regel langt billigere end at animere background-position eller farvestop.
  • Det eneste pålidelige svar for en bestemt side er at måle, med paint flashing og en Performance-optagelse i browserens udviklerværktøjer.
På denne side

God ydeevne for CSS-gradienter er det normale: en statisk gradient gør ikke et website langsomt på nogen måde, du kan mærke. Den er en linje tekst, så der er intet at downloade, intet at afkode og intet at vente på. Gradienter koster lidt tegnetid, ligesom enhver anden farve på siden. Langsomme sider kommer af nogle få bestemte mønstre bygget oven på gradienter: store sløringer, gentegning under scroll og animationer, der gentegner hver frame. Denne guide viser, hvad der er hvad, og hvordan du tjekker din egen side.

Indlæsning: gradienter mod billeder

background: linear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6); er 67 tegn. Den kommer med i dit stylesheet, kræver ingen ekstra forespørgsel og gengives skarpt i enhver størrelse og pixeltæthed. En billedbaggrund kræver sin egen forespørgsel, skal afkodes, før den kan tegnes, og skal være stor nok til store skærme med høj tæthed.

67 tegn CSSlinear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6)
Hele denne baggrund, i enhver størrelse, koster mindre at indlæse end en sætning tekst.
BaggrundDownloadAfkodet hukommelse ved 1920×1080
CSS-gradientNogle få dusin bytes i din CSSIntet bitmap at holde. Tegnes efter behov
Komprimeret billede (AVIF, WebP, JPEG)En separat fil, ofte titusinder til hundredvis af kilobytesOmkring 8,3 MB (bredde × højde × 4 bytes)
Samme billede i 3840×2160 til skarpt 4KIgen størreOmkring 33 MB
Afkodede billeder holdes som fulde bitmaps, uanset filstørrelsen. Hukommelsestallene er simpel aritmetik: pixler gange fire bytes.

Til enkle og moderat lagdelte baggrunde vinder CSS derfor altid på indlæsning. Billeder giver stadig mening, når baggrunden er virkelig kompleks, som en malerisk mesh-gradient med mange farvepunkter eller en fotografisk tekstur. Så er handlen filvægt mod visuel rigdom, og den kan ofte betale sig.

Tegning: hvad en gradient koster på skærmen

For at vise en gradient beregner browseren en farve for hver pixel, den dækker: det er tegning. Arbejdet vokser med det tegnede areal, antallet af stablede gradientlag og eventuelle effekter oven på. For en statisk baggrund sker det én gang, og resultatet genbruges, mens du scroller eller interagerer, medmindre noget ugyldiggør det.

Tegnet én gang

  • En statisk gradient på et kort eller en hero
  • Flere lagdelte radiale skær, der ikke bevæger sig
  • En flisebelagt støjtekstur over en gradient
  • En gradientkant tegnet med baggrunde

Tegnet igen og igen

  • Animation af background-position eller farvestop
  • background-attachment: fixed under scroll
  • backdrop-filter-sløring over indhold i bevægelse
  • Et element med en gradient, der ændrer størrelse løbende

De reelle risici: sløring, faste baggrunde og animation

Store sløringer. filter: blur() og backdrop-filter aflæser mange omgivende pixler for hver pixel, og arbejdet vokser med både sløringsradius og areal. En sløret gradient, der tegnes én gang, er som regel fin. En backdrop-filter over indhold, der scroller nedenunder, skal genberegnes, mens indholdet bevæger sig, og det er dér, glassmorphism-brugerflader har tendens til at hakke på beskedne telefoner.

Faste baggrunde. background-attachment: fixed holder en baggrund stille, mens siden scroller, hvilket kan tvinge den til at gentegne ved hvert scrolltrin. Vil du have en gradient, der bliver stående, er et position: fixed-element bag indholdet som regel billigere, fordi browseren kan flytte det som et separat lag.

Animation. At flytte background-position eller animere farvestop gennem @property gentegner elementet hver frame. På en knap er det trivielt. På en helskærmshero er det kontinuerligt arbejde, så længe siden er åben, hvilket viser sig som varme og batteriforbrug på telefoner.

css
/* repaints the whole hero every frame */
.hero--costly {
  background: linear-gradient(120deg, #1e1b4b, #7c3aed, #f472b6);
  background-size: 300% 300%;
  animation: pan 12s ease-in-out infinite alternate;
}

/* the browser can usually just move a finished layer */
.hero--cheap::before {
  content: "";
  position: absolute;
  inset: -50%;
  z-index: -1;
  background: conic-gradient(#1e1b4b, #7c3aed, #f472b6, #1e1b4b);
  animation: turn 40s linear infinite;
}

@keyframes pan { to { background-position: 100% 50%; } }
@keyframes turn { to { transform: rotate(1turn); } }
To animerede heroer. Den anden animerer transform, som browsere som regel kan håndtere på compositoren uden at gentegne.

Guiden om CSS-animerede gradienter har alle teknikkerne, fra den billigste til den mest fleksible.

Lag og will-change

At løfte et element op i sit eget compositor-lag, med will-change: transform eller en aktiv transformanimation, er det, der gør billig animation mulig. Det er ikke gratis: hvert lag holder sit eget bitmap i grafikhukommelsen, cirka bredde × højde × 4 bytes i enhedspixler. Ét overstort lag til en hero-baggrund er fint. Dusinvis af løftede kort, hver med sit eget gradientlag, kan bruge mere hukommelse, end de sparer i tegnetid. Tilføj will-change til de elementer, der rent faktisk animerer, ikke som en generel regel.

MønsterBrowserens arbejdeBilligere alternativ
Animeret background-position på en heroGentegning hver frametransform på et overstort gradientlag
background-attachment: fixedGentegning under scrollEt position: fixed-gradientlag bag indholdet
backdrop-filter over indhold, der scrollerSløring genberegnes, mens indholdet bevæger sigEt forsløret statisk lag eller et mindre sløret område
Levende SVG-støjfilter på et stort elementFilteret kører over hver gentegnet pixelEt lille flisebelagt støjbillede
will-change på hvert kortMange lag holdt i grafikhukommelsenwill-change kun på det, der animerer
Almindelige gradientmønstre, hvad de får browseren til at gøre, og den lettere vej til det samme udtryk.

Sådan måler du gradienters ydeevne

  1. 1

    Slå paint flashing til

    I Chrome DevTools åbner du panelet Rendering og aktiverer Paint flashing. Alt, der blinker grønt, mens intet bør ændre sig, gentegnes.

  2. 2

    Optag et Performance-spor

    Optag nogle få sekunder scroll eller ledig animation i panelet Performance. Se, hvor stor en del af hver frame der går til tegning, og om der springes frames over.

  3. 3

    Bremse CPU’en

    Brug CPU-drosling i panelet Performance til at simulere en langsommere enhed. En hero, der er jævn på en hurtig laptop, kan hakke på en mellemklassetelefon.

  4. 4

    Tjek panelet Layers

    Se, hvor mange compositor-lag der findes, og hvor meget hukommelse de bruger. Uventet mange lag betyder som regel, at will-change er overbrugt.

  5. 5

    Test på den rigtige enhed

    Afslut på en rigtig telefon. Varme og batteriforbrug fra konstant animation er lette at overse på en stationær.

web.dev’s guide til renderingsydeevne forklarer pipelinen bag disse værktøjer: style, layout, paint og composite. Når du ved, hvilket trin din gradient udløser, ved du, om den er billig.

En tjekliste til gradienters ydeevne

  • Brug CSS-gradienter til enkle og lagdelte baggrunde. Brug kun billeder, når udtrykket virkelig kræver dem.
  • Hold sløringsradius moderat, og undgå backdrop-filter over store områder, der scroller.
  • Erstat background-attachment: fixed med et lag med fast position.
  • Animér transform eller opacity, ikke background-position, på store områder.
  • Langsomme, stemningsskabende animationer kan stoppe helt for brugere med reduceret bevægelse.
  • Tilføj korn som et lille flisebelagt billede og ikke som et levende SVG-filter på et stort element. Se CSS-støjtekstur.
  • Mål før og efter med paint flashing og en Performance-optagelse.

Spørgsmål, folk stiller

Gør CSS-gradienter et website langsomt?

Statiske CSS-gradienter gør ikke på en mærkbar måde. De kræver ingen download og tegnes én gang. Store sløringer, faste baggrunde og konstant animation er det, der koster ydeevne.

Er en CSS-gradient hurtigere end et baggrundsbillede?

Som regel ja. En gradient er nogle få dusin bytes CSS uden forespørgsel eller afkodning, mens et billede kræver en download og holdes i hukommelsen som et fuldt bitmap.

Er animerede gradienter dårlige for ydeevnen?

At animere background-position eller farvestop gentegner hver frame, hvilket betyder noget på store områder. At animere transform eller opacity på et gradientlag er som regel meget billigere.

Hvorfor er min slørede gradientbaggrund langsom?

Sløring aflæser mange nabopixler for hver pixel, så prisen vokser med radius og areal. Den er værst med backdrop-filter over indhold, der scroller eller animerer.

Hvordan tjekker jeg, om min gradient gentegnes?

Aktivér Paint flashing i panelet Rendering i Chrome DevTools. Områder, der bliver ved med at blinke, mens siden er ledig, gentegnes.

Del denne guide

Skrevet af GradientlyVerificeret Gradiently-konto

Holdet bag Gradiently, et designværktøj bygget om Marks: levende gradienter, der får alt, du designer, til at ligne dig.

Se vores profil