Свойство CSS offset-distance
Свойство CSS offset-distance задаёт положение элемента вдоль траектории offset-path. Значения и примеры использования.
CSS-свойство offset-distance задаёт, насколько далеко элемент перемещается вдоль своей траектории движения — пути, определённого свойством offset-path. Представьте offset-path как рельсы, а offset-distance — как положение элемента на этих рельсах: значение 0 помещает элемент в начало, 100% — в конец.
Это один из ключевых элементов CSS Motion Path, который позволяет элементу двигаться по произвольной форме (прямой, кривой, SVG-пути) вместо ограниченных переходов через top/left. Само по себе свойство offset-distance является статичным, но анимация от 0 до 100% заставляет элемент скользить вдоль пути.
Когда использовать
- Анимация элемента по кривой или произвольной траектории — самолёт, следующий по маршруту, бусина на нитке, иконка, описывающая круг. Обычные CSS-переходы с этим не справятся, а траектория движения — справится.
- Фиксация элемента в определённой точке пути — задайте фиксированное значение, например
offset-distance: 50%, чтобы разместить элемент посередине своегоoffset-path. - Движение при прокрутке или взаимодействии — обновляйте
offset-distanceчерез JavaScript (или с помощью анимации прокрутки), чтобы перемещать элемент по пути в ответ на действия пользователя.
offset-distance не имеет эффекта, если у элемента не задан offset-path. Без пути нет расстояния, которое можно было бы отмерять.
Значения
Принимает одно значение <length-percentage>:
<length>— абсолютное расстояние от начала пути, например40px.<percentage>— расстояние относительно полной длины пути.0%— начало,100%— конец.
Начальное значение — 0.
Отрицательные значения и значения свыше 100% допустимы. Значение вроде -20% или 120% выводит элемент за пределы пути; для замкнутого пути элемент перемещается по кругу. Это удобно, когда нужно, чтобы элемент начинал вне пути и появлялся на нём в процессе анимации.
offset-distance является частью экспериментального модуля CSS Motion Path. В ранних черновиках спецификации это свойство называлось motion-offset. Перед использованием в продакшне проверьте актуальную поддержку браузерами.
| Свойство | Значение |
|---|---|
| Начальное значение | 0 |
| Применяется к | Трансформируемым элементам |
| Наследуется | Нет |
| Анимируется | Да |
| Версия | Motion Path Module Level 1 |
| DOM Syntax | object.style.offsetDistance = "100%"; |
Синтаксис
offset-distance: <length-percentage>;Например:
/* A fixed point partway along the path */
offset-distance: 70%;
/* Absolute distance from the start */
offset-distance: 50px;
/* Animate from start to end of the path */
@keyframes move {
to {
offset-distance: 100%;
}
}Примеры
Анимация элемента по произвольной траектории
У элемента ниже задан offset-path в форме кривой. Анимация offset-distance от начального значения 0 до 100% плавно перемещает блок вдоль этой траектории. Обратите внимание: offset-rotate: reverse заставляет блок поворачиваться в направлении движения.
Пример с домом и ножницами
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
body {
background-color: #ccc;
}
.mover {
width: 80px;
height: 80px;
background: linear-gradient(#eee 50%, #1c87c9 50%);
position: absolute;
left: 20%;
top: 100px;
offset-path: path("M18.45,58.46s52.87-70.07,101.25-.75,101.75-6.23,101.75-6.23S246.38,5.59,165.33,9.08s-15,71.57-94.51,74.56S18.45,58.46,18.45,58.46Z");
offset-rotate: reverse;
animation: move 4s linear infinite;
}
@keyframes move {
100% {
offset-distance: 100%;
}
}
</style>
</head>
<body>
<h2>Offset-distance property example</h2>
<div class="mover"></div>
</body>
</html>Указание расстояния в процентах
Здесь значение анимируется как процент от полной длины пути, поэтому элемент совершает ровно один полный проход независимо от длины пути. Использование 100% вместо абсолютной длины — наиболее универсальный способ анимации вдоль пути.
Пример свойства CSS offset-distance
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
.scissorHalf {
offset-path: path('M900,190 L993,245 V201 A11,11 0 0,1 1004,190 H1075 A11,11 0 0,1 1086,201 V300 L1294,423 H1216 A11,11 0 0,0 1205,434 V789 A11,11 0 0,1 1194,800 H606 A11,11 0 0,1 595,789 V434 A11,11 0 0,0 584,423 H506 L900,190');
animation: followpath 4s linear infinite;
}
@keyframes followpath {
to {
offset-distance: 100%;
}
}
</style>
</head>
<body>
<h2>Offset-distance property example</h2>
<svg class="box" width="700" height="450" viewBox="350 0 1400 900">
<title>House and Scissors</title>
<rect x="595" y="423" width="610" height="377" fill="#1c87c9" />
<polygon points="506,423 900,190 1294,423" fill="#8ebf42" />
<polygon points="993,245 993,190 1086,190 1086,300" fill="#666" />
<path id="house" d="M900,190 L993,245 V201 A11,11 0 0,1 1004,190 H1075 A11,11 0 0,1 1086,201 V300 L1294,423 H1216 A11,11 0 0,0 1205,434 V789 A11,11 0 0,1 1194,800 H606 A11,11 0 0,1 595,789 V434 A11,11 0 0,0 584,423 H506 L900,190" fill="none" stroke="black" stroke-width="13" stroke-linejoin="round" stroke-linecap="round" />
<path id="secondScissorHalf" class="scissorHalf" d="M30,0 H-10 A10,10 0 0,1 -20,-10 A20,20 0 1,0 -40,10 H20 A10,10 0 0,0 30,0 M-40,-20 A10,10 1 0,0 -40,0 A10,10 1 0,0 -40,-20 M0,0" transform="translate(0,0)" fill="forestgreen" stroke="black" stroke-width="5" stroke-linejoin="round" stroke-linecap="round" fill-rule="evenodd" />
</svg>
</body>
</html>Допустимые значения
| Значение | Описание |
|---|---|
<length-percentage> | Длина или процент, задающие положение вдоль траектории, отсчитываемое от её начала. |
initial | Устанавливает свойство в значение по умолчанию (0). |
inherit | Наследует значение от родительского элемента. |
Связанные свойства
offset-distance редко используется самостоятельно — оно работает совместно с другими свойствами CSS Motion Path:
offset-path— определяет траекторию, по которой движется элемент.offset-rotate— управляет поворотом элемента при движении по пути.offset-anchor— указывает, какая точка элемента помещается на путь.offset— сокращённое свойство, задающее все свойства траектории движения сразу.animation— управляет ключевыми кадрамиoffset-distance, создающими движение.