В системах CSS-трансформаций точка привязки преобразований
определяет, вокруг какого места элемента выполняются операции
масштабирования, вращения и наклона. В контексте Motion One управление
transform-origin играет ключевую роль при построении
предсказуемых и визуально корректных анимаций.
По умолчанию трансформации применяются относительно центра элемента, что эквивалентно значению:
transform-origin: 50% 50%;
Однако в реальных интерфейсах центр далеко не всегда является желаемой точкой. Кнопки, карточки, иконки, выпадающие меню и SVG-элементы часто требуют смещения точки трансформации для достижения естественного поведения.
transform-origin задаёт координаты точки, относительно
которой выполняются следующие операции:
Формат задания:
transform-origin: x y;
Дополнительно допускается третье значение для 3D:
transform-origin: x y z;
Типичные значения:
centertop, bottom, left,
right0%, 50%, 100%)20px 10px)В Motion One transform-origin управляется так же, как и
любой другой CSS-свойство, но становится частью анимационного контекста.
Это означает, что его можно:
Базовая структура анимации:
import { animate } from "motion";
animate(
".box",
{ rotate: 180 },
{ duration: 1 }
);
Если элемент вращается, но точка трансформации не задана, поведение может казаться «плавающим» или неестественным.
Наиболее предсказуемый подход — явно задавать
transform-origin до запуска анимации:
import { animate, styler } from "motion";
styler(".box").set({
transformOrigin: "left top"
});
animate(
".box",
{ rotate: 90 },
{ duration: 0.6 }
);
Такой подход фиксирует базовую геометрию элемента и предотвращает скачки при старте анимации.
В Motion One можно анимировать саму точку трансформации, создавая эффект «перетекания центра тяжести»:
import { animate } from "motion";
animate(
".card",
{
transformOrigin: ["0% 50%", "100% 50%"]
},
{
duration: 1
}
);
Подобная техника используется для:
Один из наиболее частых сценариев — масштабирование элементов интерфейса.
transform-origin: center;
Поведение:
animate(
".button",
{ scale: 1.2 },
{ duration: 0.3 }
);
transform-origin: 0% 0%;
Поведение:
styler(".panel").set({
transformOrigin: "0% 0%"
});
animate(
".panel",
{ scale: 1.1 },
{ duration: 0.4 }
);
Вращение наиболее чувствительно к выбору точки трансформации.
Подходит для:
animate(
".icon",
{ rotate: 360 },
{ duration: 1, repeat: Infinity }
);
transform-origin: left center;
Используется в:
styler(".menu").set({
transformOrigin: "left center"
});
animate(
".menu",
{ rotateY: 45 },
{ duration: 0.5 }
);
При работе с 3D трансформациями добавляется ось Z:
transform-origin: 50% 50% 100px;
В Motion One это часто применяется совместно с:
animate(
".cube",
{
rotateY: 180
},
{
duration: 1
}
);
При неверно заданном origin 3D-объекты теряют ощущение глубины и начинают визуально «ломаться».
В ключевых кадрах можно задавать смену точки трансформации между этапами анимации:
animate(
".box",
{
transformOrigin: ["0% 0%", "50% 50%", "100% 100%"],
rotate: [0, 180, 360]
},
{
duration: 2
}
);
Такой подход позволяет создавать эффекты:
SVG-элементы имеют особенности расчёта координат, и transform-origin часто требует явного задания.
Ключевые подходы:
viewBox как системы координатanimate(
"svg circle",
{
scale: 1.5,
transformOrigin: "50% 50%"
},
{
duration: 0.8
}
);
1. Отсутствие явного задания origin
Приводит к различному поведению в браузерах при сложных трансформациях.
2. Смешивание процентов и пикселей без системы координат
transform-origin: 10px 50%;
Может давать непредсказуемую визуальную точку.
3. Анимация scale без учета layout
При изменении масштаба без фиксированного origin возможны визуальные «скачки» интерфейса.
В Motion One трансформации оптимизируются через использование
GPU-ускорения, однако transform-origin влияет на:
Наиболее производительный сценарий:
В отличие от более тяжёлых решений, таких как Framer Motion, Motion
One опирается на нативные CSS-трансформации и Web Animations API, что
делает поведение transform-origin более прямолинейным и
предсказуемым.
Ключевое отличие:
top centercenterleft centerbottom centertransform-origin не влияет на поток документа, но влияет
на визуальную геометрию. Это создаёт важный принцип:
Поэтому при сложных интерфейсах часто используется связка:
В Motion One возможно вычисление origin на основе размеров элемента:
const rect = document.querySelector(".box").getBoundingClientRect();
animate(
".box",
{
transformOrigin: `${rect.width / 2}px ${rect.height / 2}px`,
rotate: 90
},
{
duration: 0.5
}
);
Такой подход используется в адаптивных интерфейсах, где размеры элементов заранее неизвестны.