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à.
linear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6)| Sfondo | Download | Memoria decodificata a 1920×1080 |
|---|---|---|
| Gradiente CSS | Poche decine di byte nel tuo CSS | Nessuna bitmap da conservare; dipinto quando serve |
| Immagine compressa (AVIF, WebP, JPEG) | Un file separato, spesso da decine a centinaia di kilobyte | Circa 8,3 MB (larghezza × altezza × 4 byte) |
| Stessa immagine a 3840×2160 per un 4K nitido | Ancora più grande | Circa 33 MB |
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-positiono i punti di colore background-attachment: fixeddurante lo scorrimento- Sfocatura
backdrop-filtersu 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.
/* 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); } }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.
| Schema | Lavoro del browser | Alternativa più economica |
|---|---|---|
background-position animato su un hero | Ridisegno a ogni fotogramma | transform su un livello di gradiente sovradimensionato |
background-attachment: fixed | Ridisegno durante lo scorrimento | Un livello di gradiente position: fixed dietro il contenuto |
backdrop-filter su contenuto che scorre | Sfocatura ricalcolata mentre il contenuto si muove | Un livello statico già sfocato, o un’area sfocata più piccola |
| Filtro di rumore SVG dal vivo su un grande elemento | Il filtro passa su ogni pixel ridisegnato | Una piccola immagine di rumore ripetuta |
will-change su ogni scheda | Molti livelli tenuti in memoria grafica | will-change solo su ciò che si anima |
Come misurare le prestazioni di un gradiente
- 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
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
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
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
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-filtersu grandi aree che scorrono. - Sostituisci
background-attachment: fixedcon un livello a posizione fissa. - Anima
transformoopacity, nonbackground-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.
Scritto da Gradiently
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


