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.
ray() 㯠CSS 颿°ã§ãã¢ãã¡ã¼ã·ã§ã³ããè¦ç´ ããã©ããã¨ãã§ãã offset-path ã®ç·åãå®ç¾©ãã¾ãããã®ç·åã¯ãå
ç·ãã¨å¼ã°ãã¾ããå
ç·ã¯ offset-position ããå§ã¾ããæå®ãããè§åº¦ã®æ¹åã«ä¼¸ã³ã¾ããå
ç·ã®é·ãã¯ããµã¤ãºãæå®ãã contain ãã¼ã¯ã¼ãã使ç¨ãããã¨ã§å¶ç´ãããã¨ãã§ãã¾ãã
æ§æ
/* ãã¹ã¦ã®å¼æ°ãæå® */
offset-path: ray(50deg closest-corner contain at 100px 20px);
/* 2 ã¤ã®å¼æ°ãæå®ãé åºã¯å½±é¿ããªã */
offset-path: ray(contain 200deg);
/* 1 ã¤ã ã弿°ãæå® */
offset-path: ray(45deg);
弿°
弿°ã¯ä»»æã®é åºã§æå®ã§ãã¾ãã
<angle>-
ãªãã»ããéå§ä½ç½®ããç·åã伸ã³ãæ¹åãæå®ãã¾ããè§åº¦
0degã¯ãä¸åãã® Y 軸ä¸ã«ãããæ£ã®å¤ã¯æè¨åãã«å¢å ãã¾ãã <size>-
ç·åã®é·ããæå®ãã¾ããããã¯ã
offset-distanceã0%ã¨100%ã®éã®ãã³ã³ããããã¯ã¹ããã®è·é¢ã§ããããã¯ãªãã·ã§ã³ã®å¼æ°ã§ãï¼<size>ãæå®ããã¦ããªãå ´åã¯closest-sideã使ç¨ããã¾ãï¼ã以ä¸ã®ãã¼ã¯ã¼ãå¤ã®ãããããæå®ã§ãã¾ããclosest-side: å ç·ã®éå§ç¹ã¨è¦ç´ ã®å å«ãããã¯ã®æãè¿ã辺ã¨ã®è·é¢ãå ç·ã®éå§ç¹ãå å«ãããã¯ã®è¾ºä¸ã«ããå ´åãç·åã®é·ã㯠0 ã«ãªãã¾ããå ç·ã®éå§ç¹ãå å«ãããã¯ã®å¤å´ã«ããå ´åãå å«ãããã¯ã®è¾ºã¯ç¡éã«ä¼¸ã³ã¦ãããã®ã¨ã¿ãªããã¾ããããã¯æ¢å®å¤ã§ããclosest-corner: å ç·ã®éå§ç¹ã¨è¦ç´ ã®å å«ãããã¯ã®æãè¿ãè§ã¨ã®è·é¢ãå ç·ã®éå§ç¹ãå å«ãããã¯ã®è§ã«ããå ´åãç·åã®é·ã㯠0 ã§ããfarthest-side: ã¬ã¤ã®éå§ç¹ã¨è¦ç´ ã®å å«ãããã¯ã®æãé ã辺ã¨ã®è·é¢ãã¬ã¤ã®éå§ç¹ãå å«ãããã¯ã®å¤å´ã«ããå ´åãå å«ãããã¯ã®è¾ºã¯ç¡éã«ä¼¸ã³ã¦ãããã®ã¨ã¿ãªããã¾ããfarthest-corner: å ç·ã®éå§ç¹ã¨ãè¦ç´ ã®å å«ãããã¯ã®æãé ãè§ã¨ã®è·é¢ãsides: å ç·ã®éå§ç¹ã¨ãç·åãå å«ãããã¯ã®å¢çã¨äº¤å·®ããç¹ã¨ã®è·é¢ãéå§ç¹ãå å«ãããã¯ã®å¢çä¸ã¾ãã¯å¢çå¤ã«ããå ´åãç·åã®é·ã㯠0 ã§ãã contain-
è¦ç´ ã
offset-distance: 100%ã®å ´åã§ããè¦ç´ ãå å«ãããã¯å ã«çã¾ãããã«ãç·åã®é·ããç縮ãã¾ãã仿§ä¸ãç·åã®é·ãã¯ãè¦ç´ ã®å¢çããã¯ã¹ã®å¹ ã¾ãã¯é«ãã®ã©ã¡ãã大ããæ¹ã®ååã«ç縮ããã¾ããã0 ããçããªããã¨ã¯ããã¾ãããããã¯ãªãã·ã§ã³ã®å¼æ°ã§ãã at <position>-
å ç·ãéå§ããç¹ãããã³è¦ç´ ãå å«ãããã¯å ã«é ç½®ãããç¹ãæå®ãã¾ããããã¯ãªãã·ã§ã³ã®å¼æ°ã§ããè¨è¼ããå ´åã
<position>å¤ã®åã«atãã¼ã¯ã¼ããä»ããå¿ è¦ãããã¾ããçç¥ããå ´åãè¦ç´ ã®offset-positionå¤ã使ç¨ããã¾ããçç¥ããè¦ç´ ã«offset-positionå¤ããªãå ´åãå ç·ã®éå§ä½ç½®ã«ä½¿ç¨ãããå¤ã¯offset-position: normalã¨ãªããè¦ç´ ã¯å å«ãããã¯ã®ä¸å¿ ï¼ã¾ãã¯50% 50%ï¼ ã«é ç½®ããã¾ãã
解説
ray() 颿°ã¯ãåºæºç¹ããã®è§åº¦ã¨è·é¢ï¼æ¥µåº§æ¨ï¼ã«ãã£ã¦ 2 次å
空éå
ã®ä½ç½®ãæå®ãããã®ä½ç½®ã«æ²¿ã£ã¦è¦ç´ ãé
ç½®ãã¾ãããã®æ©è½ã«ããã ray() 颿°ã¯ 2 次å
空éã®ãã©ã³ã¸ã·ã§ã³ã使ããã®ã«å½¹ç«ã¡ã¾ããæ¯è¼ã®ããã«ããã®ææ³ã¯ã translate() 颿°ã§ä½¿ç¨ããããä¿®æ£ãããåç¹ããã®æ°´å¹³è·é¢ã¨åç´è·é¢ï¼ç´è§åº§æ¨ï¼ã«ãã£ã¦ç¹ãæå®ããæ¹æ³ãããã³ã¢ãã¡ã¼ã·ã§ã³ã«ãã£ã¦å®ç¾©ããããã¹ã«æ²¿ã£ã¦è¦ç´ ãç§»åããæ¹æ³ã¨ã¯ç°ãªãã¾ãã
ray() 㯠2D 空éã§ä½ç¨ãããããè¦ç´ ã®åæä½ç½®ã¨æ¹åã®ä¸¡æ¹ãèæ
®ãããã¨ãéè¦ã§ãã ray() 颿°ãè¦ç´ ã® offset-path å¤ã¨ãã¦é©ç¨ããå ´åããããã®è¦ç´ ãæ¬¡ã®ããã«å¶å¾¡ã§ãã¾ãã
- è¦ç´ ã¯æåã«ãè¦ç´ ã®
offset-anchorã®ç¹ãè¦ç´ ã®ãªãã»ããéå§ä½ç½®ã«ç§»åãããã¨ã§ä½ç½®æå®ããã¾ããæ¢å®ã§ã¯ãå ç·ã®éå§ä½ç½®ã¯offset-positionå¤ã«ãã£ã¦æ±ºå®ããã¾ããoffset-positionãæç¤ºçã«normalã¨ãã¦æå®ããã¦ããå ´åï¼ã¾ãã¯çç¥ãããnormalãæ¢å®å¤ã¨ãã¦ä½¿ç¨ããã¦ããå ´åï¼ãè¦ç´ ã¯ããã®å å«ãããã¯ã®centerï¼ã¾ãã¯50% 50%ï¼ã«ä½ç½®ãã¾ããoffset-position: autoãæå®ããã¨ãéå§ä½ç½®ã¯è¦ç´ ã®ä½ç½®ã® å·¦ä¸é ï¼ã¾ãã¯0 0ï¼ã«è¨å®ããã¾ãã - è¦ç´ ã¯ããã®ã¤ã³ã©ã¤ã³è»¸ï¼ããã¹ãã®æµããæ¹åï¼ã
ray()ã§æå®ãããè§åº¦ã¨ä¸è´ããããã«ãæåã«å転ãã¾ããä¾ãã°ãray()ã®è§åº¦ã0degï¼Y 軸ã®ä¸åãï¼ã«è¨å®ããã¨ãè¦ç´ ã®ã¤ã³ã©ã¤ã³è»¸ã¯ãå ç·ã®è§åº¦ã¨ä¸è´ããããã«åç´ã«å転ãã¾ããè¦ç´ ã¯ããã¹å ¨ä½ãéãã¦ãã®å転ãç¶æãã¾ãããã®åä½ãã«ã¹ã¿ãã¤ãºããã«ã¯ãoffset-rotateããããã£ã使ç¨ãã¾ãããã®ããããã£ã使ç¨ããã¨ãè¦ç´ ã®å転è§åº¦ãæ¹åãåå¥ã«æå®ã§ãããã¹ã«æ²¿ã£ãå¤è¦³ãããæ£ç¢ºã«å¶å¾¡ã§ãã¾ããä¾ãã°ãoffset-rotate: 0degãè¨å®ããã¨ãray()ã«ãã£ã¦é©ç¨ãããå転ããã¹ã¦è§£é¤ãããè¦ç´ ã®ã¤ã³ã©ã¤ã³è»¸ãããã¹ãã®æµããæ¹åã«åã³æ´åããã¾ãã
形弿æ³
<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>
ä¾
>ç·ã®è§åº¦ã¨éå§ä½ç½®ã®å®ç¾©
ãã®ä¾ã§ã¯ãè¦ç´ ã®éå§ä½ç½®ã®æä½æ¹æ³ãããã³æå®ããå ç·è§åº¦ãè¦ç´ ã®æ¹åã«ä¸ããå½±é¿ã«ã¤ãã¦èª¬æãã¾ãã
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);
}
transform-origin ã¨åæ§ã«ãæ¢å®ã®ã¢ã³ã«ã¼ç¹ã¯è¦ç´ ã®ä¸å¿ã«ããã¾ãããã®ã¢ã³ã«ã¼ç¹ã¯ã offset-anchor ããããã£ã使ç¨ãã¦å¤æ´ãããã¨ãã§ãã¾ãã
ãã®ä¾ã§ã¯ããã¾ãã¾ãª offset-path: ray() å¤ãã 1 ãã 5 ã¾ã§ã®çªå·ãä»ããããããã¯ã¹ã«é©ç¨ããã¦ãã¾ããåããã¯ã¹ã®ãå
å«ãããã¯ãã¯ç ´ç·ã®å¢çç·ã§ç¤ºããã¦ãã¾ããå·¦ä¸é
ã®æ·¡ãããã¯ã¹ã¯ã offset-position ããã³ offset-path ãé©ç¨ããã¦ããªãåããã¯ã¹ã®æ¢å®ã®ä½ç½®ã示ãã¦ããã並ã¹ã¦æ¯è¼ãããã¨ãã§ãã¾ããåããã¯ã¹ã®ä¸é¨ã¯ãå
ç·ã®éå§ç¹ã¨åãã®éãã示ãããã«ãå®ç·ã®å¢çç·ã§å¼·èª¿è¡¨ç¤ºããã¦ãã¾ããå
ç·ã®éå§ç¹ã«é
ç½®ãããããã¯ã¹ã¯ãæå®ãããå
ç·ã®è§åº¦ã®æ¹åã«æ´åãã¾ãã offset-position ãæå®ããã¦ããªãå ´åãå
ç·ã®æ¢å®ã®ãªãã»ããéå§ä½ç½®ã¯ãããã¯ã¹ã®å
å«ãããã¯ã®ä¸å¿ ï¼ã¾ã㯠50% 50%ï¼ ã«ãªãã¾ãã
çµæ
-
box1ã¯ããã®ã¢ã³ã«ã¼ãã¤ã³ã ï¼ä¸å¿ï¼ ãæ¢å®ã®ãªãã»ããéå§ä½ç½® ï¼å å«ãããã¯ã®50% 50%ï¼ ã«ãªãããã«ãæåã«ä½ç½®æå®ããã¾ããã¾ããbox1ã¯ãã¬ã¤ã®è§åº¦0degã«åãã¦å転ãã¾ããããã§ãããããã¹ã®éå§ç¹ã«ãªãã¾ããå·¦å´ã®ãã§ã¼ãããbox0ã¨æ¯è¼ãããã¨ã§ãããã¯ã¹ã®ä½ç½®ã¨å転ã®å¤åãç£è¦ã§ãã¾ããããã¯ã¹ã¯ãy è»¸ã«æ²¿ã£ã¦0degã®è§åº¦ã¨ä¸è´ããããã«å転ããä¸ãåãããã«ãªã£ã¦ãã¾ããããã¯ã¹ã®å転ã¯ãããã¯ã¹å ã®æ°å¤ã®æ¹åããæããã«ãããã¾ãã -
box2ã§ã¯ãå ç·ã®è§åº¦ãã©ã®ããã«ä½ç¨ãããã表示ãããããã«ããã大ããªæ£ã®å¤ã§ãã150degãå ç·ã«é©ç¨ãã¦ãã¾ããå·¦ä¸é ãããæå®ããè§åº¦150degã«éããã¾ã§ãããã¯ã¹ã¯æè¨åãã«å転ãã¾ãã -
box2ã¨box3ã®offset-pathå¤ã¯åãã§ããbox3ã§ã¯ãoffset-rotateã®0degãè¦ç´ ã«é©ç¨ããã¦ãã¾ãããã®çµæãè¦ç´ ã¯å ç·ã®çµè·¯å ¨ä½ã«æ²¿ã£ã¦ãã®ç¹å®ã®è§åº¦ã§å転ããã¾ã¾ã«ãªããè¦ç´ ã¯çµè·¯ã®æ¹åã«å転ãããã¨ã¯ããã¾ãããbox3ã§ãå ç·ã®çµè·¯ã¯150degã§ãããoffset-rotateã«ãããããã¯ã¹ã®æ¹åã¯çµè·¯ã«æ²¿ã£ã¦å¤åããªããã¨ã«æ³¨æãã¦ãã ãããã¾ããbox3ã®offset-pathããããã£ã¯éå§ä½ç½®ã®<position>ãæå®ãã¦ããªããããå ç·ã®éå§ä½ç½®ã¯è¦ç´ ã®offset-positionããå°åºããã¾ãããã®å ´åãtop 20% left 40%ã¨ãªãã¾ãã -
box4ã®offset-positionã¯ãå å«ãããã¯ã®å·¦ä¸é (0 0) ã«è¨å®ããã¦ãããããè¦ç´ ã®ã¢ã³ã«ã¼ãã¤ã³ãã¨ãªãã»ããã®éå§ä½ç½®ãä¸è´ãã¾ãããã®éå§ä½ç½®ã«ããè¦ç´ ã«ã¯ãå ç·è§åº¦0degãé©ç¨ããã¾ãã -
box5ã§ã¯ãoffset-pathããããã£ã¯at <position>å¤ãæå®ããè¦ç´ ã®å å«ãããã¯ã®ä¸ç«¯ã¨å³ç«¯ã«ããã¯ã¹ãé ç½®ããå ç·ã®è§åº¦ã«60degãé©ç¨ããã¾ãã
ç·ã«æ²¿ã£ã¦è¦ç´ ãã¢ãã¡ã¼ã·ã§ã³
ãã®ä¾ã«ããã¦ãæåã®å³å½¢ã¯ããã®ä½ç½®ã¨æ¹åãåç §ããããã«è¡¨ç¤ºããã¦ãã¾ãããã以å¤ã®å³å½¢ã«ã¯ãå ç·ã®ç§»åãã¹ãé©ç¨ããã¦ãã¾ãã
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%;
}
}
çµæ
offset-path ãé©ç¨ããã¦ããæåã® 2 ã¤ã®ãµã³ãã«ã§ã¯ã offset-rotate ã使ç¨ããªãå ´å㨠offset-rotate ã使ç¨ããå ´åã®å³å½¢ã®æ¹åã«æ³¨ç®ãã¦ãã ããããããã®ãµã³ãã«ã¯ã©ã¡ããã offset-position ã®æ¢å®å¤ normal ã使ç¨ãã¦ããããããã¹ã®åã㯠50% 50% ããå§ã¾ãã¾ããæå¾ã® 2 ã¤ã® offset-path ãµã³ãã«ã¯ãè§ã® <size> å¤ï¼closest-corner ããã³ farthest-cornerï¼ã®å½±é¿ã表示ããã¦ãã¾ãã closest-corner å¤ã¯ãå³å½¢ããã§ã«è§ã«ãããã (offset-position: auto)ãé常ã«çããªãã»ãããã¹ã使ãã¾ããfarthest-corner å¤ã¯ãå
å«ãããã¯ã®å·¦ä¸è§ããå³ä¸è§ã¾ã§ãæãé·ããªãã»ãããã¹ã使ãã¾ãã
仿§æ¸
| Specification |
|---|
| Motion Path Module Level 1 > # ray-function > |