ray()
Baseline
2024
Newly 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 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 durch Angabe einer Größe und Verwendung des contain-Schlüsselworts eingeschränkt werden.
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 die sich das Liniensegment von der Offset-Ausgangsposition aus erstreckt. Der Winkel
0degliegt auf der y-Achse nach oben gerichtet, und positive Winkel nehmen im Uhrzeigersinn zu. <size>-
Gibt die Länge des Liniensegments an, das der Abstand zwischen
offset-distance0%und100%ist, relativ zum enthaltenen Kasten. Dies ist ein optionaler Parameter (closest-sidewird verwendet, wenn keine<size>angegeben ist). Es akzeptiert einen der folgenden Schlüsselwortwerte:closest-side: Abstand zwischen dem Startpunkt des rays und der nächstgelegenen Seite des enthältenden Blocks des Elements. Wenn der Startpunkt des rays auf einer Kante des enthältenden Blocks liegt, ist die Länge des Liniensegments null. Wenn der Startpunkt des rays außerhalb des enthältenden Blocks liegt, wird die Kante des enthältenden Blocks als ins Unendliche verlängert angesehen. Dies ist der Standardwert.closest-corner: Abstand zwischen dem Startpunkt des rays und der nächstgelegenen Ecke im enthältenden Block des Elements. Wenn der Startpunkt des rays auf einer Ecke des enthältenden Blocks liegt, ist die Länge des Liniensegments null.farthest-side: Abstand zwischen dem Startpunkt des rays und der am weitesten entfernten Seite des enthältenden Blocks des Elements. Wenn der Startpunkt des rays außerhalb des enthältenden Blocks liegt, wird die Kante des enthältenden Blocks als ins Unendliche verlängert angesehen.farthest-corner: Abstand zwischen dem Startpunkt des rays und der am weitesten entfernten Ecke im enthältenden Block des Elements.sides: Abstand zwischen dem Startpunkt des rays und dem Punkt, an dem das Liniensegment die Grenze des enthältenden Blocks schneidet. Wenn der Startpunkt auf oder außerhalb der Grenze des enthältenden Blocks liegt, ist die Länge des Liniensegments null. contain-
Reduziert die Länge des Liniensegments, sodass das Element selbst bei
offset-distance: 100%innerhalb des enthältenden Blocks bleibt. Insbesondere wird die Länge des Segments um die halbe Breite oder halbe Höhe der Begrenzungsbox des Elements verringert, je nachdem, welches größer ist, und nie weniger als null. Dies ist ein optionaler Parameter. at <position>-
Gibt den Punkt an, an dem der ray beginnt und wo sich das Element im enthältenden Block befindet. Dies ist ein optionaler Parameter. Wenn enthalten, muss der
<position>-Wert dem Keywordatvorausgehen. Wenn weggelassen, wird deroffset-position-Wert des Elements verwendet. Wenn weggelassen und das Element keinenoffset-position-Wert hat, wirdoffset-position: normalals Startposition des rays verwendet, was das Element in die Mitte (oder50% 50%) des enthältenden Blocks platziert.
Beschreibung
Die ray()-Funktion positioniert ein Element entlang eines Pfads, indem sie seinen Standort im zweidimensionalen Raum durch einen Winkel und einen Abstand von einem Bezugspunkt (polare Koordinaten) angibt. Diese Eigenschaft 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 anzugeben (rechteckige Koordinaten), die von der translate()-Funktion verwendet wird, und vom Bewegen eines Elements entlang eines definierten Pfades durch Animation.
Da ray() im 2D-Raum funktioniert, 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 die folgenden Aspekte steuern:
- Das Element wird zunächst positioniert, indem der
offset-anchor-Punkt des Elements an die Ausgangsposition des Offsets verschoben wird. Standardmäßig wird die Startposition des rays durch denoffset-position-Wert bestimmt. Wennoffset-positionexplizit alsnormalangegeben wird (oder weggelassen und alsnormalstandardmäßig angenommen wird), wird das Element imcenter(oder50% 50%) seines enthältenden Blocks positioniert. Angabe vonoffset-position: autosetzt die Ausgangsposition in die obere linke Ecke (oder0 0) der Elementposition. - Das Element wird initial so gedreht, dass seine Inline-Achse — seine Textflussrichtung — mit dem Winkel von
ray()ausgerichtet ist. Zum Beispiel wird das Element mit demray()-Winkel von0deg, der auf der y-Achse nach oben zeigt, so gedreht, dass seine Inline-Achse zur Senkrechten passt, um den Winkel des rays zu entsprechen. Das Element behält diese Rotation während seines Pfades bei. Um dieses Verhalten individuell anzupassen, verwenden Sie dieoffset-rotate-Eigenschaft, die es Ihnen ermöglicht, einen anderen Drehwinkel oder eine andere Richtung für das Element anzugeben, wodurch Sie eine präzisere Kontrolle über sein Erscheinungsbild erhalten, wenn es dem Pfad folgt. Beispielsweise entfernt die Einstellung vonoffset-rotate: 0degjegliche Drehung, die durchray()angewendet wird, und richtet die Inline-Achse des Elements wieder mit der Textflussrichtung aus.
Formale Syntax
<ray()> =
ray( <angle> &&
<ray-size>? &&
contain? &&
[ at <position> ]? )
<ray-size> =
closest-side |
closest-corner |
farthest-side |
farthest-corner |
sides
<position> =
<position-one> |
<position-two> |
<position-four>
<position-one> =
left |
center |
right |
top |
bottom |
x-start |
x-end |
y-start |
y-end |
block-start |
block-end |
inline-start |
inline-end |
<length-percentage>
<position-two> =
[ left | center | right | x-start | x-end ] && [ top | center | bottom | y-start | y-end ] |
[ left | center | right | x-start | x-end | <length-percentage> ] [ top | center | bottom | y-start | y-end | <length-percentage> ] |
[ block-start | center | block-end ] && [ inline-start | center | inline-end ] |
[ start | center | end ]{2}
<position-four> =
[ [ left | right | x-start | x-end ] <length-percentage> ] && [ [ top | bottom | y-start | y-end ] <length-percentage> ] |
[ [ block-start | block-end ] <length-percentage> ] && [ [ inline-start | inline-end ] <length-percentage> ] |
[ [ start | end ] <length-percentage> ]{2}
<length-percentage> =
<length> |
<percentage>
Beispiele
>Definieren des Winkels und der Startposition für einen ray
Dieses Beispiel zeigt, wie mit der Startposition eines Elements gearbeitet wird und wie die Ausrichtung 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 bei transform-origin befindet sich der Standardankerpunkt in der Mitte 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 mit den Nummern 1 bis 5 angewendet. Der "enthältende Block" jedes Kastens wird mit einer gestrichelten Grenze dargestellt. Ein verblasster Kasten in der oberen linken Ecke zeigt die Standardposition jedes Kastens an, ohne dass eine offset-position oder offset-path angewendet wird, was einen Vergleich nebeneinander ermöglicht. Die Oberseite jedes Kastens ist mit einer solid-Grenze hervorgehoben, um die Variationen in den ray-Startpunkten und Ausrichtungen zu verdeutlichen. Nachdem das Element auf dem Startpunkt des rays positioniert wurde, richtet sich ein Kasten nach der Richtung des angegebenen ray-Winkels aus. Wenn offset-position nicht angegeben ist, ist die Standard-Offset-Startposition des rays das Zentrum (oder 50% 50%) des enthältenden Blocks des Kastens.
Ergebnis
-
box1wird zunächst so positioniert, dass sein Ankerpunkt (seine Mitte) an der Standard-Offset-Startposition (50% 50%des enthältenden Blocks) liegt.box1wird auch gedreht, um es in Richtung des0deg-Winkels des rays auszurichten. Dies wird nun der Startpunkt des Pfads sein. Sie können die Änderung in der Position und Drehung des Kastens durch den Vergleich mit dem verblasstenbox0auf der linken Seite beobachten. Der Kasten wird so gedreht, dass er dem0deg-Winkel entlang der y-Achse entspricht, nach oben zeigend. Die Drehung des Kastens ist aus der Ausrichtung der Nummer innerhalb des Kastens ersichtlich. -
In
box2wird ein größerer positiver Winkel von150degauf den ray angewendet, um zu zeigen, wie der ray-Winkel funktioniert. Vom oberen linken Ecke aus wird der Kasten im Uhrzeigersinn gedreht, um den angegebenen Winkel von150degzu erreichen. -
box2undbox3haben die gleichenoffset-path-Werte. Inbox3wird zusätzlich einoffset-rotatevon0degauf das Element angewendet. Infolgedessen bleibt das Element auf diesem spezifischen Winkel entlang des ray-Pfads gedreht, und das Element dreht sich nicht in die Richtung des Pfads. Beachten Sie inbox3, dass der ray-Pfad bei150degliegt, aber die Ausrichtung des Kastens sich entlang des Pfads nicht verändert aufgrund vonoffset-rotate. Beachten Sie auch, dass dieoffset-path-Eigenschaft vonbox3keine Startposition<position>angibt, sodass die Startposition des rays aus deroffset-positiondes Elements abgeleitet wird, die in diesem Falltop 20% left 40%ist. -
Die
offset-positionvonbox4ist auf die obere linke Ecke (0 0) des enthältenden Blocks gesetzt, und infolgedessen fallen der Ankerpunkt des Elements und die Offset-Startposition zusammen. Der ray-Winkel von0degwird auf das Element an diesem Startpunkt angewendet. -
In
box5gibt dieoffset-path-Eigenschaft denat <position>-Wert an, der den Kasten an dieuntenundrechtsSeite des enthältenden Blocks des Elements platziert und60degauf den Winkel des rays angewendet wird.
Animieren eines Elements entlang des rays
In diesem Beispiel wird die erste Form als Referenz für ihre Position und Ausrichtung angezeigt. 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, in 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 Pfadbewegung bei 50% 50%. Die letzten beiden offset-path-Beispiele zeigen die Auswirkungen der Eckwerte <size>: closest-corner und farthest-corner. Der closest-corner-Wert erzeugt einen sehr kurzen Offset-Pfad, da die Form bereits an einer Ecke ist (offset-position: auto). Der farthest-corner-Wert erstellt den längsten Offset-Pfad, der von der oberen linken Ecke des enthältenden Blocks zur unteren rechten Ecke reicht.
Spezifikationen
| Specification |
|---|
| Motion Path Module Level 1> # ray-function> |