Вращение в анимациях mo.js строится вокруг трансформаций, применяемых к DOM-элементам или canvas-объектам через свойства tween-модели. Основная идея заключается в управлении углами поворота и наклона во времени, с возможностью комбинировать несколько осей и управлять поведением через easing-функции и таймлайны.
В mo.js трансформации задаются как анимируемые свойства объекта. Среди них ключевыми для вращения и наклона являются:
rotateZ — вращение в плоскости экранаrotateX — наклон по горизонтальной оси (3D)rotateY — наклон по вертикальной оси (3D)angle — альтернативное обозначение поворота в некоторых
модуляхperspective — глубина 3D-эффектаКаждое из этих свойств интерполируется во времени, создавая плавные переходы между начальным и конечным состоянием.
Плоское вращение является наиболее частым сценарием. Оно применяется к элементам интерфейса, иконкам, кнопкам, декоративным фигурам.
const circle = new mojs.Shape({
parent: document.body,
shape: 'circle',
radius: 40,
fill: 'none',
stroke: '#4FC1E9',
strokeWidth: 4,
duration: 1200,
rotateZ: {
0: 360
},
easing: 'cubic.out'
});
circle.play();
Здесь ключевой момент — интерполяция от 0 до 360 градусов. mo.js автоматически распределяет промежуточные значения, создавая непрерывное вращение.
Скорость вращения определяется длительностью анимации и кривой easing. При увеличении длительности вращение становится более плавным и медленным, при сокращении — резким.
rotateZ: {
0: -180
}
Отрицательные значения меняют направление вращения без необходимости дополнительной логики.
Наклон создаёт иллюзию глубины и объёма. В отличие от
rotateZ, оси rotateX и rotateY
работают в трёхмерном пространстве.
Для корректного отображения требуется учитывать перспективу:
const box = new mojs.Html({
el: '#box',
duration: 1000,
perspective: 600,
rotateX: {
0: 60
},
rotateY: {
0: -45
},
easing: 'expo.out'
});
box.play();
Без perspective 3D-эффект становится плоским и теряет
визуальную глубину. Значение перспективы определяет интенсивность
искажения:
Наиболее выразительные анимации достигаются при одновременном использовании нескольких осей. mo.js позволяет задавать независимые кривые для каждого свойства.
const card = new mojs.Html({
el: '.card',
duration: 1400,
perspective: 800,
rotateZ: {
0: 180
},
rotateY: {
0: 25
},
rotateX: {
0: -15
},
easing: 'back.out'
});
card.play();
Такая комбинация создаёт эффект вращающейся в пространстве карточки, где каждая ось влияет на общий визуальный результат.
При работе с несколькими элементами вращение и наклон удобно объединять в таймлайн. Это позволяет синхронизировать движения и управлять общей последовательностью.
const shape1 = new mojs.Shape({
shape: 'circle',
radius: 30,
fill: '#FF6B6B',
rotateZ: { 0: 360 },
duration: 1000
});
const shape2 = new mojs.Shape({
shape: 'rect',
radius: 20,
fill: '#4ECDC4',
rotateY: { 0: 180 },
duration: 1000
});
const timeline = new mojs.Timeline();
timeline.add(shape1, shape2);
timeline.play();
Синхронизация вращений позволяет создавать сложные сцены без ручного управления временем каждого элемента.
Для бесконечных эффектов вращения используются параметры:
repeat — количество повторовyoyo — возврат в исходное состояниеconst loader = new mojs.Shape({
shape: 'circle',
radius: 25,
stroke: '#333',
strokeWidth: 3,
fill: 'none',
rotateZ: {
0: 360
},
duration: 800,
repeat: 5,
easing: 'linear'
});
Линейное easing особенно важно при циклических вращениях, чтобы избежать визуальных скачков скорости.
mo.js позволяет использовать сложные значения интерполяции, включая массивы и функции, что даёт возможность нелинейного вращения.
rotateZ: {
0: 180,
easing: 'elastic.out'
}
Эластичное easing создаёт эффект “перекрута” с возвратом, имитируя физическое поведение объекта.
Вращение используется для создания минималистичных спиннеров:
new mojs.Shape({
shape: 'circle',
radius: 20,
stroke: '#000',
strokeWidth: 2,
fill: 'none',
rotateZ: {
0: 360
},
duration: 900,
repeat: 999,
easing: 'linear'
}).play();
При наведении курсора вращение комбинируется с наклоном:
el.addEventListener('mouseenter', () => {
new mojs.Html({
el,
rotateY: { 0: 15 },
rotateX: { 0: -10 },
duration: 300,
easing: 'quad.out'
}).play();
});
Множественные элементы с разными скоростями вращения создают эффект глубины:
rotateZ: {
0: 360
},
duration: 3000 + Math.random() * 2000
Внутри mo.js трансформации применяются через CSS
transform, где порядок операций влияет на итоговый
результат. Комбинации rotateX, rotateY и rotateZ не коммутативны, что
приводит к различному визуальному результату при изменении порядка
применения.
Также важно учитывать, что при высокой нагрузке большого количества вращающихся объектов производительность может снижаться из-за частого пересчёта layout и paint слоя.
Корректная организация трансформаций требует изоляции анимационных свойств и предсказуемого управления начальными значениями, особенно при сложных сценах с несколькими слоями движения