В системах анимации на основе JavaScript часто требуется изменять параметры не в абсолютных координатах, а относительно текущего состояния объекта. Такой подход позволяет строить композиционные эффекты, где каждое новое движение накладывается на предыдущее, формируя динамическое поведение без постоянного пересчёта исходных значений.
В mo.js относительные значения применяются в числовых свойствах твинов и формируют основу для инкрементальной анимации. Вместо фиксированного числа задаётся выражение изменения, которое интерпретируется движком во время расчёта кадра.
Относительное значение задаётся строкой, содержащей оператор смещения:
"+=N" — увеличение текущего значения на N"-=N" — уменьшение текущего значения на NТакая запись применяется в свойствах, поддерживающих числовую интерполяцию: координаты, углы, масштаб, смещения.
const tween = new mojs.Tween({
duration: 1000,
onUpdate: function (progress) {
this.el.style.transform = `translateX(${this.props.x}px)`;
},
x: '+=150'
});
В данном случае значение x не фиксируется как 150, а
добавляется к текущему состоянию объекта.
При запуске анимации движок выполняет преобразование строкового выражения в числовое значение. Логика обработки включает следующие этапы:
Если текущее значение координаты равно 200, а задано
"+=50", итоговая целевая точка становится
250.
Относительные значения особенно полезны при работе с позиционированием объектов в сцене. Это позволяет строить последовательные перемещения без хранения промежуточного состояния вручную.
const move = new mojs.Tween({
duration: 800,
x: '+=100',
y: '-=40',
onUpdate: function () {
this.el.style.transform =
`translate(${this.props.x}px, ${this.props.y}px)`;
}
});
Такая запись формирует движение по диагонали, где каждое новое выполнение твина может наращивать смещение относительно текущей позиции.
При работе с трансформациями чаще всего используются параметры:
x, y — смещение по осямangle — поворотscale — масштабированиеОтносительное изменение масштаба:
const scaleTween = new mojs.Tween({
duration: 600,
scale: '+=0.5',
onUpdate: function () {
this.el.style.transform = `scale(${this.props.scale})`;
}
});
Значение scale увеличивается относительно текущего, что
позволяет создавать эффект «пульсации» или наращивания формы без сброса
базового состояния.
При последовательном запуске твинов относительные значения могут приводить к накопительному эффекту. Каждый новый запуск учитывает текущее состояние объекта, а не исходное значение.
const step = new mojs.Tween({
duration: 500,
x: '+=30'
});
// многократный запуск
step.play();
step.play();
step.play();
В результате объект будет смещаться на 30 единиц при каждом запуске, формируя пошаговую траекторию.
В рамках mojs.Timeline относительные значения позволяют
строить составные анимации, где каждый следующий твин продолжает
предыдущее состояние.
const t1 = new mojs.Tween({
duration: 400,
x: '+=50'
});
const t2 = new mojs.Tween({
duration: 400,
y: '+=50'
});
const timeline = new mojs.Timeline({}).add(t1, t2);
timeline.play();
Первый твин изменяет горизонтальную позицию, второй продолжает трансформацию, используя уже изменённое состояние объекта.
Использование относительных выражений требует учёта ряда особенностей:
+=
или -=Ошибочная интерпретация выражений приводит к отсутствию анимации или резким скачкам значений.
В одной анимации могут использоваться как абсолютные, так и относительные значения. Это позволяет комбинировать базовое позиционирование с динамическими изменениями.
const mix = new mojs.Tween({
duration: 700,
x: 300,
y: '+=80'
});
В этом случае горизонтальная координата фиксируется, а вертикальная изменяется относительно текущего положения.
При построении сложных анимационных композиций относительные значения используются для:
Композиция из нескольких объектов с относительными смещениями позволяет формировать поведение системы без жёсткой привязки к координатной сетке.
При повторном запуске анимации важно учитывать, что относительные значения применяются к текущему состоянию, а не к начальному. Поэтому сброс объекта в исходное положение должен выполняться явно.
el.style.transform = 'translate(0px, 0px)';
Без такого сброса каждое новое воспроизведение твина будет продолжать накопление смещения.
Использование относительных значений уменьшает количество вычислительной логики в коде и переносит управление изменениями в декларативную форму. Вместо пересчёта координат вручную задаётся направление изменения, что делает анимационные сценарии более компактными и предсказуемыми при локальных трансформациях.