Что такое mo.js

mo.js — это JavaScript-библиотека для создания сложных, высокопроизводительных анимаций в браузере с использованием декларативного подхода. Основной акцент сделан на контроле движения объектов, работе с трансформациями, временными функциями и построении анимаций как композиции отдельных модулей.

Библиотека ориентирована на создание визуально выразительных интерфейсов: от микровзаимодействий до полноценных анимационных сцен. В отличие от CSS-анимаций, mo.js предоставляет более гибкий контроль над параметрами движения и позволяет описывать поведение объектов через JavaScript-логику.


Архитектурные особенности

mo.js построена на основе объектной модели, где каждая анимация представляется как экземпляр определённого класса. Основные сущности:

  • Tween — базовая единица анимации
  • Shape — визуальные примитивы (круги, линии, многоугольники)
  • Burst — генерация множества объектов с общими параметрами
  • Timeline — управление последовательностями анимаций

Ключевая идея — композиция: сложные эффекты достигаются объединением простых анимационных элементов.


Принцип работы анимации

В основе mo.js лежит концепция интерполяции значений во времени. Каждый параметр (позиция, масштаб, прозрачность и т.д.) изменяется от начального значения к конечному в течение заданной длительности.

Пример базовой анимации:

const circle = new mojs.Shape({
  shape: 'circle',
  radius: { 0: 50 },
  duration: 1000
});

circle.play();

В данном примере:

  • radius: { 0: 50 } — интерполяция радиуса от 0 до 50
  • duration — длительность в миллисекундах
  • метод play() запускает анимацию

Декларативный подход

mo.js использует декларативное описание анимаций. Вместо пошагового управления кадрами задаётся конечное поведение:

x: { 0: 100 },
opacity: { 1: 0 }

Это означает:

  • значение x изменяется от 0 до 100
  • прозрачность уменьшается от 1 до 0

Такой подход упрощает создание сложных анимаций и делает код более читаемым.


Основные типы объектов

Shape

Shape — базовый визуальный элемент. Поддерживает различные формы:

  • circle
  • rect
  • polygon
  • line
  • zigzag

Пример:

new mojs.Shape({
  shape: 'rect',
  width: 100,
  height: 100,
  fill: 'red'
});

Особенности:

  • автоматическое создание SVG-элементов
  • возможность анимации всех параметров
  • поддержка трансформаций

Burst

Burst используется для создания “взрывных” анимаций — множества объектов, расходящихся из одной точки.

new mojs.Burst({
  radius: { 0: 100 },
  count: 10,
  children: {
    shape: 'circle',
    radius: 5
  }
}).play();

Ключевые параметры:

  • count — количество элементов
  • radius — радиус распространения
  • children — конфигурация дочерних элементов

Tween

Tween — базовый класс для управления временем анимации без привязки к визуальному элементу.

new mojs.Tween({
  duration: 1000,
  onUpdate(progress) {
    console.log(progress);
  }
}).play();

Используется для:

  • синхронизации
  • создания кастомной логики
  • управления внешними состояниями

Timeline

Timeline позволяет объединять несколько анимаций:

const timeline = new mojs.Timeline();

timeline.add(circle, burst);
timeline.play();

Возможности:

  • параллельное выполнение
  • последовательное выполнение
  • управление общей длительностью

Система easing-функций

mo.js предоставляет мощную систему easing-функций, определяющих характер движения.

Пример:

easing: 'elastic.out'

Поддерживаются:

  • линейные
  • квадратичные
  • экспоненциальные
  • упругие (elastic)
  • отскоки (bounce)

Также возможно создание кастомных кривых:

easing: 'cubic-bezier(0.42, 0, 0.58, 1)'

Интерполяция значений

Одной из ключевых особенностей mo.js является гибкая интерполяция:

Числовые значения

scale: { 1: 2 }

Цвета

fill: { 'red': 'blue' }

Строковые значения с единицами

x: { '0px': '100px' }

Случайные значения

delay: 'rand(0, 1000)'

Работа с трансформациями

mo.js автоматически управляет CSS-transform:

  • translate
  • scale
  • rotate
  • skew

Пример:

angle: { 0: 360 },
scale: { 0.5: 1.5 }

Все трансформации объединяются в одну строку transform, что повышает производительность.


Производительность

mo.js оптимизирована для работы с анимациями:

  • использование requestAnimationFrame
  • минимизация перерисовок
  • работа через SVG и transform
  • отсутствие лишних DOM-операций

Библиотека избегает изменения свойств, вызывающих reflow (например, width/height), предпочитая transform и opacity.


Модульность и расширяемость

Каждый компонент mo.js можно:

  • переиспользовать
  • комбинировать
  • расширять

Пример повторного использования конфигурации:

const baseConfig = {
  duration: 500,
  fill: 'blue'
};

new mojs.Shape({
  ...baseConfig,
  radius: 20
});

События и хуки

mo.js предоставляет хуки жизненного цикла:

  • onStart
  • onUpdate
  • onComplete

Пример:

new mojs.Shape({
  duration: 1000,
  onComplete() {
    console.log('Анимация завершена');
  }
});

Это позволяет:

  • запускать дополнительные действия
  • синхронизировать анимации
  • управлять состоянием приложения

Работа с SVG

mo.js активно использует SVG:

  • динамическое создание элементов
  • анимация атрибутов
  • высокая точность рендеринга

Преимущества:

  • независимость от разрешения
  • гибкость форм
  • возможность сложных эффектов

Управление временем

Каждая анимация имеет параметры:

  • duration
  • delay
  • repeat
  • speed

Пример:

repeat: 3,
delay: 200,
speed: 2

Это позволяет точно контролировать поведение анимации.


Композиция сложных эффектов

Сложные анимации строятся через комбинацию:

  • Shape + Burst
  • несколько Timeline
  • вложенные структуры

Пример концепции:

  • центральный объект (Shape)
  • взрыв частиц (Burst)
  • синхронизация через Timeline

Преимущества библиотеки

  • декларативный стиль
  • высокая производительность
  • мощная система интерполяции
  • гибкая архитектура
  • удобная композиция анимаций

Ограничения

  • необходимость изучения API
  • более высокий порог входа по сравнению с CSS
  • зависимость от JavaScript
  • размер библиотеки

Типичные сценарии использования

  • микровзаимодействия (hover, click)
  • анимация кнопок
  • загрузочные индикаторы
  • визуальные эффекты (взрывы, частицы)
  • интерактивные интерфейсы

Связь с другими технологиями

mo.js часто используется вместе с:

  • CSS для базовой стилизации
  • JavaScript-фреймворками (React, Vue)
  • SVG-графикой

Она не заменяет CSS-анимации, а дополняет их в сложных сценариях.


Итоговая концепция

mo.js представляет собой инструмент для описания анимации как системы взаимосвязанных объектов, где движение, форма и время объединяются в единую декларативную модель.