Сдвиг по времени

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

Любая анимация в системе строится вокруг нескольких базовых характеристик:

  • стартовый момент (delay)
  • длительность (duration)
  • момент завершения (computed end time)
  • повторение (repeat)
  • направление и цикличность (backwards, yoyo)

Эти параметры формируют дискретную единицу времени, которая затем может быть встроена в более сложные структуры — таймлайны и композиции.

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

Базовый механизм задержки

Простейшая форма временного сдвига — задержка старта анимации:

new mojs.Html({
  el: '.box',
  x: { 0: 200 },
  duration: 800,
  delay: 300
});

Задержка формирует смещение начала анимации относительно глобального времени исполнения. Это позволяет создавать последовательные эффекты без необходимости ручного управления состояниями.

Важная особенность заключается в том, что delay не влияет на саму длительность анимации — он изменяет только момент её запуска.

Отрицательные задержки и «вход в середину»

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

new mojs.Html({
  el: '.circle',
  scale: { 0: 1 },
  duration: 1000,
  delay: -400
});

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

Фактически отрицательная задержка переводит анимацию в состояние частичного прогресса при старте.

Временные цепочки и каскадный сдвиг

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

const els = document.querySelectorAll('.item');

els.forEach((el, i) => {
  new mojs.Html({
    el,
    y: { 50: 0 },
    opacity: { 0: 1 },
    duration: 600,
    delay: i * 120
  });
});

Здесь каждый следующий элемент смещается по времени относительно предыдущего. Такой метод масштабируется линейно и позволяет создавать сложные последовательности без центрального таймера.

Ключевой принцип — формирование временного шага (time step), который задаёт расстояние между стартами анимаций.

Таймлайны как система координат времени

Более строгая модель управления сдвигами реализуется через таймлайны. Таймлайн агрегирует несколько анимаций и задаёт им общую временную ось.

Внутри таймлайна каждая анимация получает локальное время, смещённое относительно начала контейнера.

const timeline = new mojs.Timeline();

timeline.add([
  new mojs.Html({
    el: '.a',
    x: { 0: 100 },
    duration: 500,
    delay: 0
  }),
  new mojs.Html({
    el: '.b',
    x: { 0: 100 },
    duration: 500,
    delay: 200
  })
]);

timeline.play();

В этом случае delay начинает играть роль локального смещения внутри общего контейнера, а не глобального времени.

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

Перекрытие анимаций

Сдвиг по времени часто используется не для последовательности, а для создания перекрытий. Это достигается за счёт перекрывающихся интервалов duration и delay.

Если:

  • анимация A: duration 800ms, delay 0
  • анимация B: duration 800ms, delay 400ms

то в интервале 400–800ms обе анимации будут выполняться одновременно.

Такой подход создаёт ощущение непрерывного движения и используется для сложных сцен, где элементы не должны «ждать» завершения друг друга.

Масштабирование временных сдвигов

При создании сложных сцен полезно вводить коэффициенты масштабирования времени:

  • ускорение всей сцены
  • замедление отдельных групп
  • адаптация под пользовательский ввод
const speed = 1.5;

new mojs.Html({
  el: '.block',
  x: { 0: 300 },
  duration: 1000 / speed,
  delay: 200 / speed
});

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

Синхронизация через общий стартовый маркер

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

const start = 500;

new mojs.Html({
  el: '.left',
  x: { 0: 100 },
  duration: 600,
  delay: start
});

new mojs.Html({
  el: '.right',
  x: { 0: -100 },
  duration: 600,
  delay: start
});

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

Временные зависимости и логическая структура

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

Выделяются типовые модели:

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

Каждая модель определяет способ расчёта delay и duration.

Каскады с нелинейным шагом

Линейный шаг не всегда подходит для выразительных эффектов. Часто применяется нелинейное распределение временных сдвигов:

const items = document.querySelectorAll('.dot');

items.forEach((el, i) => {
  const delay = Math.pow(i, 1.5) * 80;

  new mojs.Html({
    el,
    scale: { 0: 1 },
    duration: 500,
    delay
  });
});

В результате элементы появляются не равномерно, а с ускоряющимся интервалом, что создаёт ощущение физической инерции или волнового разгона.

Временные якоря и фиксация этапов

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

const t0 = 0;
const t1 = 300;
const t2 = 700;

new mojs.Html({
  el: '.stage1',
  opacity: { 0: 1 },
  duration: 300,
  delay: t0
});

new mojs.Html({
  el: '.stage2',
  opacity: { 0: 1 },
  duration: 300,
  delay: t1
});

new mojs.Html({
  el: '.stage3',
  opacity: { 0: 1 },
  duration: 300,
  delay: t2
});

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

Взаимное влияние длительности и сдвига

Delay и duration образуют взаимосвязанную систему. Изменение одного параметра часто требует пересчёта другого, особенно при плотных анимационных композициях.

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

Баланс достигается через соотношение:

  • delay ≈ 0.2–0.6 от duration для мягких переходов
  • delay < duration для перекрытий
  • delay > duration для строгих последовательностей

Сдвиг внутри групповых эффектов

Группы элементов могут иметь общий сдвиг, применяемый ко всем анимациям внутри блока:

const baseDelay = 400;

const group = [
  { el: '.g1', shift: 0 },
  { el: '.g2', shift: 100 },
  { el: '.g3', shift: 200 }
];

group.forEach(item => {
  new mojs.Html({
    el: item.el,
    y: { 50: 0 },
    duration: 500,
    delay: baseDelay + item.shift
  });
});

Здесь появляется двухуровневая модель времени: глобальный сдвиг и локальный внутри группы.

Динамический сдвиг через вычисляемые функции

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

new mojs.Html({
  el: '.dynamic',
  x: { 0: 200 },
  duration: el => 400 + el.index * 50,
  delay: el => el.index * 80
});

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

Временная декомпозиция сложных сцен

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

  • слой входа (entry)
  • основной слой движения (motion)
  • слой эффектов (effects)
  • слой завершения (exit)

Каждый слой имеет собственный диапазон delay и duration, что предотвращает хаотическое наложение событий.

Конфликты временных интервалов

При неправильной настройке сдвигов возникают конфликты:

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

Решение заключается в нормализации временной шкалы и введении ограничений на диапазоны delay и duration в рамках одного контекста исполнения.

Итоговая модель временного сдвига

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