CSS e web

Prestazioni dei gradienti CSS: rallentano un sito?

Un gradiente CSS statico è quasi gratis. I costi vengono da ciò che si fa con i gradienti: sfocature enormi, sfondi che si ridisegnano durante lo scorrimento e animazioni che non finiscono mai. Ecco come distinguere.

GradientlyAccount Gradiently verificato··6 min di lettura
Copertina: Burnt Mist · GR·3M7T·BR

In breve

  • Un gradiente CSS statico costa quasi nulla da caricare, perché è una riga di testo e non un file da scaricare e decodificare.
  • I gradienti costano tempo di disegno, che cresce con l’area dipinta e il numero di livelli, ma un gradiente statico viene dipinto una volta e poi riusato.
  • I veri rischi per le prestazioni sono i grandi filtri di sfocatura, gli sfondi che si ridisegnano durante lo scorrimento e le animazioni di gradiente che ridisegnano a ogni fotogramma.
  • Animare transform o opacity su un livello di gradiente è di solito molto più economico che animare background-position o i punti di colore.
  • L’unica risposta affidabile per una pagina specifica è misurarla, con l’evidenziazione del disegno e una registrazione Performance negli strumenti per sviluppatori del browser.
In questa pagina

Le buone prestazioni dei gradienti CSS sono il caso normale: un gradiente statico non rallenta un sito in modo percepibile. È una riga di testo, quindi non c’è nulla da scaricare, nulla da decodificare e nulla da aspettare. I gradienti costano un po’ di tempo di disegno, come ogni altro colore della pagina. Le pagine lente nascono da alcuni schemi precisi costruiti sopra i gradienti: grandi sfocature, ridisegni durante lo scorrimento e animazioni che ridisegnano a ogni fotogramma. Questa guida mostra quali sono e come controllare la tua pagina.

Caricamento: gradienti contro immagini

background: linear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6); è lungo 67 caratteri. Arriva dentro il tuo foglio di stile, non richiede altre richieste e si vede nitido a qualsiasi dimensione e densità di pixel. Uno sfondo con immagine richiede una richiesta a parte, va decodificato prima di essere disegnato e deve essere abbastanza grande per schermi ampi e ad alta densità.

67 caratteri di CSSlinear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6)
Questo intero sfondo, a qualsiasi dimensione, costa meno di una frase di testo da caricare.
SfondoDownloadMemoria decodificata a 1920×1080
Gradiente CSSPoche decine di byte nel tuo CSSNessuna bitmap da conservare; dipinto quando serve
Immagine compressa (AVIF, WebP, JPEG)Un file separato, spesso da decine a centinaia di kilobyteCirca 8,3 MB (larghezza × altezza × 4 byte)
Stessa immagine a 3840×2160 per un 4K nitidoAncora più grandeCirca 33 MB
Le immagini decodificate vengono tenute come bitmap complete, qualunque sia la dimensione del file. Le cifre di memoria sono semplice aritmetica: pixel per quattro byte.

Quindi per sfondi semplici e moderatamente a più livelli, il CSS vince sempre nel caricamento. Le immagini hanno ancora senso quando lo sfondo è davvero complesso, come un gradiente mesh pittorico con molti punti di colore o una texture fotografica. Allora il compromesso è peso del file in cambio di ricchezza visiva, e spesso ne vale la pena.

Disegno: cosa costa un gradiente sullo schermo

Per mostrare un gradiente, il browser calcola un colore per ogni pixel che copre: è il disegno. Il lavoro cresce con l’area dipinta, il numero di livelli di gradiente sovrapposti e gli effetti applicati sopra. Per uno sfondo statico accade una volta, e il risultato viene riusato mentre scorri o interagisci, a meno che qualcosa lo invalidi.

Dipinto una volta

  • Un gradiente statico su una scheda o un hero
  • Più bagliori radiali sovrapposti che non si muovono
  • Una texture di rumore ripetuta sopra un gradiente
  • Un bordo a gradiente disegnato con gli sfondi

Dipinto più e più volte

  • Animare background-position o i punti di colore
  • background-attachment: fixed durante lo scorrimento
  • Sfocatura backdrop-filter su contenuto in movimento
  • Un elemento con un gradiente che cambia dimensione di continuo

I rischi veri: sfocatura, sfondi fissi e animazione

Grandi sfocature. filter: blur() e backdrop-filter campionano molti pixel circostanti per ogni pixel, e il lavoro cresce sia con il raggio della sfocatura sia con l’area. Un gradiente sfocato dipinto una volta di solito va bene. Un backdrop-filter su contenuto che scorre sotto deve essere ricalcolato mentre quel contenuto si muove, ed è qui che le interfacce glassmorphism tendono a scattare sui telefoni modesti.

Sfondi fissi. background-attachment: fixed mantiene fermo uno sfondo mentre la pagina scorre, il che può costringerlo a ridisegnarsi a ogni passo di scorrimento. Se vuoi un gradiente che resta fermo, un elemento con position: fixed dietro il contenuto di solito costa meno, perché il browser può muoverlo come livello separato.

Animazione. Spostare background-position o animare i punti di colore tramite @property ridisegna l’elemento a ogni fotogramma. Su un pulsante è banale. Su un hero a schermo intero è un lavoro continuo finché la pagina è aperta, che si traduce in calore e consumo di batteria sui telefoni.

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); } }
Due hero animati. Il secondo anima transform, che i browser di solito gestiscono sul compositore senza ridisegnare.

La guida ai gradienti animati in CSS ha l’insieme completo di tecniche, dalla più economica alla più flessibile.

Livelli e will-change

Promuovere un elemento a un livello proprio del compositore, con will-change: transform o un’animazione di trasformazione attiva, è ciò che rende possibile un’animazione economica. Non è gratis: ogni livello tiene la propria bitmap nella memoria grafica, circa larghezza × altezza × 4 byte in pixel del dispositivo. Un livello sovradimensionato per lo sfondo di un hero va bene. Decine di schede promosse, ciascuna con il proprio livello di gradiente, possono usare più memoria di quanto risparmino in tempo di disegno. Aggiungi will-change agli elementi che si animano davvero, non come regola generale.

SchemaLavoro del browserAlternativa più economica
background-position animato su un heroRidisegno a ogni fotogrammatransform su un livello di gradiente sovradimensionato
background-attachment: fixedRidisegno durante lo scorrimentoUn livello di gradiente position: fixed dietro il contenuto
backdrop-filter su contenuto che scorreSfocatura ricalcolata mentre il contenuto si muoveUn livello statico già sfocato, o un’area sfocata più piccola
Filtro di rumore SVG dal vivo su un grande elementoIl filtro passa su ogni pixel ridisegnatoUna piccola immagine di rumore ripetuta
will-change su ogni schedaMolti livelli tenuti in memoria graficawill-change solo su ciò che si anima
Schemi di gradiente comuni, cosa fanno fare al browser e il modo più leggero di ottenere lo stesso aspetto.

Come misurare le prestazioni di un gradiente

  1. 1

    Attiva l’evidenziazione del disegno

    Negli strumenti per sviluppatori di Chrome, apri il pannello Rendering e attiva Paint flashing. Tutto ciò che lampeggia in verde mentre nulla dovrebbe cambiare si sta ridisegnando.

  2. 2

    Registra una traccia Performance

    Registra qualche secondo di scorrimento o di animazione a riposo nel pannello Performance. Guarda quanta parte di ogni fotogramma va al disegno e se cadono dei fotogrammi.

  3. 3

    Rallenta la CPU

    Usa la limitazione della CPU del pannello Performance per simulare un dispositivo più lento. Un hero fluido su un portatile veloce può faticare su un telefono di fascia media.

  4. 4

    Controlla il pannello Layers

    Vedi quanti livelli del compositore esistono e quanta memoria usano. Un numero inaspettato di livelli di solito significa che will-change è usato troppo.

  5. 5

    Prova il dispositivo vero

    Finisci su un telefono vero. Calore e consumo di batteria dovuti a un’animazione costante sono facili da non notare su un desktop.

La guida di web.dev alle prestazioni di rendering spiega la pipeline dietro questi strumenti: stile, layout, disegno e composizione. Sapere quale fase innesca il tuo gradiente ti dice se costa poco.

Una checklist sulle prestazioni per i gradienti

  • Usa gradienti CSS per sfondi semplici e a più livelli; immagini solo quando l’aspetto le richiede davvero.
  • Tieni modesti i raggi di sfocatura ed evita backdrop-filter su grandi aree che scorrono.
  • Sostituisci background-attachment: fixed con un livello a posizione fissa.
  • Anima transform o opacity, non background-position, sulle aree grandi.
  • Le animazioni lente e ambientali possono fermarsi del tutto per chi preferisce il movimento ridotto.
  • Aggiungi la grana come piccola immagine ripetuta, non come filtro SVG dal vivo su un grande elemento; vedi la texture di rumore in CSS.
  • Misura prima e dopo con l’evidenziazione del disegno e una registrazione Performance.

Le domande più frequenti

I gradienti CSS rallentano un sito?

Quelli statici no, in modo percepibile. Non richiedono download e vengono dipinti una volta. A costare in prestazioni sono grandi sfocature, sfondi fissi e animazione costante.

Un gradiente CSS è più veloce di un’immagine di sfondo?

Di solito sì. Un gradiente è fatto di poche decine di byte di CSS, senza richieste né decodifica, mentre un’immagine richiede un download e viene tenuta in memoria come bitmap completa.

I gradienti animati fanno male alle prestazioni?

Animare background-position o i punti di colore ridisegna a ogni fotogramma, e conta sulle aree grandi. Animare transform o opacity su un livello di gradiente di solito costa molto meno.

Perché il mio sfondo a gradiente sfocato è lento?

La sfocatura campiona molti pixel vicini per ogni pixel, quindi il costo cresce con raggio e area. Il caso peggiore è backdrop-filter su contenuto che scorre o si anima.

Come controllo se il mio gradiente si sta ridisegnando?

Attiva Paint flashing nel pannello Rendering degli strumenti per sviluppatori di Chrome. Le aree che continuano a lampeggiare a pagina ferma si stanno ridisegnando.

Condividi questa guida

Scritto da GradientlyAccount Gradiently verificato

Il team dietro Gradiently, uno strumento di design costruito attorno ai Mark: gradienti vivi che fanno sembrare tuo tutto ciò che progetti.

Vedi il nostro profilo
Tutte le guide su CSS e web