ray()
Die ray()
CSS Funktion definiert das offset-path
Liniensegment, dem ein animiertes Element folgen kann. Das Liniensegment wird als "Ray" bezeichnet. Der Ray beginnt von einer offset-position
und erstreckt sich in die Richtung des angegebenen Winkels. Die Länge eines Rays kann begrenzt werden, indem eine Größe angegeben und das Schlüsselwort contain
verwendet wird.
Syntax
/* all parameters specified */
offset-path: ray(50deg closest-corner contain at 100px 20px);
/* two parameters specified, order does not matter */
offset-path: ray(contain 200deg);
/* only one parameter specified */
offset-path: ray(45deg);
Parameter
Die Parameter können in beliebiger Reihenfolge angegeben werden.
<angle>
-
Gibt die Richtung an, in der sich das Liniensegment von der Offset-Startposition erstreckt. Der Winkel
0deg
liegt auf der y-Achse, die nach oben zeigt, und positive Winkel nehmen im Uhrzeigersinn zu. <size>
-
Gibt die Länge des Liniensegments an, die die Entfernung zwischen
offset-distance
0%
und100%
relativ zum umschließenden Block angibt. Dies ist ein optionaler Parameter (closest-side
wird verwendet, wenn keine<size>
angegeben ist). Er akzeptiert einen der folgenden Schlüsselwortwerte:closest-side
: Entfernung zwischen dem Startpunkt des Rays und der nächstgelegenen Seite des umschließenden Blocks des Elements. Wenn der Startpunkt des Rays auf einer Kante des umschließenden Blocks liegt, ist die Länge des Liniensegments null. Befindet sich der Startpunkt des Rays außerhalb des umschließenden Blocks, wird die Kante des umschließenden Blocks als unendlich lang angesehen. Dies ist der Standardwert.closest-corner
: Entfernung zwischen dem Startpunkt des Rays und der nächstgelegenen Ecke im umschließenden Block des Elements. Wenn der Startpunkt des Rays auf einer Ecke des umschließenden Blocks liegt, ist die Länge des Liniensegments null.farthest-side
: Entfernung zwischen dem Startpunkt des Rays und der am weitesten entfernten Seite des umschließenden Blocks des Elements. Wenn der Startpunkt des Rays außerhalb des umschließenden Blocks liegt, wird die Kante des umschließenden Blocks als unendlich lang angesehen.farthest-corner
: Entfernung zwischen dem Startpunkt des Rays und der am weitesten entfernten Ecke im umschließenden Block des Elements.sides
: Entfernung zwischen dem Startpunkt des Rays und dem Punkt, an dem das Liniensegment die Grenze des umschließenden Blocks schneidet. Wenn sich der Startpunkt auf oder außerhalb der Grenze des umschließenden Blocks befindet, ist die Länge des Liniensegments null. contain
-
Reduziert die Länge des Liniensegments so, dass das Element innerhalb des umschließenden Blocks bleibt, auch bei
offset-distance: 100%
. Konkret wird die Länge des Segments um die Hälfte der Breite oder Hälfte der Höhe des Rahmenkastens des Elements reduziert, je nachdem, was größer ist, und niemals weniger als null. Dies ist ein optionaler Parameter. at <position>
-
Gibt den Punkt an, an dem der Ray beginnt und wo das Element in seinem umschließenden Block platziert wird. Dies ist ein optionaler Parameter. Wenn enthalten, muss der
<position>
-Wert dem Schlüsselwortat
vorangestellt werden. Wenn weggelassen, wird der Wert desoffset-position
des Elements verwendet. Wenn weggelassen und das Element keinenoffset-position
-Wert hat, wird der Wert für die Startposition des Raysoffset-position: normal
verwendet, was das Element in der Mitte (oder50% 50%
) des umschließenden Blocks platziert.
Beschreibung
Die ray()
-Funktion positioniert ein Element entlang eines Pfades, indem sie dessen Standort in einem zweidimensionalen Raum durch einen Winkel und eine Entfernung von einem Referenzpunkt (Polarkoordinaten) angibt. Diese Funktion ist nützlich, um 2D-Raum-Übergänge zu erstellen. Zum Vergleich: Dieser Ansatz unterscheidet sich von der Methode, einen Punkt durch seine horizontalen und vertikalen Abstände von einem festen Ursprung (Rechteckkoordinaten) anzugeben, die von der translate()
Funktion verwendet wird, und vom Bewegen eines Elements entlang eines definierten Pfades durch Animation.
Da ray()
im 2D-Raum arbeitet, ist es wichtig, sowohl die Anfangsposition als auch die Orientierung des Elements zu berücksichtigen. Wenn die ray()
-Funktion als offset-path
-Wert auf ein Element angewendet wird, können Sie diese Aspekte wie folgt kontrollieren:
- Das Element wird anfänglich positioniert, indem der
offset-anchor
-Punkt des Elements zur Offset-Startposition des Elements verschoben wird. Standardmäßig wird die Startposition des Rays durch denoffset-position
-Wert bestimmt. Wennoffset-position
explizit alsnormal
angegeben ist (oder weggelassen und erlaubt ist, aufnormal
zu standardisieren), wird das Element in derMitte
(oder50% 50%
) seines umschließenden Blocks positioniert. Geben Sieoffset-position: auto
an, um die Startposition in deroberen linken
Ecke (oder0 0
) der Position des Elements festzulegen. - Das Element wird anfänglich so gedreht, dass seine Inline-Achse — die Richtung des Textflusses — mit dem von
ray()
angegebenen Winkel übereinstimmt. Beispielsweise wird bei einemray()
-Winkel von0deg
, der auf der y-Achse liegt und nach oben zeigt, die Inline-Achse des Elements vertikal zur Übereinstimmung mit dem Winkel des Rays gedreht. Das Element behält diese Rotation während seines Pfades bei. Um dieses Verhalten anzupassen, verwenden Sie die Eigenschaftoffset-rotate
, die es Ihnen ermöglicht, einen anderen Drehwinkel oder eine andere Richtung für das Element festzulegen, wodurch Sie mehr Kontrolle über sein Erscheinungsbild haben, während es dem Pfad folgt. Beispielsweise wird durch das Setzen vonoffset-rotate: 0deg
jede durchray()
angewendete Rotation entfernt und die Inline-Achse des Elements wieder mit der Richtung des Textflusses ausgerichtet.
Formale Syntax
<ray()> =
ray( <angle> &&
<ray-size>? &&
contain? &&
[ at <position> ]? )
<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> ]
<length-percentage> =
<length> |
<percentage>
Beispiele
Den Winkel und die Startposition für einen Ray definieren
Dieses Beispiel zeigt, wie mit der Startposition eines Elements gearbeitet wird und wie die Orientierung des Elements durch den angegebenen Ray-Winkel beeinflusst wird.
CSS
.box {
background-color: palegreen;
border-top: 4px solid black;
opacity: 20%;
}
.box:first-of-type {
position: absolute;
}
.box1 {
offset-path: ray(0deg);
}
.box2 {
offset-path: ray(150deg);
}
.box3 {
offset-rotate: 0deg;
offset-position: 20% 40%;
offset-path: ray(150deg);
}
.box4 {
offset-position: 0 0;
offset-path: ray(0deg);
}
.box5 {
offset-path: ray(60deg closest-side at bottom right);
}
Ähnlich wie transform-origin
, befindet sich der Standardankerpunkt in der Mitte eines Elements. Dieser Ankerpunkt kann mit der Eigenschaft offset-anchor
modifiziert werden.
In diesem Beispiel werden verschiedene offset-path: ray()
-Werte auf die Kästchen Nummer 1
bis 5
angewendet. Der "umschließende Block" jedes Kästchens ist mit einem gestrichelten Rahmen dargestellt. Ein verblasstes Kästchen in der oberen linken Ecke zeigt die Standardposition jedes Kästchens ohne angewendete offset-position
oder offset-path
, was einen Vergleich nebeneinander ermöglicht. Die Oberseite jedes Kästchens ist mit einem soliden
Rahmen hervorgehoben, um Variationen in den Ray-Startpunkten und Orientierungen zu veranschaulichen. Nachdem ein Kästchen an der Startposition des Rays positioniert wurde, richtet es sich in die Richtung des angegebenen Ray-Winkels aus. Wenn offset-position
nicht angegeben ist, befindet sich die Standard-Offset-Startposition des Rays in der Mitte (oder 50% 50%
) des umschließenden Blocks des Kästchens.
Ergebnis
-
box1
wird zunächst so positioniert, dass sich sein Ankerpunkt (seine Mitte) an der Standard-Offset-Startposition (50% 50%
des umschließenden Blocks) befindet.box1
wird ebenfalls gedreht, um es auf den0deg
-Winkel des Rays auszurichten. Dies wird nun der Startpunkt des Pfades sein. Sie können die Änderung in Position und Rotation des Kästchens beobachten, indem Sie es mit dem verblasstenbox0
links vergleichen. Das Kästchen ist gedreht, um den0deg
-Winkel entlang der y-Achse zu erreichen, nach oben zeigend. Die Drehung des Kästchens ist an der Orientierung der Zahl im Inneren des Kästchens erkennbar. -
In
box2
wird dem Ray ein größerer positiver Winkel von150deg
zugewiesen, um zu zeigen, wie der Ray-Winkel funktioniert. Ausgangspunkt ist die obere linke Ecke, das Kästchen wird im Uhrzeigersinn gedreht, um den angegebenen Winkel von150deg
zu erreichen. -
box2
undbox3
haben die gleichenoffset-path
-Werte. Inbox3
wird auch eineoffset-rotate
von0deg
auf das Element angewendet. Infolgedessen bleibt das Element entlang des gesamten Pfades des Rays in diesem bestimmten Winkel gedreht, und das Element wird sich nicht in die Richtung des Pfades drehen. Beachten Sie inbox3
, dass der Ray-Pfad150deg
beträgt, aber die Orientierung des Kästchens sich aufgrund vonoffset-rotate
nicht entlang des Pfades ändern wird. Beachten Sie auch, dass dieoffset-path
-Eigenschaft vonbox3
keine Start-<position>
angibt, sodass die Startposition des Rays von deroffset-position
des Elements abgeleitet wird, die in diesem Falltop 20% left 40%
ist. -
Die
offset-position
vonbox4
ist auf die obere linke Ecke (0 0
) des umschließenden Blocks gesetzt, und infolgedessen fallen der Ankerpunkt und die Offset-Startposition des Elements zusammen. Der Ray-Winkel von0deg
wird an diesem Startpunkt auf das Element angewendet. -
In
box5
gibt dieoffset-path
-Eigenschaft denat <position>
-Wert an, der das Kästchen amunteren
undrechten
Rand des umschließenden Blocks des Elements platziert und60deg
auf den Ray-Winkel anwendet.
Ein Element entlang des Rays animieren
In diesem Beispiel wird die erste Form als Referenz für ihre Position und Orientierung gezeigt. Ein Ray-Bewegungspfad wird auf die anderen Formen angewendet.
CSS
body {
display: grid;
grid-template-columns: 200px 100px;
gap: 40px;
margin-left: 40px;
}
.container {
transform-style: preserve-3d;
width: 150px;
height: 100px;
border: 2px dotted green;
}
.shape {
width: 40px;
height: 40px;
background: #2bc4a2;
margin: 5px;
text-align: center;
line-height: 40px;
clip-path: polygon(0% 0%, 70% 0%, 100% 50%, 70% 100%, 0% 100%, 30% 50%);
animation: move 5000ms infinite alternate ease-in-out;
}
.shape2 {
offset-path: ray(120deg sides contain);
}
.shape3 {
offset-rotate: 0deg;
offset-path: ray(120deg sides contain);
}
.shape4 {
offset-position: auto;
offset-path: ray(120deg closest-corner);
}
.shape5 {
offset-position: auto;
offset-path: ray(120deg farthest-corner);
}
@keyframes move {
0%,
20% {
offset-distance: 0%;
}
80%,
100% {
offset-distance: 100%;
}
}
Ergebnis
In den ersten beiden Beispielen, bei denen offset-path
angewendet wird, beachten Sie die Orientierung der Form ohne offset-rotate
und mit offset-rotate
. Beide Beispiele verwenden die Standard-offset-position
-Wert normal
, daher beginnt die Bewegungspfad von 50% 50%
. Die letzten beiden offset-path
-Beispiele zeigen die Auswirkungen von Eck-<size>
-Werten: closest-corner
und farthest-corner
. Der closest-corner
-Wert erzeugt einen sehr kurzen Offset-Pfad, da sich die Form bereits in der Ecke befindet (offset-position: auto
). Der farthest-corner
-Wert erzeugt den längsten Offset-Pfad, der von der oberen linken Ecke des umschließenden Blocks zur unteren rechten Ecke verläuft.
Spezifikationen
Specification |
---|
Motion Path Module Level 1 # ray-function |