shape()
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig, bevor Sie diese produktiv verwenden.
Die shape()
CSS-Funktion wird verwendet, um eine Form für die Eigenschaften clip-path
und offset-path
zu definieren. Sie kombiniert einen initialen Startpunkt mit einer Reihe von Formbefehlen, die den Pfad der Form definieren. Die shape()
-Funktion ist ein Mitglied des <basic-shape>
Datentyps.
Syntax
/* <fill-rule> */
clip-path: shape(nonzero from 0 0, line to 10px 10px);
/* <move-command>, <line-command>, and close */
offset-path: shape(from 10px 10px, move by 10px 5px, line by 20px 40%, close);
/* <hvline-command> */
offset-path: shape(from 10px 10px, hline by 50px, vline to 5rem);
/* <curve-command> */
offset-path: shape(from 10px 10px, curve to 80px 80px via 160px 1px 20% 16px);
/* <smooth-command> */
offset-path: shape(from 10px 10px, smooth to 100px 50pt);
/* <arc-command> */
offset-path: shape(
from 5% 0.5rem,
arc to 80px 1pt of 10% ccw large rotate 25deg
);
/* Using a CSS math function */
offset-path: shape(
from 5px -5%,
hline to 50px,
vline by calc(0% + 160px),
hline by 70.5px,
close,
vline by 60px
);
clip-path: shape(
evenodd from 10px 10px,
curve to 60px 20% via 40px 0,
smooth to 90px 0,
curve by -20px 60% via 10% 40px 20% 20px,
smooth by -40% -10px via -10px 70px
);
Parameter
<fill-rule>
Optional-
Gibt an, wie sich überschneidende Bereiche einer Form gefüllt werden sollen. Die möglichen Werte umfassen:
-
nonzero
: Ein Punkt wird als innerhalb der Form betrachtet, wenn ein Strahl, der vom Punkt ausgeht, mehr von links nach rechts als von rechts nach links die Pfadsegmente kreuzt, was zu einer ungleich Null-Summe führt. Dies ist der Standardwert, wenn<fill-rule>
weggelassen wird. -
evenodd
: Ein Punkt wird als innerhalb der Form betrachtet, wenn ein Strahl, der vom Punkt ausgeht, eine ungerade Anzahl von Pfadsegmenten kreuzt. Das bedeutet, dass der Strahl bei jedem Eintritt in die Form nicht gleich oft ausgetreten ist, was auf eine ungerade Anzahl von Eintritten ohne entsprechende Austritte hinweist.
Warning:
<fill-rule>
wird inoffset-path
nicht unterstützt und macht die Eigenschaft ungültig, wenn es verwendet wird. -
from <coordinate-pair>
-
Definiert den Startpunkt des ersten
<shape-command>
als ein Paar von Koordinaten, gemessen von der oberen linken Ecke der Referenzbox. Die Koordinaten werden als durch Leerzeichen getrennte<x> <y>
<length-percentage>
-Werte angegeben, die den linken und oberen Versatz darstellen. Prozentwerte sind relativ zur Breite und Höhe der Referenzbox des Elements. Fügen Sie nach diesem Parameter ein Komma hinzu. <shape-command>
-
Gibt eine Liste von einem oder mehreren durch Kommata getrennten Befehlen an, die die Form definieren, unter Verwendung einer Syntax ähnlich der von SVG-Pfadbefehlen. Befehle umfassen
<move-command>
,<line-command>
,<hv-line-command>
,<curve-command>
,<smooth-command>
,<arc-command>
undclose
. Der Startpunkt jedes Befehls ist der Endpunkt des vorherigen Befehls, wobei der erste Punkt der Form durch den Parameterfrom <coordinate-pair>
definiert wird.Die Syntax der meisten Formbefehle ist ein Schlüsselwort, das eine Anweisung wie
move
oderline
bereitstellt, gefolgt von dem Schlüsselwortby
oderto
und einem Koordinaten-Satz.by
: Gibt an, dass das<coordinate-pair>
relativ zum Startpunkt des Befehls ist (ein "relativer" Wert).to
: Gibt an, dass das<coordinate-pair>
relativ zur oberen linken Ecke der Referenzbox ist (ein "absoluter" Wert).Hinweis: Wenn eine Koordinate in einem
<coordinate-pair>
als Prozentsatz angegeben wird, wird der Wert relativ zur jeweiligen Breite oder Höhe der Referenzbox berechnet.Die folgenden
<shape-command>
s können angegeben werden:<move-command>
,<line-command>
,<hv-line-command>
,<curve-command>
,<smooth-command>
,<arc-command>
undclose
.<move-command>
: Angegeben alsmove [by | to] <coordinate-pair>
. Dieser Befehl fügt der Liste der Formbefehle einen MoveTo-Befehl hinzu. Es wird nichts gezeichnet. Stattdessen wird die Startposition für den nächsten Befehl festgelegt. Das Schlüsselwortby
oderto
gibt an, ob der<coordinate-pair>
-Punkt relativ oder absolut ist. Wenn das<move-command>
demclose
-Befehl folgt, identifiziert es den Startpunkt der nächsten Form oder des nächsten Teilpfades.<line-command>
: Angegeben alsline [by | to] <coordinate-pair>
. Dieser Befehl fügt der Liste der Formbefehle einen LineTo-Befehl hinzu. Es wird eine gerade Linie vom Startpunkt des Befehls bis zu seinem Endpunkt gezeichnet. Das Schlüsselwortby
oderto
gibt an, ob der durch<coordinate-pair>
angegebene Endpunkt relativ oder absolut ist.<hv-line-command>
: Angegeben als[hline | vline] [by | to] <length-percentage>
. Dieser Befehl fügt der Liste der Formbefehle einen horizontalen (hline
) oder vertikalen (vline
) LineTo-Befehl hinzu. Mithline
wird eine horizontale Linie vom Startpunkt des Befehls bis zurx
-Position gezeichnet, die durch<length-percentage>
definiert ist. Mitvline
wird eine vertikale Linie vom Startpunkt des Befehls bis zury
-Position gezeichnet, die durch<length-percentage>
definiert ist. Das Schlüsselwortby
oderto
bestimmt den relativen oder absoluten Endpunkt. Dieser Befehl entspricht<line-command>
, wobei ein Koordinatenwert durch den einzelnen<length-percentage>
festgelegt wird und der andere Koordinatenwert unverändert vom Startbefehl bleibt.<curve-command>
: Angegeben alscurve [by | to] <coordinate-pair> via <coordinate-pair> [<coordinate-pair>]
. Dieser Befehl fügt der Liste der Formbefehle einen Bézier-Kurvenbefehl hinzu. Das Schlüsselwortby
oderto
bestimmt, ob der Endpunkt der Kurve, der durch das erste<coordinate-pair>
angegeben wird, relativ oder absolut ist. Das Schlüsselwortvia
gibt die Kontrollpunkte der Bézier-Kurve an.- Wenn nur ein einzelnes
<coordinate-pair>
angegeben wird, zeichnet der Befehl eine quadratische Bézier-Kurve, die durch drei Punkte definiert wird (den Startpunkt, den Kontrollpunkt und den Endpunkt). - Wenn zwei
<coordinate-pair>
-Werte angegeben werden, zeichnet der Befehl eine kubische Bézier-Kurve, die durch vier Punkte definiert wird (den Startpunkt, zwei Kontrollpunkte und den Endpunkt).
<smooth-command>
: Angegeben alssmooth [by | to] <coordinate-pair> [via <coordinate-pair>]
. Dieser Befehl fügt der Liste der Formbefehle einen glatten Bézier-Kurvenbefehl hinzu. Das Schlüsselwortby
oderto
bestimmt, ob der Endpunkt der Kurve, der durch das erste<coordinate-pair>
angegeben wird, relativ oder absolut ist.- Wenn
via <coordinate-pair>
weggelassen wird, zeichnet der Befehl eine glatte quadratische Bézier-Kurve, die den vorherigen Kontrollpunkt und den aktuellen Endpunkt verwendet, um die Kurve zu definieren. - Wenn das optionale
via
-Schlüsselwort enthalten ist, spezifiziert es die Kontrollpunkte der Kurve durch<coordinate-pair>
, wobei eine glatte kubische Bézier-Kurve definiert wird, die durch den vorherigen Kontrollpunkt, den aktuellen Kontrollpunkt und den aktuellen Endpunkt gebildet wird.
Glatte Kurven sorgen für einen durchgehenden Übergang von der Form, während quadratische Kurven dies nicht tun. Glatte quadratische Kurven gewährleisten einen nahtlosen Übergang mit einem einzelnen Kontrollpunkt, während glatte kubische Kurven einen verfeinerten Übergang mit zwei Kontrollpunkten bieten.
<arc-command>
: Angegeben alsarc [by | to] <coordinate-pair> of <length-percentage> [<length-percentage>] [<arc-sweep> | <arc-size> | rotate <angle>]
. Dieser Befehl fügt der Liste der Formbefehle einen elliptischen Bogenkurvenbefehl hinzu. Es wird ein elliptischer Bogen zwischen einem Startpunkt und einem Endpunkt gezeichnet. Das Schlüsselwortby
oderto
bestimmt, ob der Endpunkt der Kurve, der durch das erste<coordinate-pair>
angegeben wird, relativ oder absolut ist.Der elliptische Bogenkurvenbefehl definiert zwei mögliche Ellipsen, die sowohl den Start- als auch den Endpunkt schneiden, und jede kann im oder gegen den Uhrzeigersinn gezeichnet werden, was zu vier möglichen Bögen abhängig von Größe, Richtung und Winkel des Bogens führt. Das Schlüsselwort
of
gibt die Größe der Ellipse an, aus der der Bogen entnommen wird: Der erste<length-percentage>
gibt den horizontalen Radius der Ellipse an, und der zweite<length-percentage>
gibt den vertikalen Radius an.Folgende Parameter spezifizieren, welcher der vier Bögen verwendet werden soll:
<arc-sweep>
: Gibt an, ob der gewünschte Bogen im oder gegen den Uhrzeigersinn um die Ellipse verläuft (cw
für mit,ccw
für gegen den Uhrzeigersinn). Wenn weggelassen, istccw
der Standard.<arc-size>
: Gibt an, ob der gewünschte Bogen der größere (large
) oder kleinere (small
) der beiden Bögen ist. Wenn weggelassen, istsmall
der Standard.<angle>
: Gibt den Winkel in Grad an, um den die Ellipse relativ zur x-Achse rotiert wird. Ein positiver Winkel dreht die Ellipse im Uhrzeigersinn, ein negativer Winkel gegen den Uhrzeigersinn. Wenn weggelassen, ist0deg
der Standard.
Besondere Situationen werden wie folgt behandelt:
- Wenn nur ein
<length-percentage>
angegeben wird, wird derselbe Wert sowohl für den horizontalen als auch den vertikalen Radius verwendet, was effektiv einen Kreis erzeugt. In diesem Fall haben<arc-size>
und<angle>
keinen Einfluss. - Wenn einer der Radien null ist, entspricht der Befehl einem
<line-command>
zum Endpunkt. - Wenn einer der Radien negativ ist, wird sein absoluter Wert verwendet.
- Wenn die horizontalen und vertikalen Radien keine ausreichende Größe beschreiben, um sowohl den Start- als auch den Endpunkt zu schneiden (nach Rotation um den angegebenen
<angle>
), werden die Radien gleichmäßig skaliert, bis die Ellipse gerade groß genug ist, um beide Punkte zu schneiden. - Wenn die Start- und Endpunkte des Bogens genau gegenüberliegenden Seiten der Ellipse liegen, gibt es nur eine mögliche Ellipse und zwei mögliche Bögen. In diesem Fall gibt
<arc-sweep>
den zu wählenden Bogen an, und<arc-size>
hat keinen Einfluss.
close
: Fügt der Liste der Formbefehle einen ClosePath-Befehl hinzu, der eine gerade Linie vom aktuellen Position (Ende des letzten Befehls) zum ersten Punkt im Pfad definiert durch denfrom <coordinate-pair>
-Parameter zeichnet. Um die Form zu schließen, ohne eine Linie zu zeichnen, fügen Sie ein<move-command>
mit den ursprünglichen Koordinaten vor demclose
-Befehl hinzu. Wenn derclose
-Befehl unmittelbar von einem<move-command>
gefolgt wird, definiert er den Startpunkt der nächsten Form oder des nächsten Teilpfades. - Wenn nur ein einzelnes
Beschreibung
Die shape()
-Funktion ermöglicht Ihnen die Definition komplexer Formen. Sie ähnelt der path()
Formfunktion in mehreren Aspekten:
- Der
<fill-rule>
-Parameter in dershape()
-Funktion funktioniert genauso wie der gleiche Parameter in derpath()
-Funktion. - Die
shape()
-Funktion erfordert die Angabe eines oder mehrerer<shape-command>
s, wobei jeder Befehl einen zugrundeliegenden Pfadbefehl, wie MoveTo, LineTo und ClosePath, verwendet.
Allerdings bietet shape()
mehrere Vorteile im Vergleich zur Verwendung von path()
:
shape()
verwendet die standardmäßige CSS-Syntax, wodurch es einfacher wird, Formen direkt in Ihrem Stylesheet zu erstellen und zu modifizieren. Im Vergleich dazu verwendetpath()
die SVG-Pfad Syntax, die weniger intuitiv für diejenigen ist, die nicht mit SVG vertraut sind.shape()
unterstützt eine Vielzahl von CSS-Einheiten, einschließlich Prozentangaben,rem
undem
.path()
hingegen definiert Formen als einen einzelnen String und beschränkt Einheiten aufpx
.shape()
ermöglicht auch die Verwendung von CSS-Mathematikfunktionen wiecalc()
,max()
undabs()
, was mehr Vielseitigkeit bei der Definition von Formen bietet.
Formale Syntax
<shape()> =
shape( <'fill-rule'>? from <coordinate-pair> , <shape-command># )
<fill-rule> =
nonzero |
evenodd
<coordinate-pair> =
<length-percentage>{2}
<shape-command> =
<move-command> |
<line-command> |
<hv-line-command> |
<curve-command> |
<smooth-command> |
<arc-command> |
close
<length-percentage> =
<length> |
<percentage>
<move-command> =
move <by-to> <coordinate-pair>
<line-command> =
line <by-to> <coordinate-pair>
<hv-line-command> =
[ hline | vline ] <by-to> <length-percentage>
<curve-command> =
curve [ <by-to> <coordinate-pair> using <coordinate-pair>{1,2} ]
<smooth-command> =
smooth [ [ <by-to> <coordinate-pair> ] || [ using <coordinate-pair> ]? ]
<arc-command> =
arc [ [ <by-to> <coordinate-pair> ] || [ of <length-percentage>{1,2} ] || <arc-sweep>? || <arc-size>? || [ rotate <angle> ]? ]
<by-to> =
by |
to
<arc-sweep> =
cw |
ccw
<arc-size> =
large |
small
Beispiele
Verwendung von shape()
, um einen Pfad zu definieren
Dieses Beispiel zeigt, wie die shape()
-Funktion in der Eigenschaft offset-path
verwendet werden kann, um die Form des Pfades zu definieren, dem ein Element folgen kann.
Die erste Form, shape1
, folgt einem kubischen Bézier-Kurvenpfad, der durch den curve to
-Befehl definiert ist. Als nächstes zeichnet der close
-Befehl eine gerade Linie vom Endpunkt der Kurve zurück zum Anfangspunkt, der im from
-Befehl definiert ist. Schließlich bewegt sich shape1
zu seiner neuen Position bei 0px 150px
und fährt dann entlang einer horizontalen Linie fort.
Die zweite Form, shape2
, folgt zunächst einer horizontalen Linie, kehrt dann zu ihrer ursprünglichen Position bei 50px 90px
zurück. Danach folgt sie einer vertikalen Linie, bevor sie den Pfad zurück zum ursprünglichen Punkt schließt.
Beide Formen beginnen in ihren Originalfarben und gehen allmählich bis zum Ende der move
-Animation in hotpink
über, wobei sie zu ihrer Anfangsfarbe zurückkehren, sobald die Animation neu startet. Diese zyklische Farbänderung bietet Ihnen einen visuellen Hinweis auf die Fortschritte und den Neustart der Animation.
.shape {
width: 50px;
height: 50px;
background: #2bc4a2;
position: absolute;
text-align: center;
line-height: 50px;
animation: move 6s infinite linear;
}
.shape1 {
offset-path: shape(
from 30% 60px,
curve to 180px 180px via 90px 190px,
close,
move by 0px 150px,
hline by 40%
);
}
.shape2 {
offset-path: shape(
from 50px 90px,
hline to 8em,
move to 50px 90px,
vline by 20%,
close
);
}
@keyframes move {
0% {
offset-distance: 0%;
}
100% {
offset-distance: 100%;
background-color: hotpink;
}
}
Ergebnis
Verwendung von shape()
, um den sichtbaren Teil eines Elements zu definieren
Dieses Beispiel demonstriert, wie die shape()
-Funktion in der Eigenschaft clip-path
verwendet werden kann, um verschiedene Formen für den Clipping-Bereich zu erstellen. Die erste Form (shape1
) verwendet ein durch gerade Linien definiertes Dreieck. Die zweite Form (shape2
) umfasst Kurven und glatte Übergänge; sie veranschaulicht auch die Verwendung von <move-command>
nach dem close
-Befehl, der dem Clipping-Bereich eine rechteckige Form hinzufügt.
.shape {
width: 100%;
height: 100%;
background: #2bc4a2;
position: absolute;
text-align: center;
line-height: 50px;
}
/* Triangular clipping region */
.shape1 {
clip-path: shape(from 0% 0%, line to 100% 0%, line to 50% 100%, close);
}
/* Clipping region with curves and smooth transitions and a box */
.shape2 {
clip-path: shape(
from 10px 10px,
curve to 60px 20% via 40px 0,
smooth to 90px 0,
curve by -20px 60% via 10% 40px 20% 20px,
smooth by -40% -10px via -10px 70px,
close,
move to 100px 100px,
hline by 50px,
vline by 50px,
hline by -50px,
close
);
}
Ergebnis
Spezifikationen
Specification |
---|
CSS Shapes Module Level 2 # shape-function |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
clip-path
offset-path
- CSS-Formen Modul
- Übersicht über Formen Leitfaden
- Grundformen Leitfaden