Библиотека mo.js предоставляет декларативный подход к анимациям, однако в основе её работы лежит манипуляция CSS-свойствами элементов. Любая анимация в mo.js — это интерполяция значений между начальным и конечным состоянием, которые затем применяются к DOM-элементам через inline-стили или трансформации.
Ключевой объект — mojs.Html, предназначенный для
анимации существующих HTML-элементов. Через него происходит прямое
связывание JavaScript-анимации с CSS.
const anim = new mojs.Html({
el: '#box',
x: { 0: 200 },
duration: 1000
});
В данном примере свойство x транслируется в CSS
transform: translateX(...).
mo.js использует абстрактные свойства, которые преобразуются в конкретные CSS-значения:
| Свойство mo.js | CSS-аналог |
|---|---|
x, y |
transform: translate(...) |
scale |
transform: scale(...) |
rotate |
transform: rotate(...) |
opacity |
opacity |
backgroundColor |
background-color |
borderRadius |
border-radius |
Пример комбинированной трансформации:
new mojs.Html({
el: '#circle',
x: { 0: 100 },
scale: { 1: 1.5 },
rotate: { 0: 180 },
duration: 800
});
mo.js объединяет эти параметры в единое CSS-свойство
transform, что повышает производительность.
mo.js активно использует transform и
opacity, поскольку они:
Пример:
new mojs.Html({
el: '#item',
y: { 0: -50 },
opacity: { 0: 1 },
duration: 600
});
Это эквивалентно:
transform: translateY(-50px);
opacity: 1;
mo.js поддерживает интерполяцию цветов в различных форматах:
Пример:
new mojs.Html({
el: '#box',
backgroundColor: { '#ff0000': '#0000ff' },
duration: 1000
});
В процессе анимации библиотека вычисляет промежуточные значения цвета и применяет их к CSS.
mo.js автоматически определяет единицы измерения:
px — по умолчанию%deg — для вращенияПример:
new mojs.Html({
el: '#block',
x: { '0%': '100%' },
duration: 1200
});
Также возможно явное указание:
x: { '0px': '300px' }
mo.js позволяет анимировать произвольные CSS-свойства через
props:
new mojs.Html({
el: '#custom',
props: {
'font-size': { '16px': '32px' },
'letter-spacing': { '0px': '5px' }
},
duration: 700
});
Это особенно полезно для типографики и нестандартных эффектов.
Современные браузеры поддерживают CSS custom properties
(--var). mo.js может анимировать их:
new mojs.Html({
el: '#element',
props: {
'--main-color': { '#ff0000': '#00ff00' }
},
duration: 1000
});
В CSS:
#element {
color: var(--main-color);
}
mo.js может работать совместно с CSS-анимациями и переходами:
Пример запуска после события:
element.addEventListener('transitionend', () => {
anim.play();
});
mo.js предоставляет гибкую систему easing, аналогичную CSS
transition-timing-function.
Пример:
new mojs.Html({
el: '#box',
x: { 0: 200 },
easing: 'cubic.out',
duration: 1000
});
Соответствие CSS:
transition-timing-function: cubic-bezier(...);
mo.js использует собственные кривые, но допускает кастомные функции.
Для тонкой настройки можно использовать lifecycle-хуки:
new mojs.Html({
el: '#box',
x: { 0: 100 },
duration: 500,
onUpdate(progress) {
this.el.style.boxShadow = `0 0 ${progress * 20}px rgba(0,0,0,0.5)`;
}
});
Это позволяет динамически изменять CSS вне стандартных параметров.
Иногда удобнее переключать классы:
onStart() {
this.el.classList.add('active');
}
CSS:
.active {
filter: blur(5px);
}
Таким образом, mo.js управляет состояниями, а CSS — визуальным оформлением.
Ключевые рекомендации:
transform и opacitywidth, height,
top, leftmojs.TimelineПример:
const timeline = new mojs.Timeline();
timeline.add(
new mojs.Html({ el: '#a', x: { 0: 100 } }),
new mojs.Html({ el: '#b', scale: { 1: 2 } })
);
timeline.play();
mo.js не читает автоматически текущие computed styles, если не указано начальное значение. Поэтому важно явно задавать стартовые параметры:
new mojs.Html({
el: '#box',
opacity: { 0.5: 1 }
});
Иначе поведение может быть непредсказуемым.
display)transform перезаписывается полностью, если используется
вне mo.jsРешение — объединение всех transform-эффектов внутри одной анимации.
new mojs.Html({
el: '#card',
x: { 0: 300 },
scale: { 1: 1.2 },
rotate: { 0: 10 },
backgroundColor: { '#ffffff': '#f0f0f0' },
borderRadius: { '0%': '20%' },
duration: 800,
easing: 'expo.out'
});
CSS:
#card {
width: 200px;
height: 100px;
}
Результат:
transformВсе изменения синхронизированы и выполняются через единый механизм интерполяции.
1. Анимация SVG через CSS-подобные свойства
new mojs.Html({
el: 'svg path',
props: {
strokeDashoffset: { 100: 0 }
}
});
2. Псевдо-3D эффекты
new mojs.Html({
el: '#box',
rotateY: { 0: 180 },
duration: 1000
});
mo.js добавляет transform: rotateY(...).
При наличии CSS:
#box {
transform: scale(1.5);
}
и mo.js:
scale: { 1: 2 }
mo.js перезапишет transform. Поэтому необходимо:
Такой подход позволяет строить сложные, производительные и гибкие анимационные системы, сохраняя чистоту архитектуры и разделение ответственности между стилями и логикой.