CSS e web

Gradiente mesh in CSS: come costruirlo con livelli radiali

In CSS non esiste mesh-gradient(). Ecco il metodo a livelli che ne crea uno convincente, la sfocatura e la grana che lo rifiniscono e quando un’immagine o uno shader sono la scelta migliore.

GradientlyAccount Gradiently verificato··6 min di lettura
Copertina: August Basin · GR·Y97R·RQ

In breve

  • Il CSS non ha una funzione nativa per il gradiente mesh, quindi un gradiente mesh in CSS si costruisce sovrapponendo più gradienti radiali su un colore di base piatto.
  • Ogni livello è una pozza di colore nella sua posizione che sfuma verso il trasparente, e le sovrapposizioni creano la sfumatura morbida e multidirezionale di una mesh.
  • Un filtro di sfocatura su uno pseudo-elemento ammorbidisce ulteriormente le pozze, e un debole livello di rumore nasconde il banding.
  • I gradienti a livelli statici sono economici da disegnare, ma le grandi sfocature e i livelli animati ridisegnano spesso e vanno tenuti lenti, piccoli o facoltativi.
  • Quando un design richiede molti punti di colore, forme deformate o movimento fluido a schermo intero, un’immagine esportata, un video o uno shader WebGL è di solito lo strumento migliore.
In questa pagina

Un gradiente mesh in CSS è uno sfondo in cui il colore si sfuma in più direzioni insieme, come se pozze di pigmento si fossero impregnate l’una nell’altra. Il CSS non ha una funzione mesh, e i gradienti mesh un tempo abbozzati per l’SVG non sono mai arrivati nei browser, quindi la versione per il web è un’imitazione: da tre a cinque livelli radial-gradient() sovrapposti a un colore piatto, ciascuno che sfuma verso transparent. Fatta con cura, è abbastanza vicina da non far distinguere nulla, pesa poche centinaia di byte e resta nitida a qualsiasi dimensione.

Se vuoi prima la teoria del design, cos’è una mesh e perché sembra organica, leggi i gradienti mesh. Questa guida riguarda come costruirne uno nel codice.

Come funziona il metodo a livelli

Ogni livello è un punto di colore. La sua posizione è il valore at, la sua portata è la distanza di dissolvenza e la sua forza è l’alfa del colore. Poiché il primo gradiente in background-image viene dipinto in cima, qui l’ordine conta meno di quanto si pensi: ogni livello è per lo più trasparente, quindi si mescolano dove si sovrappongono. Il background-color di base si vede ovunque nessuna pozza arrivi.

I quattro punti di colore di una mesh, ciascuno mostrato da solo sulla base blu notte. Sovrapposti, si fondono in un unico campo.
css
.mesh {
  background-color: #0b1026;
  background-image:
    radial-gradient(circle at 15% 20%, rgb(124 58 237 / 0.85), transparent 55%),
    radial-gradient(circle at 85% 25%, rgb(236 72 153 / 0.75), transparent 50%),
    radial-gradient(ellipse at 60% 90%, rgb(6 182 212 / 0.7), transparent 60%),
    radial-gradient(circle at 25% 80%, rgb(245 158 11 / 0.55), transparent 45%);
}
La pila completa. Cambia un solo valore at e l’intera composizione si riequilibra.

Passo per passo: costruisci il tuo gradiente mesh in CSS

  1. 1

    Scegli uno sfondo

    Scegli il colore piatto che si vede tra le pozze. Gli sfondi scuri fanno brillare le pozze; quelli chiari le fanno sembrare acquerello. Lo sfondo è anche la tua riserva se i gradienti falliscono.

  2. 2

    Scegli da tre a cinque colori affini

    Le tonalità vicine si sfumano in modo pulito. Gli opposti, come blu e arancione, si incontrano in una macchia grigia. Gradienti sporchi spiega perché e come evitarlo.

  3. 3

    Metti le pozze fuori centro

    Spingi i punti verso angoli e bordi, e lascia che almeno uno stia in parte fuori dal riquadro, come at 110% 0%. Le pozze centrate sembrano un bersaglio.

  4. 4

    Varia portata e forza

    Dai a un colore la dissolvenza più ampia e l’alfa più alta, così guida. Tieni l’accento piccolo e più debole. Pozze uguali sembrano meccaniche.

  5. 5

    Sfuma in uno spazio colore migliore

    Aggiungi in oklab a ogni livello, come in radial-gradient(in oklab circle at 15% 20%, ...), dove supportato. Le sovrapposizioni restano più luminose che in sRGB.

  6. 6

    Finisci con la grana

    Le grandi dissolvenze morbide fanno banding su molti schermi. Un debole strato di rumore lo risolve e dà un tocco di stampa; vedi più avanti.

Sfumature più morbide con la sfocatura

Le dissolvenze radiali sono morbide ma le loro forme sono ovviamente rotonde. Una sfocatura ammorbidisce i cerchi rendendoli più organici. Metti i livelli su uno pseudo-elemento, sfocalo e ingrandiscilo con un inset negativo così i bordi sfocati non svaniscono nella pagina. isolation: isolate tiene lo z-index negativo dentro il componente.

css
.mesh {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background-color: #0b1026;
}

.mesh::before {
  content: "";
  position: absolute;
  inset: -15%;
  z-index: -1;
  background-image:
    radial-gradient(circle at 20% 25%, #7c3aed, transparent 40%),
    radial-gradient(circle at 80% 30%, #ec4899, transparent 35%),
    radial-gradient(circle at 55% 85%, #06b6d4, transparent 40%);
  filter: blur(48px);
}
Una mesh sfocata su uno pseudo-elemento. Il testo dentro .mesh resta nitido perché è sfocato solo lo pseudo-elemento.

Aggiungere la grana a un gradiente mesh in CSS

La grana ha due compiti. Spezza i gradini visibili che compaiono nelle dissolvenze ampie e a basso contrasto, e dà alla superficie la qualità tattile, da pellicola, che fa sembrare i gradienti ponderati invece che predefiniti. In CSS, la fonte abituale è un filtro SVG feTurbulence usato come minuscola immagine di sfondo, sovrapposta con bassa opacità. La tecnica completa è nella texture di rumore in CSS, e il ragionamento di design nei gradienti con grana.

Senza grana

  • Anelli visibili nelle zone scure su molti schermi
  • La superficie si legge come un colore piatto da schermo
  • Sembra un modello predefinito

Con una debole grana

  • I gradini si spezzano e spariscono
  • La superficie si legge come carta, pellicola o stampa
  • Sembra voluto e rifinito

Animare un gradiente mesh

Le posizioni dei gradienti non sono animabili da sole, ma le proprietà personalizzate registrate sì. Dichiara ogni coordinata che si muove con @property, usala dentro il gradiente e anima la proprietà. Mantieni il movimento lento e spegnilo per chi chiede il movimento ridotto.

css
@property --x1 {
  syntax: "<percentage>";
  inherits: false;
  initial-value: 15%;
}

.mesh {
  background-color: #0b1026;
  background-image:
    radial-gradient(circle at var(--x1) 20%, rgb(124 58 237 / 0.85), transparent 55%),
    radial-gradient(ellipse at 60% 90%, rgb(6 182 212 / 0.7), transparent 60%);
  animation: drift 20s ease-in-out infinite alternate;
}

@keyframes drift {
  to { --x1: 55%; }
}

@media (prefers-reduced-motion: reduce) {
  .mesh { animation: none; }
}
Una pozza che scivola in alto. Aggiungi una seconda proprietà per ogni coordinata che vuoi muovere.

Ogni fotogramma di questa animazione ridisegna l’intero sfondo. Su una piccola scheda è banale; su un hero a schermo intero vale la pena misurarlo. La guida ai gradienti animati tratta alternative più economiche come spostare un livello sovradimensionato con transform.

Quando usare invece un’immagine o WebGL

ApproccioIdeale perAttenzione a
Gradienti CSS a livelliSfondi statici, schede, hero con da tre a cinque coloriPozze dall’aspetto rotondo, banding senza grana
CSS con sfocaturaCampi statici più morbidi e organiciCosto di ridisegno se animati o ridimensionati spesso
Immagine esportata (AVIF o WebP)Mesh complesse con molti punti o forme pittorichePeso del file e un ritaglio fisso per formato
Video in loopMovimento ricco su un heroDimensione del file, regole di avvio automatico, movimento ridotto
Shader WebGLMovimento a schermo intero, fluido e interattivoComplessità del codice, consumo di batteria, alternative di riserva
Scegli lo strumento più leggero che abbia ancora l’aspetto giusto.

Gli shader sono trattati nei gradienti WebGL. Una via di mezzo è progettare lo sfondo una volta come materiale vivo ed esportarlo: i Mark di Gradiently sono materiali simili a mesh con colore, grana, luce e movimento, e un design realizzato con uno di essi si esporta come PNG, JPEG o video in loop senza stacchi da 5 a 30 secondi.

August Basin

GR·Y97R·RQ

August Basin

Vedi questo Mark
Un Mark: pozze di colore, materiale e grana disegnati dal vivo invece che approssimati con livelli.

Le domande più frequenti

Si può fare un gradiente mesh con il solo CSS?

Non in modo nativo, ma sovrapporre da tre a cinque gradienti radiali che sfumano verso il trasparente su un colore di base dà una mesh convincente. Una sfocatura e uno strato di rumore la rifiniscono.

Quanti gradienti radiali servono a una mesh CSS?

Di solito bastano da tre a cinque. Meno sembra un semplice bagliore; di più tende a diventare sporco e più difficile da equilibrare.

Perché il mio gradiente mesh CSS sembra sporco?

Tonalità opposte che si incontrano in sRGB sfumano attraverso il grigio. Usa colori vicini, riduci la sovrapposizione o aggiungi in oklab a ogni livello.

Un gradiente mesh CSS è dannoso per le prestazioni?

Uno statico è economico. I costi salgono con i grandi filtri di sfocatura e con l’animazione, perché lo sfondo si ridisegna a ogni fotogramma.

L’SVG supporta i gradienti mesh?

I gradienti mesh furono abbozzati per SVG 2 ma i browser non li hanno mai implementati, quindi sul web li si imita con i livelli, si usa un’immagine o li si disegna con WebGL.

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