Data di pubblicazione: 8 aprile 2025
La proprietà clip-path
ti consente di modificare la forma di un elemento applicando il ritaglio a un cerchio, un poligono o persino un percorso SVG. Tuttavia, prima di Chrome 135 e Safari 18.4,
dovevi scegliere tra poligoni adattabili e forme più complesse che non sono adattabili utilizzando i percorsi SVG.
Con la nuova funzione shape()
, un clip-path
può ritagliare l'elemento in una forma non poligonale che è anche adattabile.
Creare una forma di bandiera
Ad esempio, confronta la creazione di una forma di bandiera con clip-path: path()
e
clip-path: shape()
.
Una forma di bandiera non è esattamente un poligono, in quanto i suoi bordi superiore e inferiore sono curve cubiche di Bézier anziché linee rette o angoli arrotondati.
Crea il flag con clip-path: path()
Una forma come questa bandierina può essere rappresentata utilizzando un percorso SVG:
.flag {
clip-path: path(
"M 0 20 \
C 25 0 75 40 100 20 \
V 80 \
C 75 100 25 60 0 80 \
z");
}
Per spiegarlo, un percorso SVG è una serie di comandi di percorso:
- Vai a 0, 20.
- Curva a 100, 20 utilizzando i punti di controllo (25,0 e 75, 40).
- Linea verticale fino a 80.
- Curva a 0, 80 utilizzando i punti di controllo (75, 100 e 25, 50).
- Chiudi il percorso (riga fino a 0,20).
Viene disegnata una forma a bandiera, ma tutte le unità sono in pixel. SVG può ridimensionare questi pixel in una visual box, ma in modo da avere sempre una scala geometrica dell'intera forma.
Ad esempio, se volessi ridimensionare l'intero rettangolo, ma mantenere l'altezza e la larghezza delle curve a 20 px, SVG non sarebbe all'altezza del compito.
Crea il flag con shape()
Confronta lo stesso risultato utilizzando shape()
. La funzione shape accetta una serie di comandi, simili ai comandi di percorso SVG. Tuttavia, questi comandi accettano lunghezze e percentuali CSS, in qualsiasi unità CSS.
Il seguente CSS converte il flag a shape()
con unità percentuali:
.flag {
clip-path: shape(from 0% 20%,
curve to 100% 20% with 25% 0% / 75% 40%,
vline to 80%,
curve to 0% 80% with 75% 100% / 25% 60%,
close
);
}
Rendilo adattabile
Con l'intera gamma di lunghezze CSS disponibili, puoi scegliere quali utilizzare per ogni coordinata.
Ad esempio, per fare in modo che l'intera dimensione dell'indicatore venga scalata in base alle dimensioni dell'elemento, ma mantenendo costante l'altezza della curva, puoi procedere nel seguente modo:
.flag {
clip-path: shape(from 0% 20px,
curve to 100% 20px with 25% 0% / 75% 40px,
vline to calc(100% - 20px),
curve to 0% calc(100% - 20px)
with 75% 100% / 25% calc(100% - 40px),
close
);
}
Aggiungere animazioni e proprietà personalizzate
Ora che la forma è definita in CSS, puoi anche utilizzare proprietà personalizzate per gestire facilmente l'altezza:
.flag {
--wave-height: 40px;
clip-path: shape(
from 0px var(--wave-height),
curve to 100% var(--wave-height)
with 25% 0px / 75% calc(var(--wave-height) * 2),
vline to calc(100% - var(--wave-height)),
curve to 0 calc(100% - var(--wave-height))
with 75% 100% / 25% calc(100% - var(--wave-height) * 2),
close
)
}
Puoi anche animare la proprietà CSS utilizzando il descrittore @property
e bloccarla in modo che non superi i limiti:
@property --animated-wave-height {
syntax: "<length>";
inherits: false;
initial-value: 40px;
}
@keyframes curve {
from { --animated-wave-height: 0px; }
to { --animated-wave-height: 180px; }
}
.flag {
width: 600px;
height: 400px;
background: green;
animation: curve 1s infinite alternate;
--wave-height: calc(min(var(--animated-wave-height, 40px), 40%));
clip-path: shape(
from 0px var(--wave-height),
curve to 100% var(--wave-height)
with 25% 0px / 75% calc(var(--wave-height) * 2),
vline to calc(100% - var(--wave-height)),
curve to 0 calc(100% - var(--wave-height))
with 75% 100% / 25% calc(100% - var(--wave-height) * 2),
close
)
}
Prova la demo
In Chrome 135 o Safari 18.4, puoi vedere la forma della bandiera animata creata utilizzando
clip-path: shape()
in
questa demo di CodePen.
Riepilogo
clip-path: shape()
ti consente di ritagliare l'elemento utilizzando forme arbitrarie e adattabili, in precedenza possibili solo con tecniche come gradienti conici o SVG creati in JavaScript.
Consulta la specifica per la sintassi completa.
Al momento funziona solo per clip-path
. In futuro, prevediamo di utilizzare questo tipo di forma per impostare la forma del bordo dell'elemento, il che sbloccherebbe ancora più modi di espressione non rettangolari.