SVG-анимация в Motion One опирается на две фундаментальные особенности: декларативную природу SVG-атрибутов и возможность низкоуровневого управления трансформациями через CSS-подобную модель. В отличие от HTML-элементов, SVG требует учёта собственной системы координат, специфики рендеринга контуров и различий между атрибутами и стилями.
SVG (Scalable Vector Graphics) использует математическое описание
графики, где каждый элемент существует в координатном пространстве,
заданном через viewBox.
Ключевые особенности:
Эти особенности напрямую влияют на поведение Motion One при анимации SVG-элементов.
Motion One предоставляет единый API animate, который
работает с SVG-элементами так же, как с DOM-узлами, но с рядом
нюансов.
import { animate } from "motion"
animate("circle", {
cx: [0, 200],
cy: [0, 200],
r: [10, 50]
})
Здесь анимация происходит через изменение атрибутов SVG
(cx, cy, r), а не только
CSS-свойств.
SVG поддерживает два механизма управления свойствами:
x, ycx, cyrfill, strokestroke-widthtransformopacityfiltervisibilityMotion One автоматически определяет тип свойства и применяет корректный способ интерполяции.
Одной из ключевых проблем SVG-анимации является поведение
transform.
SVG использует локальные системы координат, и поэтому:
translate зависит от viewBoxscale влияет на толщину strokerotate требует явного указания центраВ SVG по умолчанию transform-origin не совпадает с
HTML-моделью.
Правильная настройка:
animate(".icon", {
rotate: 180
}, {
transformOrigin: "50% 50%"
})
или через CSS:
.icon {
transform-box: fill-box;
transform-origin: center;
}
Одна из наиболее распространённых техник SVG-анимации — “рисование линии”.
SVG-путь можно анимировать через:
stroke-dasharraystroke-dashoffsetКонтур разбивается на “пунктир”, где длина штриха равна длине пути.
import { animate } from "motion"
const path = document.querySelector("path")
const length = path.getTotalLength()
path.style.strokeDasharray = length
path.style.strokeDashoffset = length
animate(path, {
strokeDashoffset: [length, 0]
}, {
duration: 2
})
Motion One корректно интерполирует числовые значения, обеспечивая плавное “прорисовывание”.
<path> и сложной геометриейSVG <path> является наиболее сложным элементом,
поскольку описывает кривые Безье и сегменты.
Motion One не модифицирует сам d напрямую в базовом
сценарии, но поддерживает:
d (при одинаковой
структуре)Пример:
animate("path", {
d: [
"M10 10 H 90",
"M10 10 H 90 V 90"
]
})
SVG масштабируется через viewBox, что создаёт отдельную
систему координат:
<svg viewBox="0 0 100 100">
При анимации важно учитывать:
x/y/cx/cy всегда в координатах viewBoxMotion One интерполирует значения в логическом пространстве, а не в пикселях.
<g>Группы SVG позволяют применять трансформации к набору элементов:
animate("g", {
rotate: 360,
scale: 1.2
})
Особенность:
Пример:
animate("rect", {
fill: ["#ff0000", "#0000ff"],
strokeWidth: [1, 5]
})
SVG может вести себя по-разному в зависимости от:
preserveAspectRatio="xMidYMid meet"
При анимации важно учитывать:
Motion One поддерживает движение элементов вдоль пути.
animate(".dot", {
offsetDistance: [0, 1]
}, {
offsetPath: "path('M10 80 C 40 10, 65 10, 95 80')"
})
Ключевые особенности:
SVG может быть как очень быстрым, так и проблемным в зависимости от подхода.
Оптимизационные принципы:
filterd у pathtransform вместо координатных
атрибутов<g>Motion One использует requestAnimationFrame, что снижает
нагрузку на main thread.
SVG поддерживает стандартные свойства прозрачности:
animate("circle", {
opacity: [0, 1]
})
Особенности:
visibility не интерполируется, а переключаетсяopacity может комбинироваться с transformMotion One позволяет синхронно анимировать SVG и HTML-элементы:
animate(".panel", { x: 100 })
animate("circle", { cx: 100 })
Это важно при создании интерфейсов, где SVG выступает частью UI, а не изолированной графикой.
Motion One использует типизированную интерполяцию:
SVG добавляет дополнительные ограничения:
width/height вместо viewBoxMotion One поддерживает ключевые кадры:
animate("circle", {
cx: [10, 50, 90],
cy: [10, 80, 10]
}, {
duration: 3
})
Особенности:
В связке с Motion One SVG перестаёт быть статической графикой и превращается в координатную систему анимации, где:
Такой подход позволяет строить сложные визуальные системы без ручного управления кадрами и без необходимости низкоуровневого Canvas API.