ray()
Baseline 2024Newly available
Since January 2024, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
Die ray()
CSS Funktion definiert das Liniensegment des offset-path
, dem ein animiertes Element folgen kann. Das Liniensegment wird als "Strahl" bezeichnet. Der Strahl beginnt von einer offset-position
und erstreckt sich in die Richtung des angegebenen Winkels. Die Länge eines Strahls kann begrenzt werden, indem eine Größe spezifiziert 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 Startposition erstreckt. Der Winkel
0deg
liegt auf der y-Achse und zeigt nach oben, und positive Winkel nehmen im Uhrzeigersinn zu. <size>
-
Gibt die Länge des Liniensegments an, welches die Distanz zwischen
offset-distance
0%
und100%
darstellt, relativ zur umgebenden Box. Dies ist ein optionaler Parameter (closest-side
wird verwendet, wenn keine<size>
angegeben ist). Er akzeptiert eine der folgenden Schlüsselwortwerte:closest-side
: Distanz zwischen dem Startpunkt des Strahls und der nächstgelegenen Seite des umgebenden Blocks des Elements. Wenn der Startpunkt des Strahls auf einer Kante des umgebenden Blocks liegt, ist die Länge des Liniensegments null. Wenn der Startpunkt des Strahls außerhalb des umgebenden Blocks liegt, wird die Kante des umgebenden Blocks als unendlich betrachtet. Dies ist der Standardwert.closest-corner
: Distanz zwischen dem Startpunkt des Strahls und der nächstgelegenen Ecke im umgebenden Block des Elements. Wenn der Startpunkt des Strahls auf einer Ecke des umgebenden Blocks liegt, ist die Länge des Liniensegments null.farthest-side
: Distanz zwischen dem Startpunkt des Strahls und der am weitesten entfernten Seite des umgebenden Blocks des Elements. Wenn der Startpunkt des Strahls außerhalb des umgebenden Blocks liegt, wird die Kante des umgebenden Blocks als unendlich betrachtet.farthest-corner
: Distanz zwischen dem Startpunkt des Strahls und der am weitesten entfernten Ecke im umgebenden Block des Elements.sides
: Distanz zwischen dem Startpunkt des Strahls und dem Punkt, an dem das Liniensegment die Grenze des umgebenden Blocks schneidet. Wenn der Startpunkt auf oder außerhalb der Grenze des umgebenden Blocks liegt, ist die Länge des Liniensegments null. contain
-
Reduziert die Länge des Liniensegments so, dass das Element innerhalb des umgebenden Blocks bleibt, auch bei
offset-distance: 100%
. Konkret wird die Länge des Segments um die Hälfte der Breite oder Höhe des Randkastens des Elements reduziert, je nachdem, welcher Wert größer ist, und niemals weniger als null. Dies ist ein optionaler Parameter. at <position>
-
Gibt den Punkt an, an dem der Strahl beginnt und wo das Element in seinem umgebenden Block platziert wird. Dies ist ein optionaler Parameter. Wenn enthalten, muss der Wert
<position>
dem Schlüsselwortat
vorausgehen. Wenn weggelassen, wird deroffset-position
-Wert des Elements verwendet. Wird er weggelassen und das Element hat keinenoffset-position
-Wert, wird für die Startposition des Strahlsoffset-position: normal
verwendet, was das Element im Zentrum (oder50% 50%
) des umgebenden Blocks platziert.
Beschreibung
Die ray()
-Funktion positioniert ein Element entlang eines Pfades, indem es seine Position in einem zweidimensionalen Raum durch einen Winkel und eine Entfernung von einem Referenzpunkt (Polarkoordinaten) angibt. Diese Funktionalität macht die ray()
-Funktion nützlich für die Erstellung von 2D-Raumübergängen. 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 von der Bewegung eines Elements entlang eines definierten Pfades durch eine Animation.
Da ray()
im 2D-Raum arbeitet, ist es wichtig, sowohl die Anfangsposition als auch die Ausrichtung 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 steuern:
- Das Element wird initial positioniert, indem der
offset-anchor
-Punkt des Elements an die Startposition des Offsets bewegt wird. Standardmäßig wird die Startposition des Strahls durch denoffset-position
-Wert bestimmt. Wennoffset-position
explizit alsnormal
angegeben wird (oder weggelassen und standardmäßig aufnormal
gesetzt wird), wird das Element imcenter
(oder50% 50%
) seines umgebenden Blocks positioniert. Die Angabe vonoffset-position: auto
setzt die Startposition in die obere linke Ecke (oder0 0
) der Position des Elements. - Das Element wird initial so rotiert, dass seine Inline-Achse — seine Textflussrichtung — mit dem durch
ray()
angegebenen Winkel übereinstimmt. Beispielsweise wird bei einemray()
-Winkel von0deg
, der auf der y-Achse nach oben zeigt, die Inline-Achse des Elements vertikal gedreht, um dem Winkel des Strahls zu entsprechen. Das Element behält diese Drehung entlang seines Pfades bei. Um dieses Verhalten anzupassen, verwenden Sie dieoffset-rotate
-Eigenschaft, die es Ihnen ermöglicht, einen anderen Drehwinkel oder eine andere Richtung für das Element anzugeben, was eine genauere Kontrolle über sein Erscheinungsbild entlang des Pfades ermöglicht. Beispielsweise wird durch das Setzen vonoffset-rotate: 0deg
jede durchray()
angewendete Drehung entfernt, wodurch die Inline-Achse des Elements wieder mit der Textflussrichtung in Einklang gebracht wird.
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
Definieren des Winkels und der Startposition für einen Strahl
Dieses Beispiel zeigt, wie man mit der Startposition eines Elements arbeitet und wie die Ausrichtung des Elements durch den angegebenen Strahlwinkel 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 bei transform-origin
ist der Standardankerpunkt im Zentrum eines Elements. Dieser Ankerpunkt kann mit der offset-anchor
-Eigenschaft modifiziert werden.
In diesem Beispiel werden verschiedene offset-path: ray()
-Werte auf die Kästen von 1
bis 5
angewendet. Der "umgebende Block" jedes Kastens ist mit einer gestrichelten Umrandung dargestellt. Ein verblasster Kasten in der oberen linken Ecke zeigt die Standardposition jedes Kastens ohne angewandte offset-position
oder offset-path
, was einen Vergleich nebeneinander ermöglicht. Die Oberseite jedes Kastens ist mit einer solid
-Umrandung hervorgehoben, um Variationen in Strahlanfangspunkten und Ausrichtungen zu veranschaulichen. Nach der Positionierung am Strahlanfangspunkt richtet sich ein Kasten in die Richtung des angegebenen Strahlwinkels aus. Wenn offset-position
nicht spezifiziert ist, ist die Standardstartposition des Offsets des Strahls das Zentrum (oder 50% 50%
) des umgebenden Blocks des Kastens.
Ergebnis
-
box1
wird initial so positioniert, dass sein Ankerpunkt (sein Zentrum) bei der Standardstartposition des Offsets (50% 50%
des umgebenden Blocks) ist.box1
wird auch gedreht, um sich in Richtung des0deg
-Winkels des Strahls zu orientieren. Dies ist nun der Startpunkt des Pfads. Sie können die Veränderung der Position und der Drehung des Kastens durch den Vergleich mit dem verblasstenbox0
auf der linken Seite beobachten. Der Kasten wird gedreht, um den0deg
-Winkel entlang der y-Achse nach oben zu erreichen. Die Drehung des Kastens ist anhand der Orientierung der Zahl im Kasten erkennbar. -
In
box2
wird ein größerer positiver Winkel von150deg
auf den Strahl angewendet, um zu zeigen, wie der Strahlwinkel funktioniert. Vom oberen linken Eckpunkt beginnend, dreht sich der Kasten im Uhrzeigersinn, um den angegebenen Winkel von150deg
zu erreichen. -
box2
undbox3
haben dieselbenoffset-path
-Werte. Inbox3
wird zusätzlich einoffset-rotate
von0deg
auf das Element angewendet. Infolgedessen bleibt das Element während des gesamten Pfades bei diesem spezifischen Winkel gedreht, und das Element dreht sich nicht in Richtung des Pfades. Beachten Sie inbox3
, dass der Strahlpfad bei150deg
liegt, aber die Ausrichtung des Kastens sich entlang des Pfades nicht ändert aufgrund vonoffset-rotate
. Beachten Sie auch, dass dieoffset-path
-Eigenschaft vonbox3
keine Startposition<position>
spezifiziert, sodass die Startposition des Strahls 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 umgebenden Blocks gesetzt, und infolgedessen fallen der Ankerpunkt des Elements und die Offsetstartposition zusammen. Der Strahlwinkel von0deg
wird an diesem Startpunkt auf das Element angewendet. -
In
box5
spezifiziert dieoffset-path
-Eigenschaft denat <position>
-Wert, was den Kasten an denbottom
- undright
-Rand des umgebenden Blocks des Elements platziert und60deg
auf den Strahlwinkel angewendet wird.
Ein Element entlang des Strahls animieren
In diesem Beispiel wird die erste Form als Referenz für ihre Position und Ausrichtung angezeigt. Ein Strahlbewegungspfad 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 Ausrichtung der Form ohne offset-rotate
und mit offset-rotate
. Beide Beispiele verwenden den Standardwert offset-position
normal
, und deshalb beginnt die Bewegungsbahn bei 50% 50%
. Die letzten beiden offset-path
-Beispiele zeigen die Auswirkungen von Eckgrößenwerten <size>
: closest-corner
und farthest-corner
. Der Wert closest-corner
erzeugt einen sehr kurzen Offset-Pfad, da sich die Form bereits an der Ecke befindet (offset-position: auto
). Der Wert farthest-corner
erzeugt den längsten Offset-Pfad, der von der oberen linken Ecke des umgebenden Blocks zur unteren rechten Ecke verläuft.
Spezifikationen
Specification |
---|
Motion Path Module Level 1 # ray-function |