В mo.js большинство параметров анимации принимают числовые значения без необходимости указывать единицы измерения в явном виде. Это связано с тем, что библиотека работает поверх абстрактного слоя трансформаций и интерполяций, а не напрямую с CSS-движком свойств.
Ключевая особенность — разделение типов значений:
Такой подход позволяет единообразно описывать анимации независимо от того, применяется ли трансформация, геометрия или стилизация SVG.
Большая часть свойств mo.js работает с безразмерными числами:
scaleopacityangleprogressx, y, z (в контексте
трансформаций)scale: 1.5
Значение интерпретируется как коэффициент. Отсутствие единиц связано с тем, что масштабирование является относительным преобразованием.
opacity: 0.6
Диапазон нормализован в интервале от 0 до 1, где единицы измерения не применяются в принципе.
angle: 180
Угловые значения задаются в градусах. Несмотря на отсутствие явного указания единиц, система интерпретирует их как degrees по умолчанию.
При работе с позиционированием и размерами часто используются пиксели. mo.js допускает как числовое, так и строковое представление.
x: 200,
y: '150px'
Оба варианта эквивалентны, поскольку числовое значение трактуется как пиксельное смещение в координатной системе canvas или DOM-преобразований.
{
width: 300,
height: '200px',
radius: 50
}
Единообразие не требуется, однако смешивание типов увеличивает стоимость нормализации значений внутри движка.
Проценты применяются в контексте размеров контейнера или родительского элемента. Строковый формат обязателен.
x: '50%',
y: '20%'
50% по оси X означает центрирование относительно ширины
контейнера100% соответствует правому или нижнему краю
областиВнутри mo.js процентные значения преобразуются в пиксели во время инициализации или на этапе пересчёта при изменении размеров сцены.
Несмотря на то, что значения углов задаются числами, в более сложных сценариях допускается использование строк с указанием единиц.
angle: '90'
Фактически строковое и числовое представление не различаются, поскольку единицей измерения считается градус по умолчанию.
Вектор поворота применяется к transform-origin объекта, если он определён, либо к геометрическому центру.
Все временные характеристики в mo.js базируются на миллисекундах:
durationdelayrepeatDelayduration: 600,
delay: 200
Строковые временные единицы ("1s", "500ms")
не являются нативной частью модели и требуют ручного преобразования
перед передачей в библиотеку.
Внутренний движок ожидает только числовые значения, поэтому любые альтернативные форматы должны быть преобразованы:
Некоторые свойства допускают строковое представление с единицами:
strokeWidth: '5px'
или
borderWidth: '2px'
Однако такие значения чаще всего нормализуются в числовые пиксели до начала анимации.
mo.js поддерживает выражения, позволяющие строить динамические изменения значений.
x: '+=100',
y: '-=50'
Такая форма используется для инкрементальных трансформаций относительно текущего состояния объекта.
+= добавляет значение-= вычитает значение*= масштабирует относительно текущего значенияscale: '*=1.2'
Подобная модель позволяет строить цепочки трансформаций без ручного пересчёта координат.
В качестве значений допускаются функции, возвращающие число или строку.
x: function () {
return Math.random() * 300;
}
Функции вычисляются на этапе инициализации или перед каждым тиком анимации, в зависимости от конфигурации tween/timeline.
Функции могут принимать параметры состояния анимации:
Это позволяет строить нелинейные траектории без использования ключевых кадров.
mo.js предоставляет встроенную систему генерации случайных значений:
x: 'rand(0, 300)'
или
angle: 'rand(-180, 180)'
Такие выражения интерпретируются парсером библиотеки и преобразуются в функции генерации случайных чисел.
В одном tween могут комбинироваться различные типы значений:
{
x: 0,
y: '100%',
angle: 45,
scale: 1.2
}
Движок приводит все значения к внутреннему числовому представлению перед интерполяцией.
Перед запуском анимации выполняется этап преобразования:
Этот этап критичен для производительности при большом количестве объектов в timeline.
Наиболее частые проблемы связаны с неявной типизацией:
"100" вместо 100"1s" без преобразованияpx и % без учета
контейнераТакие случаи приводят к резкому скачку значений или отсутствию анимации.
При конфликте типов mo.js применяет стратегию приведения:
Это снижает вероятность критического сбоя, но может приводить к визуальным артефактам.
Чем больше строковых и вычисляемых значений используется, тем выше стоимость предварительной обработки. Наиболее быстрыми считаются:
Наиболее затратными: