Работа с атрибутами в DOM и SVG отличается от изменения CSS-свойств: атрибуты напрямую влияют на структуру и семантику элемента. В Motion One анимация атрибутов опирается на тот же механизм интерполяции значений, что и стили, но с учётом особенностей представления DOM-узлов.
Анимации атрибутов применяются к числовым и строковым значениям, которые могут быть интерполированы во времени. Это особенно важно для SVG, где атрибуты определяют геометрию, визуальные эффекты и взаимодействие элементов.
Любой анимируемый атрибут проходит три стадии:
При использовании Motion One достаточно передать элемент и объект свойств:
import { animate } from "motion";
animate(element, {
width: 300
});
В этом случае width может быть как CSS-свойством, так и
атрибутом, в зависимости от типа элемента и контекста. Для SVG поведение
аналогично, но интерпретация происходит через SVG-атрибуты.
SVG — основная область, где атрибутная анимация раскрывается максимально полно. Геометрические свойства, такие как координаты, радиусы и параметры обводки, являются атрибутами, а не стилями.
animate(circle, {
r: 80,
cx: 200,
cy: 200
});
Здесь изменяются атрибуты:
r — радиус окружностиcx, cy — координаты центраMotion One интерполирует числовые значения, обеспечивая плавное изменение формы.
SVG-пути используют атрибут d, который представляет
собой строку команд. Несмотря на строковый формат, Motion One умеет
интерполировать совместимые пути:
animate(path, {
d: "M 10 80 Q 95 10 180 80",
});
При условии совместимой структуры пути происходит морфинг формы.
SVG-атрибуты, связанные с обводкой, часто используются для создания эффекта прорисовки:
animate(path, {
strokeDashoffset: 0
}, {
duration: 2
});
В связке с предварительно установленным stroke-dasharray
создаётся эффект постепенного рисования линии.
Подходящие атрибуты:
stroke-dashoffsetstroke-dasharraystroke-widthopacityMotion One автоматически определяет числовые значения и строит плавный переход между ними.
animate(rect, {
width: 500,
height: 200,
x: 100
});
Каждое значение интерполируется независимо, даже если атрибуты относятся к разным системам координат.
Ключевая особенность:
Не все атрибуты можно интерполировать напрямую. Строковые значения без числовой структуры изменяются дискретно.
Пример:
animate(text, {
"font-family": "Arial"
});
Такой переход не анимируется плавно — происходит мгновенная замена значения.
Анимация возможна только при наличии числовых компонентов внутри строки.
HTML-атрибуты data-* также могут участвовать в анимации,
если их значения числовые:
animate(element, {
"data-progress": 100
});
Это используется в сценариях:
Важно учитывать, что изменение атрибутов не всегда вызывает перерасчёт layout, поэтому подобные анимации часто легче для браузера.
Атрибуты часто комбинируются с трансформациями, создавая комплексные анимации:
animate(svgElement, {
x: 200,
y: 100,
opacity: 0.5
});
При этом:
x, y могут интерпретироваться как
transformopacity изменяет визуальную прозрачностьСистема автоматически распределяет свойства по оптимальным каналам рендеринга.
Одним из наиболее сложных сценариев является изменение формы через
атрибут d.
Условия корректного морфинга:
animate(path, {
d: "M10 10 L 200 200 L 10 200 Z"
});
При соблюдении структуры происходит плавное преобразование формы без резких скачков.
Некоторые атрибуты могут содержать единицы (px,
%, em). Motion One извлекает числовую часть и
выполняет интерполяцию:
animate(element, {
width: "500px",
height: "300px"
});
Механизм:
Анимация атрибутов может быть как дешёвой, так и дорогой в зависимости от типа свойства.
Оптимальные случаи:
x, y)Менее оптимальные случаи:
width,
height в HTML)Рекомендации по производительности:
SVG поддерживает наследование части атрибутов, что влияет на поведение анимации:
fillstrokeopacityПри анимации родительского элемента дочерние элементы могут визуально изменять состояние без прямого вмешательства.
В реальных сценариях атрибуты часто используются совместно со стилями:
animate(element, {
opacity: 1,
transform: "translateX(100px)",
"stroke-width": 4
});
Разделение происходит автоматически:
Анимация атрибутов может изменяться во время выполнения:
const controls = animate(circle, {
cx: 300
});
controls.cancel();
animate(circle, {
cx: 50
});
Такой подход используется для интерактивных интерфейсов и реактивных визуализаций.
Эти ограничения определяют архитектуру анимаций и требуют выбора корректного типа свойства для каждой задачи