Ease, ease-in, ease-out, ease-in-out

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

Базовая роль easing заключается в управлении восприятием движения. Даже простая трансформация позиции или масштаба приобретает выразительность за счёт изменения кривой скорости.


Линейная интерполяция и её ограничения

При линейной интерполяции значение изменяется с постоянной скоростью:

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

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


Модель easing в mo.js

В mo.js easing реализуется через набор предустановленных функций и поддержку кастомных кривых. Основные категории:

  • ease-in
  • ease-out
  • ease-in-out
  • linear (для сравнения)

Каждая категория задаёт характер изменения скорости во времени t ∈ [0, 1], где:

  • 0 — начало анимации
  • 1 — завершение анимации

Ease-in: ускорение от нуля

Ease-in описывает поведение, при котором движение начинается медленно и постепенно ускоряется.

Формально это функция, у которой производная увеличивается со временем:

y = t^2

Характер поведения

  • начальная фаза почти статична
  • ускорение нарастает к середине
  • максимальная скорость достигается ближе к завершению

Применение в mo.js

В mo.js часто используется для появления объектов, которые «въезжают» в сцену:

const shape = new mojs.Shape({
  left: 0,
  top: 0,
  scale: { 0: 1 },
  duration: 800,
  easing: 'ease.in.quad'
});

Визуальная логика

Ease-in создаёт эффект накопления энергии. Объект как бы преодолевает инерцию перед началом движения.


Ease-out: замедление к концу

Ease-out противоположен ease-in: движение начинается быстро и постепенно замедляется.

Математическая модель:

y = 1 - (1 - t)^2

Характер поведения

  • резкий старт
  • постепенная потеря скорости
  • плавная остановка

Применение в mo.js

Используется для завершения анимаций, когда требуется естественное «оседание» объекта:

const circle = new mojs.Shape({
  radius: { 0: 40 },
  opacity: { 1: 0 },
  duration: 600,
  easing: 'ease.out.quad'
});

Визуальная логика

Ease-out имитирует трение и сопротивление среды. Движение выглядит инерционным, без резкой остановки.


Ease-in-out: комбинированная кривая

Ease-in-out объединяет ускорение в начале и замедление в конце. Это одна из наиболее универсальных форм easing.

Математическая интерпретация:

y =

Характер поведения

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

Применение в mo.js

Используется в большинстве UI-анимаций, где требуется естественное движение:

const burst = new mojs.Burst({
  radius: { 0: 100 },
  count: 10,
  children: {
    shape: 'circle',
    radius: 5,
    easing: 'ease.in.out.quad'
  }
});

Визуальная логика

Ease-in-out воспринимается как наиболее «человеческая» кривая движения, поскольку сочетает фазу разгона и торможения.


Реализация easing в mo.js

В mo.js easing задаётся строковыми идентификаторами или функциями. Наиболее распространённая схема:

  • ease.in.quad
  • ease.out.quad
  • ease.in.out.quad

Структура обозначения:

ease.[тип].[степень]

Где:

  • тип: in / out / in.out
  • степень: linear, quad, cubic, quart, quint и др.

Квадратичные функции easing

Квадратичные функции являются базовыми и наиболее часто применяются.

ease-in quadratic

y = t^2

ease-out quadratic

y = 1 - (1 - t)^2

ease-in-out quadratic

y =

Отличия между ease-in, ease-out и ease-in-out

Поведенческое сравнение

  • ease-in: акцент на начале движения
  • ease-out: акцент на завершении
  • ease-in-out: сбалансированная динамика

Визуальная нагрузка

Ease-in увеличивает ощущение ожидания перед действием. Ease-out снижает резкость завершения. Ease-in-out создаёт непрерывность движения.


Использование easing в сложных анимациях mo.js

В композиционных анимациях mo.js easing влияет на взаимодействие нескольких элементов:

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

Пример комбинированной сцены:

const burst = new mojs.Burst({
  radius: { 0: 120 },
  count: 8,
  children: {
    shape: 'rect',
    radius: { 4: 10 },
    easing: 'ease.out.quad',
    duration: 700
  }
});

const ring = new mojs.Shape({
  shape: 'circle',
  radius: { 0: 60 },
  stroke: 'white',
  fill: 'none',
  easing: 'ease.in.out.cubic',
  duration: 900
});

Влияние easing на восприятие интерфейса

Изменение кривой скорости напрямую влияет на когнитивное восприятие интерфейса:

  • резкие кривые воспринимаются как технические
  • плавные кривые создают эффект органичности
  • комбинированные easing снижают визуальную нагрузку

Ease-in и ease-out часто применяются совместно для формирования логики «появление — взаимодействие — исчезновение».


Связь easing с физическими моделями

Easing-функции можно интерпретировать через физические аналогии:

  • ease-in — движение под действием силы без начальной скорости
  • ease-out — движение с сопротивлением среды
  • ease-in-out — система с инерцией и трением

Такая модель используется при построении сложных анимационных сцен в mo.js для достижения реалистичности движения.


Кастомные easing-кривые

Помимо предустановленных функций mo.js допускает использование пользовательских кривых на основе cubic-bezier. Это позволяет формировать уникальные паттерны движения, выходящие за пределы стандартных ease-in/out моделей.

Типовая форма:

cubic-bezier(x1, y1, x2, y2)

Такие кривые позволяют изменять:

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

Комбинирование easing в одной сцене

В сложных анимационных системах разные элементы используют разные кривые:

  • фоновые элементы — ease.out (мягкое завершение)
  • активные элементы — ease.in.out (сбалансированное движение)
  • триггерные эффекты — ease.in (резкий старт)

Такое распределение создаёт многослойную динамику сцены, где каждый элемент имеет собственную временную логику.