offset-path
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2022.
* Some parts of this feature may have varying levels of support.
Die offset-path
CSS-Eigenschaft legt einen Pfad fest, dem ein Element folgen soll, und bestimmt die Positionierung des Elements innerhalb des übergeordneten Containers des Pfads oder des SVG-Koordinatensystems. Der Pfad ist eine Linie, eine Kurve oder eine geometrische Form, entlang der das Element positioniert oder bewegt wird.
Die offset-path
-Eigenschaft wird in Kombination mit den Eigenschaften offset-distance
, offset-rotate
und offset-anchor
verwendet, um die Position und Ausrichtung des Elements entlang eines Pfads zu steuern.
Probieren Sie es aus
offset-path: path("M-70,-40 C-70,70 70,70 70,-40");
offset-path: path("M0,0 L60,70 L-60,30z");
<section class="default-example" id="default-example">
<div class="transition-all" id="example-element"></div>
<button id="playback" type="button">Play</button>
</section>
#example-element {
width: 24px;
height: 24px;
background: #2bc4a2;
animation: distance 8000ms infinite linear;
animation-play-state: paused;
clip-path: polygon(0% 0%, 70% 0%, 100% 50%, 70% 100%, 0% 100%, 30% 50%);
}
#example-element.running {
animation-play-state: running;
}
#playback {
position: absolute;
top: 0;
left: 0;
font-size: 1em;
}
@keyframes distance {
0% {
offset-distance: 0%;
}
100% {
offset-distance: 100%;
}
}
#default-example {
position: relative;
}
window.addEventListener("load", () => {
const example = document.getElementById("example-element");
const button = document.getElementById("playback");
button.addEventListener("click", () => {
if (example.classList.contains("running")) {
example.classList.remove("running");
button.textContent = "Play";
} else {
example.classList.add("running");
button.textContent = "Pause";
}
});
});
Syntax
/* Default */
offset-path: none;
/* Line segment */
offset-path: ray(45deg closest-side contain);
offset-path: ray(contain 150deg at center center);
offset-path: ray(45deg);
/* URL */
offset-path: url(#myCircle);
/* Basic shape */
offset-path: circle(50% at 25% 25%);
offset-path: ellipse(50% 50% at 25% 25%);
offset-path: inset(50% 50% 50% 50%);
offset-path: polygon(30% 0%, 70% 0%, 100% 50%, 30% 100%, 0% 70%, 0% 30%);
offset-path: path("M 0,200 Q 200,200 260,80 Q 290,20 400,0 Q 300,100 400,200");
offset-path: rect(5px 5px 160px 145px round 20%);
offset-path: xywh(0 5px 100% 75% round 15% 0);
/* Coordinate box */
offset-path: content-box;
offset-path: padding-box;
offset-path: border-box;
offset-path: fill-box;
offset-path: stroke-box;
offset-path: view-box;
/* Global values */
offset-path: inherit;
offset-path: initial;
offset-path: revert;
offset-path: revert-layer;
offset-path: unset;
Werte
Die offset-path
-Eigenschaft nimmt einen <offset-path>
-Wert, einen <coord-box>
-Wert oder beide, oder das Schlüsselwort none
als Wert an. Der <offset-path>
-Wert ist eine ray()
-Funktion, ein <url>
-Wert oder ein <basic-shape>
-Wert.
none
-
Gibt an, dass das Element keinem offset-Pfad folgt. Der Wert
none
entspricht dem Fall, dass das Element keine offset-Transformation hat. Die Bewegung des Elements wird in diesem Fall durch seine Standardpositions-Eigenschaften, wietop
undleft
, anstelle eines offset-Pfads bestimmt. Dies ist der Standardwert. <offset-path>
-
Eine
ray()
-Funktion, ein<url>
-Wert oder ein<basic-shape>
-Wert, der den geometrischen Offset-Pfad festlegt. Wird dieser Wert weggelassen, ist die Pfadform für den<coord-box>
-Wertinset(0 round X)
, wobeiX
der Wert vonborder-radius
des Elements ist, das den Kontextblock erstellt.ray()
-
Definiert eine Linie, die an einer bestimmten Position beginnt, eine bestimmte Länge hat und sich im angegebenen Winkel erstreckt. Die
ray()
-Funktion akzeptiert bis zu vier Parameter – einen<angle>
, einen optionalen Größenwert, das optionale Schlüsselwortcontain
und optionalat <position>
. <url>
-
Gibt die ID eines SVG-Formelements an. Der Pfad ist die Form des SVG-
<circle>
,<ellipse>
,<line>
,<path>
,<polygon>
,<polyline>
oder<rect>
-Elements, auf das durch seineid
in derurl()
-Funktion verwiesen wird. Wenn die URL nicht auf ein Formelement verweist oder anderweitig ungültig ist, ist der gelöste Wert für den Offset-Pfadpath("M0,0")
(was ein gültiger<basic-shape>
-Wert ist). <basic-shape>
-
Gibt den Offset-Pfad als den äquivalenten Pfad einer CSS-Basisformfunktion an, wie zum Beispiel
circle()
,ellipse()
,inset()
,path()
,polygon()
,rect()
oderxywh()
. Zum Beispiel, wenn der<basic-shape>
eineellipse()
-Funktion ist, dann ist der Pfad die Umrandung der Ellipse, beginnend am rechten Punkt der Ellipse und im Uhrzeigersinn durch eine vollständige Rotation. Fürellipse()
undcircle()
, die den Parameterat <position>
akzeptieren, falls<position>
weggelassen wird, ist die Position standardmäßigcenter
, es sei denn, das Element hat eine spezifizierteoffset-position
. In diesem Fall wird deroffset-position
-Wert für den Parameterat <position>
verwendet. Komplexere Formen können unter Verwendung dershape()
-Funktion definiert werden.
<coord-box>
-
Gibt die Größeninformationen des Referenzrahmens an, der den Pfad enthält. Der Referenzrahmen wird von dem Element abgeleitet, das den Kontextblock für dieses Element erstellt. Dieser Parameter ist optional. Wenn nicht angegeben, lautet der Standardwert
border-box
in CSS-Kontexten. In SVG-Kontexten wird der Wert alsview-box
behandelt. Wennray()
oder<basic-shape>
zur Definition des Offset-Pfads verwendet wird, stellt der<coord-box>
-Wert den Referenzrahmen für den Ray oder die<basic-shape>
-Form dar. Wenn<url>
zur Definition des Offset-Pfads verwendet wird, bietet der<coord-box>
-Wert das Ansichtsfenster und das Benutzerkoordinatensystem für das Formelement, wobei der Ursprung (0 0
) in der oberen linken Ecke liegt und die Größe1px
beträgt.
Beschreibung
Die offset-path
-Eigenschaft definiert einen Pfad, dem ein animiertes Element folgen kann. Ein Offset-Pfad ist entweder ein angegebener Pfad mit einem oder mehreren Unterpfaden oder die Geometrie einer nicht gestalteten Basisform. Die genaue Position des Elements auf dem Offset-Pfad wird durch die Eigenschaft offset-distance
bestimmt. Jede Form oder jeder Pfad muss eine anfängliche Position für den berechneten Wert von 0
für offset-distance
und eine anfängliche Richtung definieren, die die Rotation des Objekts zur anfänglichen Position festlegt.
Frühere Versionen der Spezifikation nannten diese Eigenschaft motion-path
. Sie wurde in offset-path
umbenannt, weil die Eigenschaft statische Positionen und nicht Bewegung beschreibt.
Formale Definition
Anfangswert | none |
---|---|
Anwendbar auf | transformierbare Elemente |
Vererbt | Nein |
Berechneter Wert | wie angegeben |
Animationstyp | by computed value type |
Erstellt Stapelkontext | Ja |
Formale Syntax
offset-path =
none |
<offset-path> || <coord-box>
<offset-path> =
<ray()> |
<url> |
<basic-shape>
<coord-box> =
<paint-box> |
view-box
<ray()> =
ray( <angle> &&
<ray-size>? &&
contain? &&
[ at <position> ]? )
<url> =
<url()> |
<src()>
<paint-box> =
<visual-box> |
fill-box |
stroke-box
<ray-size> =
closest-side |
closest-corner |
farthest-side |
farthest-corner |
sides
<position> =
[ left | center | right | top | bottom | <length-percentage> ] |
[ left | center | right ] && [ top | center | bottom ] |
[ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] |
[ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ]
<url()> =
url( <string> <url-modifier>* ) |
<url-token>
<src()> =
src( <string> <url-modifier>* )
<visual-box> =
content-box |
padding-box |
border-box
<length-percentage> =
<length> |
<percentage>
Beispiele
Erstellen eines offset-paths mithilfe der Kantenpositionierung von Boxen
Dieses Beispiel demonstriert die Verwendung verschiedener <coord-box>
-Werte in der offset-path
-Eigenschaft.
.box {
width: 40px;
height: 20px;
animation: move 8000ms infinite ease-in-out;
}
.blueBox {
background-color: blue;
offset-path: border-box;
offset-distance: 5%;
}
.greenBox {
background-color: green;
offset-path: padding-box;
offset-distance: 8%;
}
.redBox {
background-color: red;
offset-path: content-box;
offset-distance: 12%;
}
@keyframes move {
0%,
20% {
offset-distance: 0%;
}
80%,
100% {
offset-distance: 100%;
}
}
In diesem Beispiel wurden Rand, Rahmen und Polsterung absichtlich mit großen Werten versehen, um die Platzierung der blauen, grünen und roten Rechtecke an ihren jeweiligen <coord-box>
-Kanten zu demonstrieren: border-box, padding-box und content-box.
Ergebnis
Erstellen eines offset-paths mithilfe von path()
In diesem Beispiel erstellt das <svg>
-Element ein Haus mit Schornstein und definiert auch zwei Hälften einer Schere. Das Haus und der Schornstein bestehen aus Rechtecken und Polygonen, und die Scherenhälften werden durch zwei unterschiedliche Pfadelemente dargestellt. Im CSS-Code wird durch die offset-path
-Eigenschaft ein Pfad angegeben, dem die beiden Scherenhälften folgen sollen. Dieser CSS-definierte Pfad ist identisch mit dem, der durch das <path>
-Element im SVG dargestellt wird, das die Umrisse des Hauses einschließlich des Schornsteins darstellt.
<svg
xmlns="http://www.w3.org/2000/svg"
width="700"
height="450"
viewBox="350 0 1400 900">
<title>House and Scissors</title>
<rect x="595" y="423" width="610" height="377" fill="blue" />
<polygon points="506,423 900,190 1294,423" fill="yellow" />
<polygon points="993,245 993,190 1086,190 1086,300" fill="red" />
<path
id="house"
d="M900,190 L993,245 V201 A11,11 0 0,1 1004,190 H1075 A11,11 0 0,1 1086,201 V300 L1294,423 H1216 A11,11 0 0,0 1205,434 V789 A11,11 0 0,1 1194,800 H606 A11,11 0 0,1 595,789 V434 A11,11 0 0,0 584,423 H506 L900,190"
fill="none"
stroke="black"
stroke-width="13"
stroke-linejoin="round"
stroke-linecap="round" />
<path
id="firstScissorHalf"
class="scissorHalf"
d="M30,0 H-10 A10,10 0 0,0 -20,10 A20,20 0 1,1 -40,-10 H20 A10,10 0 0,1 30,0 M-40,20 A10,10 1 0,0 -40,0 A10,10 1 0,0 -40,20 M0,0"
transform="translate(0,0)"
fill="green"
stroke="black"
stroke-width="5"
stroke-linejoin="round"
stroke-linecap="round"
fill-rule="evenodd" />
<path
id="secondScissorHalf"
class="scissorHalf"
d="M30,0 H-10 A10,10 0 0,1 -20,-10 A20,20 0 1,0 -40,10 H20 A10,10 0 0,0 30,0 M-40,-20 A10,10 1 0,0 -40,0 A10,10 1 0,0 -40,-20 M0,0"
transform="translate(0,0)"
fill="forestgreen"
stroke="black"
stroke-width="5"
stroke-linejoin="round"
stroke-linecap="round"
fill-rule="evenodd" />
</svg>
.scissorHalf {
offset-path: path(
"M900,190 L993,245 V201 A11,11 0 0,1 1004,190 H1075 A11,11 0 0,1 1086,201 V300 L1294,423 H1216 A11,11 0 0,0 1205,434 V789 A11,11 0 0,1 1194,800 H606 A11,11 0 0,1 595,789 V434 A11,11 0 0,0 584,423 H506 L900,190"
);
animation: follow-path 4s linear infinite;
}
@keyframes follow-path {
to {
offset-distance: 100%;
}
}
Ergebnis
Ohne die offset-path
-Eigenschaft würden sich die beiden Hälften der Schere in der oberen linken Ecke der Leinwand befinden. Durch die Verwendung von offset-path
sind die beiden Scherenhälften jedoch mit dem Startpunkt des SVG-Pfads ausgerichtet und können sich entlang dieses bewegen.
Erstellen eines offset-paths mithilfe von url()
In diesem Beispiel wird veranschaulicht, wie auf eine SVG-Form verwiesen werden kann, um die Form des Pfads zu definieren, dem ein Element folgen kann. Der grüne Kreis (definiert durch .target
) folgt dem Pfad eines Rechtecks, das definiert wird, indem die ID der SVG-Form (svgRect
) an die offset-path
-Eigenschaft mithilfe von url()
übergeben wird.
Das SVG-Rechteck, das die Pfadform definiert, wird hier nur angezeigt, um visuell zu demonstrieren, dass der grüne Kreis tatsächlich dem durch dieses Rechteck definierten Pfad folgt.
<div class="outer">
<div class="target"></div>
</div>
<svg width="400" height="200" xmlns="http://www.w3.org/2000/svg" >
<rect id="svgRect" x="50" y="50" width="200" height="100" />
</svg>
</div>
.target {
width: 50px;
height: 50px;
border-radius: 50%;
background-color: green;
offset-path: url(#svgRect);
offset-anchor: auto;
animation: move 5s linear infinite;
}
#svgRect {
fill: antiquewhite;
stroke: black;
stroke-width: 2;
}
@keyframes move {
0% {
offset-distance: 0%;
}
100% {
offset-distance: 100%;
}
}
Spezifikationen
Specification |
---|
Motion Path Module Level 1 # offset-path-property |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
offset
offset-distance
offset-rotate
- SVG <path>
path()
- Weitere Demos:
- Beispiele mit verschiedenen Formenwerten auf CodePen von CSS-Tricks
- Bewegung eines Dreiecks entlang eines gekrümmten Pfads auf CodePen von Eric Willigers
- Bewegung eines Scherenpaars entlang der Form eines Hauses auf CodePen von Eric Willigers
- Bewegung mehrerer Augenpaare auf JSFiddle von Eric Willigers