SVG-пути представляют собой последовательность команд, описывающих геометрию линии: линии, кривые Безье, дуги. Ключевое свойство, которое делает их пригодными для анимации, — возможность интерпретировать путь как непрерывную длину.
В контексте Motion One работа с SVG path чаще всего сводится к двум стратегиям:
Основной принцип: визуальный эффект создаётся не изменением формы как таковой, а управлением параметрами обводки или нормализованной длины пути.
Классический подход основан на свойствах
stroke-dasharray и stroke-dashoffset.
Идея:
<svg viewBox="0 0 400 200">
<path id="line"
d="M10 100 C 100 0, 200 200, 390 100"
fill="none"
stroke="black"
stroke-width="3" />
</svg>
import { animate } from "motion";
const path = document.querySelector("#line");
const length = path.getTotalLength();
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
animate(path, {
strokeDashoffset: [length, 0]
}, {
duration: 2,
easing: "ease-in-out"
});
Такой подход универсален и работает во всех браузерах, но требует ручного вычисления длины пути.
Motion One предоставляет более высокоуровневую абстракцию — свойство
pathLength.
Вместо работы с пикселями используется нормализованная шкала от 0 до 1.
import { animate } from "motion";
animate("#line", {
pathLength: [0, 1]
}, {
duration: 2
});
0 — путь полностью скрыт1 — путь полностью отрисованЭто устраняет необходимость в getTotalLength() и ручных
вычислениях.
Чистая «рисующаяся линия» часто дополняется изменением прозрачности.
animate("#line", {
pathLength: [0, 1],
opacity: [0, 1]
}, {
duration: 1.5,
easing: "ease-out"
});
Такой подход особенно полезен для:
SVG часто содержит несколько путей, которые нужно анимировать согласованно.
<svg viewBox="0 0 400 200">
<path class="shape" d="M10 10 L390 10" />
<path class="shape" d="M10 100 L390 100" />
<path class="shape" d="M10 190 L390 190" />
</svg>
import { animate, stagger } from "motion";
animate(".shape", {
pathLength: [0, 1]
}, {
duration: 1.2,
delay: stagger(0.2)
});
SVG path может содержать сложные сегменты:
C)Q)A)Motion One не требует различать типы сегментов — интерпретация происходит на уровне общей длины пути.
animate("#curve", {
pathLength: [0, 1]
}, {
duration: 3,
easing: "ease-in-out"
});
Особенности поведения:
Timeline позволяет синхронизировать несколько стадий анимации.
import { timeline } from "motion";
timeline([
["#line", { pathLength: [0, 1] }, { duration: 1 }],
["#line", { opacity: [1, 0.2] }, { duration: 0.5 }]
]);
Принцип:
Помимо «рисования», важной техникой является морфинг — преобразование одной формы в другую.
animate("#shape", {
d: [
"M10 100 C 100 0, 200 200, 390 100",
"M10 100 C 100 200, 200 0, 390 100"
]
}, {
duration: 2
});
Типовая стратегия подготовки:
После подготовки:
Motion One позволяет комбинировать вычисляемые значения с анимацией.
const radius = 80;
animate("#circlePath", {
d: `
M 100 100
m -${radius}, 0
a ${radius},${radius} 0 1,0 ${radius * 2},0
a ${radius},${radius} 0 1,0 -${radius * 2},0
`
}, {
duration: 1.5
});
Использование шаблонных строк позволяет:
Иногда требуется анимировать не весь путь, а его часть.
Подходы:
<path>clipPath)strokeDasharray с сегментациейanimate("#segment", {
pathLength: [0, 0.5]
}, {
duration: 1
});
Это позволяет создавать эффекты:
Ключевые факторы оптимизации:
В контексте Motion One оптимизация особенно важна при массовых анимациях, так как библиотека стремится сохранять высокую частоту кадров за счёт лёгкого runtime.
Часто SVG path анимации комбинируются с трансформациями:
animate("#line", {
pathLength: [0, 1],
scale: [0.8, 1],
rotate: [0, 10]
}, {
duration: 2
});
Эффект:
SVG path часто связывается с состоянием интерфейса:
Motion One интегрируется с такими сценариями через динамическое обновление параметров анимации:
function updateProgress(value) {
animate("#progressPath", {
pathLength: [0, value]
}, {
duration: 0.4
});
}
При построении комплексных сцен используется комбинация:
Это позволяет создавать: