Fonction CSS ray()
Baseline
2024
Nouvellement disponible
Depuis January 2024, cette fonctionnalité fonctionne sur les appareils et les versions de navigateur les plus récents. Elle peut ne pas fonctionner sur les appareils ou navigateurs plus anciens.
La fonction CSS ray() définit le segment de ligne offset-path qu'un élément animé peut suivre. Le segment de ligne est appelé « rayon ». Le rayon commence à partir d'une offset-position et s'étend dans la direction de l'angle défini. La longueur d'un rayon peut être limitée en définissant une taille et en utilisant le mot-clé contain.
Syntaxe
/* tous les paramètres définis */
offset-path: ray(50deg closest-corner contain at 100px 20px);
/* deux paramètres définis, l'ordre n'a pas d'importance */
offset-path: ray(contain 200deg);
/* un seul paramètre défini */
offset-path: ray(45deg);
Paramètres
Les paramètres peuvent être définis dans n'importe quel ordre.
<angle>-
Définit la direction dans laquelle le segment de ligne s'étend à partir de la position de départ du décalage. L'angle
0degse situe sur l'axe y pointant vers le haut, et les angles positifs augmentent dans le sens des aiguilles d'une montre. <size>-
Définit la longueur du segment de ligne, qui est la distance entre
offset-distance0%et100%, par rapport à la boîte englobante. Il s'agit d'un paramètre optionnel (closest-sideest utilisé si aucun<size>n'est défini). Il accepte l'une des valeurs clés suivantes :closest-side: Distance entre le point de départ du rayon et le côté le plus proche du bloc englobant de l'élément. Si le point de départ du rayon se trouve sur un bord du bloc englobant, la longueur du segment de ligne est nulle. Si le point de départ du rayon se trouve en dehors du bloc englobant, le bord du bloc englobant est considéré comme s'étendant à l'infini. Il s'agit de la valeur par défaut.closest-corner: Distance entre le point de départ du rayon et le coin le plus proche du bloc englobant de l'élément. Si le point de départ du rayon se trouve sur un coin du bloc englobant, la longueur du segment de ligne est nulle.farthest-side: Distance entre le point de départ du rayon et le côté le plus éloigné du bloc englobant de l'élément. Si le point de départ du rayon se trouve en dehors du bloc englobant, le bord du bloc englobant est considéré comme s'étendant à l'infini.farthest-corner: Distance entre le point de départ du rayon et le coin le plus éloigné du bloc englobant de l'élément.sides: Distance entre le point de départ du rayon et le point où le segment de ligne intersecte la frontière du bloc englobant. Si le point de départ se trouve sur ou en dehors de la frontière du bloc englobant, la longueur du segment de ligne est nulle. contain-
Réduit la longueur du segment de ligne afin que l'élément reste à l'intérieur du bloc englobant même à
offset-distance: 100%. Plus précisément, la longueur du segment est réduite de moitié de la largeur ou de la hauteur de la boîte de bordure de l'élément, selon la plus grande, et jamais inférieure à zéro. Il s'agit d'un paramètre optionnel. at <position>-
Définit le point de départ du rayon et l'endroit où l'élément est placé dans son bloc englobant. Il s'agit d'un paramètre optionnel. Si inclus, la valeur
<position>doit être précédée du mot-cléat. Si omis, la valeur utilisée est celle deoffset-positionde l'élément. Si omis et que l'élément n'a pas de valeuroffset-position, la valeur utilisée pour le point de départ du rayon estoffset-position: normal, ce qui place l'élément au centre (ou50% 50%) du bloc englobant.
Description
La fonction ray() positionne un élément le long d'un chemin en définissant son emplacement dans un espace bidimensionnel à travers un angle et une distance par rapport à un point de référence (coordonnées polaires). Cette fonctionnalité rend la fonction ray() utile pour créer des transitions spatiales 2D. En comparaison, cette approche diffère de la méthode consistant à définir un point par ses distances horizontales et verticales par rapport à une origine fixe (coordonnées rectangulaires), utilisée par la fonction translate(), et de celle consistant à déplacer un élément le long d'un chemin défini par une animation.
Comme ray() fonctionne dans un espace 2D, il est important de considérer à la fois la position initiale et l'orientation de l'élément. Lorsque la fonction ray() est appliquée comme valeur de offset-path sur un élément, voici comment vous pouvez contrôler ces aspects :
- L'élément est initialement positionné en déplaçant le point
offset-anchorde l'élément vers la position de départ de l'élément. Par défaut, la position de départ du rayon est déterminée par la valeuroffset-position. Sioffset-positionest explicitement définie commenormal(ou omis et autorisé à revenir ànormal), l'élément est positionné aucentre(ou50% 50%) de son bloc englobant. La spécification deoffset-position: autodéfinit la position de départ au coinhaut gauche(ou0 0) de la position de l'élément. - L'élément est initialement tourné de manière à ce que son axe en ligne — sa direction de flux de texte — s'aligne avec l'angle définie par
ray(). Par exemple, avec un angleray()de0deg, qui se trouve sur l'axe y pointant vers le haut, l'axe en ligne de l'élément est tourné pour être vertical afin de correspondre à l'angle du rayon. L'élément maintient cette rotation tout au long de son chemin. Pour personnaliser ce comportement, utilisez la propriétéoffset-rotate, qui vous permet de définir un angle ou une direction de rotation différent pour l'élément, offrant un contrôle plus précis sur son apparence lorsqu'il suit le chemin. Par exemple, définiroffset-rotate: 0degsupprime toute rotation appliquée parray(), réalignant l'axe en ligne de l'élément avec la direction du flux de texte.
Syntaxe formelle
<ray()> =
ray( <angle> &&
<ray-size>? &&
contain? &&
[ at <position> ]? )
<ray-size> =
<radial-extent> |
sides
<position> =
<position-one> |
<position-two> |
<position-four>
<radial-extent> =
closest-corner |
closest-side |
farthest-corner |
farthest-side
<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>
Exemples
>Définir l'angle et la position de départ d'un rayon
Cet exemple montre comment travailler avec la position de départ d'un élément et comment l'orientation de l'élément est impactée par l'angle de rayon défini.
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);
}
Similaire à transform-origin, le point d'ancrage par défaut est au centre d'un élément. Ce point d'ancrage peut être modifié à l'aide de la propriété offset-anchor.
Dans cet exemple, différentes valeurs offset-path: ray() sont appliquées aux boîtes numérotées de 1 à 5. Le « bloc contenant » de chaque boîte est représenté par une bordure en pointillés. Une boîte estompée dans le coin supérieur gauche montre la position par défaut de chaque boîte sans offset-position ou offset-path appliqué, permettant une comparaison côte à côte. Le haut de chaque boîte est mis en évidence avec une bordure solide pour illustrer les variations des points de départ et des orientations des rayons. Après le positionnement au point de départ du rayon, une boîte s'aligne avec la direction de l'angle de rayon défini. Si offset-position n'est pas défini, la position de départ par défaut du rayon est le centre (ou 50% 50%) du bloc contenant de la boîte.
Résultat
-
box1est initialement positionnée de manière à ce que son point d'ancrage (son centre) soit à la position de départ par défaut du décalage (50% 50%du bloc contenant).box1est également tournée pour s'orienter vers l'angle0degdu rayon. C'est maintenant le point de départ du chemin. Vous pouvez observer le changement de position et de rotation de la boîte en la comparant à labox0estompée à gauche. La boîte est tournée pour correspondre à l'angle0degle long de l'axe y, pointant vers le haut. La rotation de la boîte est évidente à partir de l'orientation du numéro à l'intérieur de la boîte. -
Dans
box2, un angle positif plus grand de150degest appliqué au rayon pour montrer comment fonctionne l'angle du rayon. En partant du coin supérieur gauche, la boîte est tournée dans le sens des aiguilles d'une montre pour atteindre l'angle défini de150deg. -
box2etbox3ont les mêmes valeursoffset-path. Dansbox3, unoffset-rotatede0degest également appliqué à l'élément. En conséquence, l'élément reste tourné à cet angle spécifique tout au long du chemin du rayon, et l'élément ne tourne pas dans la direction du chemin. Remarquez que dansbox3, le chemin du rayon est à150deg, mais l'orientation de la boîte ne change pas le long du chemin en raison deoffset-rotate. Notez également que la propriétéoffset-pathdebox3ne définit pas de<position>de départ, donc la position de départ du rayon est dérivée deoffset-positionde l'élément, qui dans ce cas esttop 20% left 40%. -
La
offset-positiondebox4est définie sur le coin supérieur gauche (0 0) du bloc contenant, et par conséquent, le point d'ancrage de l'élément et la position de départ du décalage coïncident. L'angle du rayon de0degest appliqué à l'élément à ce point de départ. -
Dans
box5, la propriétéoffset-pathdéfinit la valeurat <position>, ce qui place la boîte au bordbottometrightdu bloc contenant de l'élément et applique un angle de60degau rayon.
Animer un élément le long du rayon
Dans cet exemple, la première forme est affichée comme référence pour sa position et son orientation. Un chemin de mouvement en rayon est appliqué aux autres formes.
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%;
}
}
Résultat
Dans les deux premiers exemples où offset-path est appliqué, remarquez l'orientation de la forme sans offset-rotate et avec offset-rotate. Ces deux exemples utilisent la valeur par défaut offset-position normal, et par conséquent, le mouvement le long du chemin commence à partir de 50% 50%. Les deux derniers exemples de offset-path montrent l'impact des valeurs de coin <size> : closest-corner et farthest-corner. La valeur closest-corner crée un chemin de décalage très court car la forme est déjà au coin (offset-position: auto). La valeur farthest-corner crée le chemin de décalage le plus long, allant du coin supérieur gauche du bloc contenant au coin inférieur droit.
Spécifications
| Spécification |
|---|
| Motion Path Module Level 1> # funcdef-ray> |
Compatibilité des navigateurs
Voir aussi
- La propriété
offset-distance - La propriété
offset-path - La propriété
offset-rotate