Система единиц измерения

Вся система измерений в mo.js опирается на модель canvas-рендеринга, где базовой единицей выступает пиксель. Это означает, что большинство параметров анимации, геометрии и трансформаций интерпретируются напрямую через числовые значения, которые в конечном итоге транслируются в координаты и размеры внутри HTML5 Canvas без промежуточных абстракций вроде rem, em или vw.

Координатная плоскость в mo.js наследует поведение canvas: начало координат располагается в левом верхнем углу области рендеринга, ось X направлена вправо, ось Y — вниз. Все позиционные параметры объектов (например, x, y, left, top в контексте отдельных модулей) интерпретируются как пиксельные смещения относительно этой системы.

При указании значений:

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

Субпиксельная точность влияет на плавность анимации: браузер может интерполировать значения между пикселями, обеспечивая более мягкое движение объектов при изменении координат.

Числовые параметры без единиц

Большая часть API mo.js использует «безразмерные» числа. Это ключевая особенность системы измерений: единицы измерения не указываются явно, а подразумеваются контекстом свойства.

Примеры таких параметров:

  • duration — длительность анимации
  • delay — задержка старта
  • radius — радиус формы
  • strokeWidth — толщина линии
  • scale — коэффициент масштабирования

Во всех этих случаях число интерпретируется как:

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

Например, значение duration: 800 всегда означает 800 миллисекунд, независимо от других настроек сцены или устройства.

Временные единицы и тайминг

Временная модель mo.js полностью основана на миллисекундах. Это упрощает синхронизацию анимаций внутри timeline и исключает неоднозначность.

Основные принципы:

  • duration: 1000 — одна секунда
  • delay: 200 — задержка 0.2 секунды
  • repeat: 3 — повторение анимации фиксированное число раз

Все временные значения складываются в единую временную шкалу, где timeline выступает как контейнер абсолютного времени. При этом вложенные анимации наследуют временную базу родительского timeline, но не изменяют систему единиц.

Процентные и относительные значения

Несмотря на доминирование пиксельной модели, mo.js поддерживает строковые значения с процентами для некоторых свойств. Это вводит относительную систему измерений, привязанную к размерам контейнера или экрана.

Примеры:

  • "100%" — полная ширина или высота контейнера
  • "50%" — половина доступного пространства
  • "0%" — начальная точка отсчёта

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

  • позиционирования объектов относительно сцены
  • задания начальных и конечных значений в анимации
  • адаптивных трансформаций

Важно, что процентные значения не являются универсальными и применяются только в тех параметрах, где предусмотрена поддержка строкового парсинга. В остальных случаях строка будет либо проигнорирована, либо приведена к числу.

Масштабирование и трансформации

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

  • scale: 1 — исходный размер
  • scale: 0.5 — уменьшение в два раза
  • scale: 2 — увеличение в два раза

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

Повороты задаются в градусах:

  • angle: 45 — поворот на 45°
  • angle: 360 — полный оборот

Здесь также отсутствуют единицы измерения в виде строк, используется числовая интерпретация.

Геометрические параметры

Геометрия форм в mo.js строится на простых числовых значениях, интерпретируемых как пиксели:

  • radius — радиус круга или окружности
  • strokeWidth — толщина линии обводки
  • strokeDasharray — длины сегментов линии

Все эти параметры напрямую влияют на отрисовку canvas-объекта. Например, увеличение strokeWidth приводит к физическому расширению линии в пикселях, без масштабирования всей формы.

Привязка к разрешению экрана

Поскольку система измерений основана на пикселях, поведение анимаций зависит от devicePixelRatio. На устройствах с высокой плотностью пикселей (Retina-дисплеи) один логический пиксель может соответствовать нескольким физическим пикселям.

Это приводит к следующим особенностям:

  • визуальная чёткость может отличаться между устройствами
  • одинаковые числовые значения дают одинаковую геометрию, но разную физическую детализацию
  • масштабирование canvas может корректировать итоговое отображение

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

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

При анимации числовые значения интерполируются линейно или через easing-функции. В рамках системы измерений это означает, что любые единицы (пиксели, миллисекунды, коэффициенты) участвуют в математической интерполяции без преобразования типов.

Если значение изменяется от 0 до 100, фактически происходит плавный переход по числовой шкале без смены единиц измерения. Это упрощает внутреннюю модель анимации и делает систему предсказуемой.

Смешанные типы значений

Некоторые параметры допускают использование как чисел, так и строк. Это создаёт гибридную систему измерений:

  • число 100 → интерпретируется как пиксели
  • строка "100%" → интерпретируется как процент
  • строка "10px" (в ограниченных случаях) → может быть приведена к числу

Такая неоднородность требует строгого понимания контекста каждого свойства, так как одинаковое значение в разных полях может иметь разный смысл.

Влияние системы единиц на архитектуру анимаций

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

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

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