ray()
Базовая версия 2022
Новое
С сентября 2022 года эта функция работает на последних версиях устройств и браузеров. Возможно, она не будет работать на старых устройствах или браузерах.
Функция ray() CSS функция определяет отрезок прямой, по которому может перемещаться анимированный элемент. Этот отрезок прямой называется «луч». Луч начинается от offset-position и простирается в направлении указанного угла. Длина луча может быть ограничена указанием размера и использованием ключевого слова contain.
Синтаксис
/* 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);
Параметры
Параметры можно указывать в любом порядке.
<angle>-
Определяет направление отрезка прямой от начальной точки смещения. Угол
0degлежит на оси y, направленной вверх, и положительные углы увеличиваются по часовой стрелке. <size>-
Определяет длину отрезка прямой, то есть расстояние между
offset-distance0%и100%, относительно содержащей области. Этот параметр необязателен (значениеclosest-sideиспользуется, если параметр<size>не указан). Он принимает следующие ключевые значения:closest-side: Расстояние между начальной точкой луча и ближайшей стороной содержащей области элемента. Если начальная точка луча лежит на грани содержащей области, длина отрезка равна нулю. Если начальная точка луча находится вне содержащей области, грань содержащей области считается бесконечной. Это значение по умолчанию.closest-corner: Расстояние между начальной точкой луча и ближайшей вершиной содержащей области элемента. Если начальная точка луча лежит на вершине содержащей области, длина отрезка равна нулю.farthest-side: Расстояние между начальной точкой луча и самой дальней стороной содержащей области элемента. Если начальная точка луча находится вне содержащей области, грань содержащей области считается бесконечной.farthest-corner: Расстояние между начальной точкой луча и самой дальней вершиной содержащей области элемента.sides: Расстояние между начальной точкой луча и точкой пересечения отрезка прямой с границей содержащей области. Если начальная точка находится на границе или вне границы содержащей области, длина отрезка равна нулю. contain-
Уменьшает длину отрезка прямой так, чтобы элемент оставался в пределах содержащей области, даже при
offset-distance: 100%. В частности, длина отрезка уменьшается на половину ширины или половину высоты области рамки элемента, в зависимости от того, что больше, и никогда не становится меньше нуля. Этот параметр необязателен. at <position>-
Определяет точку, с которой начинается луч и где элемент размещается в своей содержащей области. Этот параметр необязателен. Если указано, значение
<position>должно предшествовать ключевому словуat. Если он пропущен, используется значениеoffset-positionэлемента. Если он пропущен, и у элемента нет значенияoffset-position, используемое значение для начальной точки луча —offset-position: normal, что размещает элемент в центре (или50% 50%) содержащей области.
Описание
Функция ray() позиционирует элемент по траектории, указывая его расположение в двумерном пространстве с помощью угла и расстояния от опорной точки (полярные координаты). Эта функция делает функцию ray() полезной для создания 2D пространственных переходов. Для сравнения, этот подход отличается от способа задания точки по ее горизонтальному и вертикальному расстоянию от фиксированного начала (прямоугольные координаты), используемого функцией translate(), и от перемещения элемента по заданной траектории с помощью анимации.
Поскольку ray() работает в 2D пространстве, важно учитывать как начальное положение, так и ориентацию элемента. Когда функция ray() применяется как значение offset-path элемента, вот как вы можете контролировать эти аспекты:
- Элемент первоначально позиционируется путем перемещения точки
offset-anchorэлемента в начальную точку смещения элемента. По умолчанию начальная точка луча определяется значениемoffset-position. Еслиoffset-positionявно указано какnormal(или опущено и оставлено по умолчанию какnormal), элемент позиционируется вcenter(или50% 50%) своей содержащей области. Указаниеoffset-position: autoустанавливает начальную точку вtop leftуглу (или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> =
[ 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>
Примеры
Определение угла и начальной позиции луча
В этом примере показано, как работать с начальной позицией элемента и как ориентация элемента изменяется в зависимости от заданного угла луча.
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, позволяя сравнить их бок о бок. Верхняя часть каждого ящика выделена solid линией, чтобы проиллюстрировать изменения в точках начала луча и ориентациях. После размещения в точке начала луча ящик выстраивается в направлении указанного угла луча. Если offset-position не указано, то по умолчанию начальная позиция смещения луча — это центр (или 50% 50%) контейнера ящика.
Результат
-
box1изначально позиционируется так, что его точка привязки (его центр) находится в точке начального смещения (50% 50%контейнера).box1также поворачивается, чтобы выровнять его по углу0degлуча. Это будет начальной точкой пути. Вы можете наблюдать изменения положения и поворота ящика, сравнивая его с выцветшимbox0слева. Ящик поворачивается, чтобы соответствовать углу0degпо оси Y, направляясь вверх. Поворот ящика заметен по ориентации числа внутри него. -
В
box2, для луча применяется больший положительный угол150deg, чтобы показать, как работает угол луча. Начав с верхнего левого угла, ящик поворачивается по часовой стрелке, чтобы достичь заданного угла150deg. -
box2иbox3имеют одинаковые значенияoffset-path. Вbox3, также применяется значениеoffset-rotate0deg. В результате элемент будет оставаться повернутым под этим углом на всем пути луча, и элемент не будет поворачиваться в направлении пути. Обратите внимание вbox3, что путь луча находится под углом150deg, но ориентация ящика не изменится вдоль пути из-заoffset-rotate. Также обратите внимание, что свойствоoffset-pathдляbox3не указывает начальную<position>, поэтому начальная позиция луча определяется поoffset-positionэлемента, которая в данном случае равнаtop 20% left 40%. -
offset-positionдляbox4установлено в верхний левый угол (0 0контейнера), и в результате точка привязки элемента и начальная позиция смещения совпадают. К элементу в этой начальной точке применён угол луча0deg. -
В
box5, свойствоoffset-pathуказывает значениеat <position>, что помещает ящик вbottomиrightкрай контейнера элемента, и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, обратите внимание на ориентацию фигуры без offset-rotate и с offset-rotate. Оба этих примера используют значение по умолчанию для offset-position normal, а значит, движение по пути начинается с 50% 50%. Последние два offset-path примера демонстрируют влияние значений <size> углов: closest-corner и farthest-corner. Значение closest-corner создаёт очень короткий смещённый путь, так как фигура уже находится в углу (offset-position: auto). Значение farthest-corner создаёт самый длинный смещённый путь, проходящий от верхнего левого угла контейнера до нижнего правого.
Спецификации
| Спецификация |
|---|
| Модуль пути движения уровня 1 # ray-function |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
ray |
116 | 116 | 122 | 102 | 16 | 116 | 122 | 78 | 16 | 24.0 | 116 |
position |
116 | 116 | 122 | 102 | 17.2 | 116 | 122 | 78 | 17.2 | 24.0 | 116 |
size |
116 | 116 | 122 | 102 | 17 | 116 | 122 | 78 | 17 | 24.0 | 116 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/ray