Библиотека mo.js ориентирована на декларативное описание анимаций, что делает её удобной для построения модульных, переиспользуемых компонентов. Повторное использование достигается за счёт инкапсуляции конфигурации анимации, параметров и логики управления в отдельные сущности.
Ключевая идея — выделение анимационного поведения в самостоятельные блоки, которые можно подключать и конфигурировать независимо от конкретного DOM-контекста.
Базовая единица переиспользования — функция или класс, возвращающая экземпляр анимации:
function createBurstAnimation(options = {}) {
return new mojs.Burst({
radius: { 0: 100 },
count: 10,
children: {
shape: 'circle',
fill: 'cyan',
duration: 1500
},
...options
});
}
Особенности подхода:
optionsФабричные функции позволяют создавать множество экземпляров с разными настройками:
const burst1 = createBurstAnimation({ left: 100, top: 100 });
const burst2 = createBurstAnimation({ left: 200, top: 200, count: 20 });
burst1.play();
burst2.play();
Преимущества:
Для сложных сценариев используется объектно-ориентированная модель:
class ButtonClickAnimation {
constructor(target) {
this.target = target;
this.timeline = new mojs.Timeline();
this.scale = new mojs.Html({
el: target,
scale: { 1: 1.2 },
duration: 300,
yoyo: true
});
this.burst = new mojs.Burst({
parent: target,
radius: { 0: 80 },
count: 8
});
this.timeline.add(this.scale, this.burst);
}
play() {
this.timeline.replay();
}
}
Ключевые элементы:
Timelineplay)mo.js позволяет комбинировать простые компоненты в сложные:
function createComplexAnimation() {
const burst = createBurstAnimation();
const shape = new mojs.Shape({
shape: 'rect',
scale: { 0: 1 },
duration: 500
});
const timeline = new mojs.Timeline();
timeline.add(burst, shape);
return timeline;
}
Композиция даёт:
Компоненты удобно проектировать через конфигурацию:
function createShape({ color = 'red', size = 50, duration = 1000 } = {}) {
return new mojs.Shape({
fill: color,
radius: size,
duration
});
}
Преимущества:
Easing можно вынести в отдельные константы:
const EASING = {
bounce: 'cubic.out',
smooth: 'quad.inout'
};
new mojs.Shape({
easing: EASING.bounce
});
Это обеспечивает:
mojs.Timeline — основной инструмент агрегирования:
function createTimeline(animations = []) {
const timeline = new mojs.Timeline();
timeline.add(...animations);
return timeline;
}
Позволяет:
Анимации можно создавать на лету:
function generateParticles(count) {
return Array.from({ length: count }, (_, i) => {
return new mojs.Shape({
left: Math.random() * window.innerWidth,
top: Math.random() * window.innerHeight,
scale: { 0: 1 },
delay: i * 50
});
});
}
Использование:
const particles = generateParticles(20);
const timeline = new mojs.Timeline().add(...particles);
timeline.play();
Хорошая практика — отделять:
const animation = createBurstAnimation();
document.addEventListener('click', (e) => {
animation.tune({ left: e.pageX, top: e.pageY });
animation.replay();
});
Метод tune позволяет изменять параметры без пересоздания
объекта.
Повторное использование без пересоздания:
const cachedBurst = createBurstAnimation();
function playBurst(x, y) {
cachedBurst.tune({ left: x, top: y }).replay();
}
Плюсы:
Структура проекта:
animations/
burst.js
shapes.js
timelines.js
index.js
Пример экспорта:
export { createBurstAnimation } from './burst';
export { createShape } from './shapes';
Использование:
import { createBurstAnimation } from './animations';
Переиспользуемые компоненты mo.js легко встраиваются:
useEffect(() => {
const animation = createBurstAnimation({ parent: ref.current });
animation.play();
}, []);
mounted() {
const animation = createBurstAnimation({ parent: this.$el });
animation.play();
}
Можно вводить темы анимаций:
const themes = {
success: { fill: 'green' },
error: { fill: 'red' }
};
function createThemedShape(theme) {
return new mojs.Shape({
...themes[theme]
});
}
const baseShape = {
shape: 'circle',
duration: 1000
};
const largeShape = {
...baseShape,
radius: 100
};
const smallShape = {
...baseShape,
radius: 20
};
Компоненты должны предусматривать:
class AnimationWrapper {
constructor() {
this.instance = createBurstAnimation();
}
play() {
this.instance.play();
}
stop() {
this.instance.pause();
}
}
Каждый компонент должен:
Пример:
Burst)Html)Timeline)Компоненты должны легко расширяться:
function createCustomBurst(options) {
const base = createBurstAnimation();
base.tune(options);
return base;
}
Переиспользуемые компоненты проще тестировать:
const anim = createBurstAnimation();
console.assert(anim instanceof mojs.Burst);
Рекомендации:
tune вместо пересозданияTimelineВсе компоненты должны поддерживать:
play()replay()pause()tune()Это делает систему предсказуемой и масштабируемой.
Переиспользуемые компоненты позволяют:
Ключевой принцип — каждая анимация становится самостоятельным модулем, который можно комбинировать, расширять и адаптировать под любые интерфейсы.