CSS e web

Bordo a gradiente in CSS: quattro modi per disegnarlo

border-color non accetta un gradiente, quindi ogni contorno a gradiente è un ripiego. Ecco i quattro che contano, cosa può e non può fare ciascuno e quale scegliere.

GradientlyAccount Gradiently verificato··5 min di lettura
Copertina: Inner Reel · GR·WQK6·T2

In breve

  • Il CSS non può mettere un gradiente in border-color, quindi un bordo a gradiente in CSS si disegna sempre con un’altra tecnica.
  • border-image con un gradiente è il metodo più breve, ma ignora border-radius, quindi va bene solo per angoli vivi.
  • Due livelli di sfondo, uno ritagliato sul padding box e uno sul border box, danno un bordo a gradiente arrotondato purché l’interno sia a tinta unita.
  • La tecnica della maschera ritaglia il centro di un livello di gradiente, e dà un bordo a gradiente arrotondato con l’interno trasparente.
  • Un gradiente conico che ruota, guidato da una proprietà personalizzata registrata con @property, è il modo abituale di animare un bordo a gradiente.
In questa pagina

Un bordo a gradiente in CSS è un contorno il cui colore si sfuma lungo la sua lunghezza. Il problema è che border-color accetta solo colori, non immagini, quindi non esiste una proprietà unica per farlo. Il gradiente si disegna invece altrove e se ne mostra solo una sottile fascia. Ci sono quattro modi affidabili per farlo, e quello giusto dipende da due domande: l’elemento ha angoli arrotondati? E il suo interno deve essere trasparente?

MetodoAngoli arrotondatiInterno trasparenteIdeale per
border-imageNoSìSchede con angoli vivi, divisori, tabelle
Due sfondiSìNo, serve un riempimento pienoLa maggior parte di schede e pulsanti
Maschera su uno pseudo-elementoSìSìSchede sopra immagini o gradienti
Pseudo-elemento dietroSìNoAloni e anelli animati
Scegli in base alle due domande: angoli e interno.
Gradienti che si leggono bene come contorni sottili. Su una linea di 2px la saturazione alta conta più che su un intero sfondo.

Metodo 1: border-image

border-image accetta qualsiasi immagine, gradiente compreso. Imposta spessore e stile del bordo, poi il gradiente, poi uno slice di 1, che dice al browser di usare l’intera immagine come bordo. Sono due righe, funziona ovunque e lascia intatto l’interno dell’elemento.

css
.panel {
  border: 3px solid;
  border-image: linear-gradient(135deg, #7c3aed, #22d3ee) 1;
}
Il bordo a gradiente più breve. L’1 è il valore di slice; senza di esso il bordo si disegna solo negli angoli.

Metodo 2: due sfondi con background-clip

Dai all’elemento un bordo trasparente, poi sovrapponi due sfondi. Il livello superiore è il riempimento interno, ritagliato sul padding-box, quindi si ferma al bordo interno. Il livello inferiore è il gradiente, ritagliato sul border-box, quindi si estende sotto il bordo. Dove si ferma il riempimento compare il gradiente, e segue alla perfezione border-radius.

css
.card {
  border: 2px solid transparent;
  border-radius: 16px;
  background:
    linear-gradient(#0f172a, #0f172a) padding-box,
    linear-gradient(135deg, #7c3aed, #22d3ee) border-box;
}
Il riempimento è scritto come un gradiente di un solo colore perché solo le immagini si possono sovrapporre così.

È il metodo da scegliere per impostazione predefinita. Il suo unico limite è che l’interno deve essere opaco, perché un riempimento trasparente rivelerebbe il gradiente su tutta la scheda. Per le schede su un colore di pagina uniforme non è affatto un limite: usa il colore della pagina come riempimento.

Metodo 3: la tecnica della maschera per interni trasparenti

Quando la scheda sta sopra una foto o un altro gradiente, il centro deve essere trasparente. Metti il gradiente su uno pseudo-elemento che copre la scheda, dagli un padding pari allo spessore del bordo, poi maschera con due livelli: uno che copre solo il content box e uno che copre tutto. Escludere l’uno dall’altro lascia visibile solo l’anello del padding.

css
.glass-card {
  position: relative;
  border-radius: 16px;
}

.glass-card::before {
  content: "";
  position: absolute;
  inset: 0;
  padding: 2px; /* border width */
  border-radius: inherit;
  background: linear-gradient(135deg, #7c3aed, #22d3ee);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box exclude,
    linear-gradient(#000 0 0);
  pointer-events: none;
}
Un anello a gradiente con il centro trasparente. La coppia con prefisso copre i vecchi WebKit; la riga mask standard copre tutto ciò che è attuale.

pointer-events: none impedisce allo pseudo-elemento di inghiottire i clic destinati al contenuto della scheda. Il riferimento MDN su mask-composite spiega le parole chiave di composizione. È il metodo dietro la maggior parte delle schede glassmorphism con i bordi luminosi.

Metodo 4: uno pseudo-elemento dietro, per aloni e animazione

Metti uno pseudo-elemento a gradiente leggermente più grande della scheda, dietro il suo contenuto, e copri il centro con un secondo pseudo-elemento che contiene il riempimento pieno della scheda. Il bordo visibile è il gradiente. Poiché il gradiente vive su un livello proprio, puoi sfocarne una copia per ottenere un alone, oppure ruotarlo.

css
@property --angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}

.ring {
  position: relative;
  isolation: isolate;
  border-radius: 16px;
}

.ring::before {
  content: "";
  position: absolute;
  inset: -2px;
  z-index: -1;
  border-radius: 18px;
  background: conic-gradient(from var(--angle), #7c3aed, #22d3ee, #f472b6, #7c3aed);
  animation: spin 6s linear infinite;
}

/* the card's fill, painted over the middle of the ring */
.ring::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background: #0f172a;
}

@keyframes spin {
  to { --angle: 360deg; }
}

@media (prefers-reduced-motion: reduce) {
  .ring::before { animation: none; }
}
Un bordo a gradiente animato. Il --angle registrato permette al browser di interpolare con fluidità l’angolo di partenza del gradiente conico, e ::after dipinge il riempimento sopra il centro.
Il gradiente dell’anello rotanteconic-gradient(from 0deg, #7c3aed, #22d3ee, #f472b6, #7c3aed)
Ripetere il primo colore alla fine nasconde la giuntura mentre gira. I gradienti conici in CSS approfondisce la funzione.

Il raggio esterno dovrebbe essere uguale al raggio interno più lo spessore del bordo, ed è per questo che lo pseudo-elemento usa 18px attorno a una scheda da 16px. Per altri modi di dare movimento ai gradienti, vedi i gradienti animati in CSS.

Consigli di design per i bordi a gradiente

Da evitare

  • Bordi a gradiente su ogni scheda di una griglia
  • Gradienti poco saturi su una linea di 1px, che sembrano grigi
  • Un bordo a gradiente e un riempimento a gradiente sullo stesso elemento
  • Anelli che ruotano veloci su contenuti da leggere

Da fare

  • Riservare il bordo a gradiente a un solo elemento in evidenza, come un piano consigliato
  • Usare 2px o più e punti saturi
  • Un riempimento calmo con un bordo vivace, o il contrario
  • Rotazione lenta, sospesa per il movimento ridotto

I bordi a gradiente funzionano meglio come enfasi. Lo stesso ragionamento vale per i pulsanti, trattati in pulsanti a gradiente in CSS.

Le domande più frequenti

Come creo un bordo a gradiente in CSS?

Il modo più rapido è border: 3px solid; border-image: linear-gradient(135deg, #7c3aed, #22d3ee) 1;. Per gli angoli arrotondati, usa due sfondi ritagliati su padding-box e border-box.

Perché border-radius non funziona con border-image?

Per specifica, un bordo disegnato con border-image non viene arrotondato da border-radius. Usa il metodo background-clip o quello della maschera per bordi a gradiente arrotondati.

Come creo un bordo a gradiente con sfondo trasparente?

Usa la tecnica della maschera: uno pseudo-elemento con il gradiente, un padding pari allo spessore del bordo e una maschera che esclude il suo content box.

Come animo un bordo a gradiente?

Registra un angolo con @property, usalo come angolo from di un gradiente conico su uno pseudo-elemento e anima quella proprietà da 0deg a 360deg.

Quale metodo per il bordo a gradiente dovrei usare?

Usa due sfondi per la maggior parte di schede e pulsanti arrotondati, border-image per i bordi vivi e la tecnica della maschera solo quando l’interno deve restare trasparente.

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