В основе анимаций в Motion One лежит единая модель трансформаций,
построенная поверх CSS transform. Вместо ручного управления
строкой transform, библиотека предоставляет декларативные
свойства:
x, y, z — перемещение
(translate)scale, scaleX, scaleY —
масштабированиеrotate, rotateX, rotateY,
rotateZ — вращениеКаждое из этих свойств автоматически компилируется в оптимизированный
transform, без конфликтов между отдельными анимациями.
Перемещение в Motion One задаётся через координаты, которые
соответствуют CSS translateX, translateY,
translateZ.
import { animate } from "motion";
animate(".box", {
x: 200,
y: 100
});
Результат эквивалентен:
transform: translateX(200px) translateY(100px);
Motion One автоматически добавляет единицы измерения
(px), если передано число.
Перемещение поддерживает отрицательные значения:
animate(".box", {
x: -150,
y: -80
});
Это позволяет строить анимации появления, возврата, смещения за пределы экрана и реактивных интерфейсов.
Motion One поддерживает относительные изменения через строки:
animate(".box", {
x: "+=100",
y: "-=50"
});
Такой подход особенно полезен в интерактивных сценариях (drag, hover, scroll-driven motion), где важно сохранять текущее состояние элемента.
Масштабирование изменяет размер элемента без влияния на поток документа.
animate(".box", {
scale: 1.5
});
Значение 1 соответствует исходному размеру.
animate(".box", {
scaleX: 2,
scaleY: 0.5
});
Это даёт растяжение по одной оси и сжатие по другой.
Motion One объединяет все трансформации в одну оптимизированную строку:
animate(".box", {
x: 100,
y: 50,
scale: 1.2
});
Внутри браузера это преобразуется в:
transform: translateX(100px) translateY(50px) scale(1.2);
Порядок применения фиксирован и оптимизирован библиотекой, что
исключает конфликт ручных transform.
Вращение в Motion One поддерживает градусы и автоматическое
управление единицами (deg).
animate(".box", {
rotate: 180
});
Эквивалент:
transform: rotate(180deg);
animate(".box", {
rotateX: 60,
rotateY: 45,
rotateZ: 90
});
Эти значения используются в 3D-трансформациях и требуют наличия перспективы.
Для корректного восприятия 3D вращений используется
perspective:
animate(".scene", {
rotateY: 180
}, {
transformPerspective: 800
});
Или через CSS родителя:
.scene {
perspective: 800px;
}
Без перспективы 3D вращения визуально теряют глубину и выглядят как плоские искажения.
По умолчанию центр трансформации — середина элемента. Это влияет на вращение и масштабирование.
animate(".box", {
rotate: 90
}, {
transformOrigin: "top left"
});
Другие распространённые значения:
centertopbottomleftright50% 50%, 0 0)Motion One поддерживает массивы значений для создания последовательных переходов.
animate(".box", {
x: [0, 100, -50, 0],
rotate: [0, 180, 90, 0],
scale: [1, 1.5, 0.8, 1]
}, {
duration: 2
});
Каждый массив интерполируется синхронно, создавая сложные траектории движения.
Хотя основная тема — трансформации, их восприятие сильно зависит от easing.
animate(".box", {
x: 300,
rotate: 360
}, {
easing: "ease-in-out"
});
Для более физически реалистичных движений часто применяется spring:
animate(".box", {
x: 300,
scale: 1.3
}, {
type: "spring",
stiffness: 200
});
Timeline позволяет синхронизировать трансформации нескольких элементов.
import { timeline } from "motion";
timeline([
[".box1", { x: 100, rotate: 90 }, { duration: 0.5 }],
[".box2", { y: 150, scale: 1.2 }, { at: 0.2 }],
[".box3", { x: -80, rotate: -45 }, { at: 0.4 }]
]);
Здесь трансформации накладываются друг на друга с точной временной координацией.
Motion One одинаково работает с DOM и SVG элементами.
animate("circle", {
cx: 200,
cy: 120,
scale: 1.4,
rotate: 45
});
SVG трансформации могут сочетать геометрические свойства
(cx, cy) и CSS-подобные
transform-свойства.
Перемещения x/y часто используются в drag-сценариях.
import { animate } from "motion";
let offsetX = 0;
let offsetY = 0;
element.addEventListener("pointermove", (e) => {
offsetX += e.movementX;
offsetY += e.movementY;
animate(element, {
x: offsetX,
y: offsetY
}, { duration: 0 });
});
Нулевой duration отключает интерполяцию и делает движение мгновенным.
Transform-свойства в Motion One:
x, y,
scale, rotateНа уровне производительности это критически важно для 60 FPS интерфейсов.
Motion One фиксирует порядок:
Это предотвращает визуальные расхождения, которые возникают при
ручной сборке transform.
animate(".modal", {
scale: [0.8, 1],
opacity: [0, 1],
y: [20, 0]
});
element.addEventListener("mouseenter", () => {
animate(element, {
scale: 1.1,
rotate: 2
});
});
element.addEventListener("mouseleave", () => {
animate(element, {
scale: 1,
rotate: 0
});
});
animate(".card", {
rotateY: 15,
rotateX: 10,
scale: 1.05
}, {
transformPerspective: 1000
});
Transform в Motion One не конфликтует с:
opacityfilterbackgroundcolorЭто позволяет комбинировать движение и визуальные эффекты без потери производительности.
transform параллельно Motion
One (перезапись значений)Комбинация translate и rotate позволяет создавать криволинейные движения:
animate(".dot", {
x: [0, 100, 200, 300],
y: [0, 50, 0, -50],
rotate: [0, 90, 180, 360]
}, {
duration: 3
});
Такие анимации применяются в интерфейсах визуализации данных, игровых UI и микроинтеракциях.
Transform не влияет на:
Это делает x, y, scale,
rotate предпочтительными для всех визуальных перемещений в
интерфейсах, где важна стабильность layout.