В CSS и в системах анимации на основе матриц трансформации ключевым
фактором является не только набор используемых операций, но и строгая
последовательность их применения. В Motion One трансформации формируются
в виде единой строки transform, которая затем
интерпретируется браузером как последовательность матричных
преобразований. При этом итоговый визуальный результат определяется
порядком операций, а не только их значениями.
Любая трансформация в двумерной или трёхмерной системе координат может быть представлена как матрица. При комбинировании нескольких операций происходит перемножение матриц, где важен порядок:
В терминах CSS это означает, что выражение:
transform: translateX(100px) rotate(45deg);
даёт иной результат, чем:
transform: rotate(45deg) translateX(100px);
В первом случае элемент сначала сдвигается по оси X, а затем поворачивается вокруг уже смещённой позиции. Во втором — сначала вращается вокруг центра, а затем смещается по уже повернутой системе координат.
Motion One не хранит трансформации как готовую строку. Вместо этого каждая трансформация задаётся как отдельное свойство:
import { animate } from "motion";
animate(element, {
x: 100,
rotate: 45,
scale: 1.2
});
На этапе рендеринга библиотека собирает итоговую строку
transform, комбинируя значения в заранее определённом
порядке.
Motion One использует фиксированную последовательность, близкую к стандартной модели браузеров:
Формирование строки происходит не в порядке объявления свойств, а согласно внутреннему шаблону преобразований.
Пример:
animate(element, {
scale: 1.5,
x: 200,
rotate: 90
});
Фактический результат будет эквивалентен:
transform: translateX(200px) rotate(90deg) scale(1.5);
Даже если свойства заданы в другом порядке, итоговая строка формируется по внутреннему правилу композиции.
Фиксированная последовательность необходима для устранения неоднозначности при интерполяции значений.
Если бы порядок зависел от объявления, возникали бы проблемы:
Единый порядок позволяет Motion One:
При анимации Motion One преобразует начальные и конечные значения в промежуточные матрицы. Рассмотрим:
animate(element, {
x: 0,
rotate: 0
});
animate(element, {
x: 300,
rotate: 180
});
Если порядок был бы различным в разных состояниях, например:
translate → rotaterotate → translateто интерполяция происходила бы между разными пространствами координат, что привело бы к нелинейным скачкам траектории движения.
Motion One предотвращает это, нормализуя порядок до единой схемы.
Порядок трансформаций напрямую влияет на геометрию движения элемента.
animate(element, {
x: 200,
rotate: 45
});
Результат:
При обратной логике:
transform: rotate(45deg) translateX(200px);
Motion One не допускает произвольной смены этого порядка при раздельных свойствах, чтобы исключить неоднозначность поведения.
Motion One позволяет одновременно анимировать несколько независимых свойств:
animate(element, {
x: 100,
y: 50,
rotateZ: 30,
scale: 2
});
Внутри происходит объединение:
x и yИтоговая строка всегда соответствует внутреннему шаблону:
transform: translate(100px, 50px) rotateZ(30deg) scale(2);
При одновременном использовании style.transform и Motion
One возникает конкуренция за управление строкой трансформации.
element.style.transform = "rotate(10deg)";
animate(element, {
x: 100
});
В этом случае Motion One может:
transform;Результат всегда приводится к внутреннему порядку библиотеки.
Motion One предоставляет механизм ручного контроля структуры трансформации через шаблоны:
animate(
element,
{ x: 100, rotate: 45 },
{
transformTemplate: ({ x, rotate }) =>
`rotate(${rotate}) translateX(${x}px)`
}
);
В этом случае порядок становится явным и переопределяет стандартную схему.
Использование шаблона изменяет ключевое свойство системы:
Каждая операция трансформации изменяет локальную систему координат элемента:
Таким образом, порядок операций фактически определяет, в какой системе координат выполняется следующая операция.
Motion One всегда строит цепочку так, чтобы:
При наложении нескольких animate() на один элемент
порядок трансформаций не дублируется, а объединяется:
animate(element, { x: 100 });
animate(element, { rotate: 45 });
Система:
transform;Это предотвращает появление конфликтующих цепочек трансформаций.
Поведение системы можно свести к нескольким ключевым принципам:
Эта модель обеспечивает предсказуемость анимации даже при сложных комбинациях перемещений, вращений и масштабирования, сохраняя единое пространство преобразований для всех состояний элемента.