В mo.js анимация строится вокруг объектов tween и timeline, где движение задаётся через набор параметров, изменяющихся во времени. Множественные ключевые точки позволяют описывать не линейную интерполяцию «из A в B», а сложные траектории состояния объекта, включающие промежуточные состояния, резкие переходы, нелинейные кривые и комбинированные трансформации.
Ключевая точка (key point) в контексте mo.js представляет собой состояние набора свойств объекта в определённый момент времени. При наличии нескольких точек библиотека автоматически вычисляет промежуточные значения через интерполяцию, формируя непрерывное или сегментированное изменение параметров.
В mo.js ключевые точки задаются массивом объектов. Каждый объект описывает состояние свойств и момент времени, к которому это состояние относится.
const tween = new mojs.Tween({
duration: 2000,
repeat: 0,
onUpdate(progress) {
console.log(progress);
},
keyframes: [
{ x: 0, opacity: 0 },
{ x: 200, opacity: 1 },
{ x: 100, opacity: 0.5 }
]
});
Каждый элемент массива:
Если временные метки не указаны явно, распределение происходит равномерно по длительности tween.
Для точного контроля используется параметр offset,
задающий позицию ключевой точки в пределах общей длительности.
const tween = new mojs.Tween({
duration: 3000,
keyframes: [
{ x: 0, opacity: 0, offset: 0 },
{ x: 300, opacity: 1, offset: 0.3 },
{ x: 150, opacity: 0.2, offset: 1 }
]
});
offset: 0 соответствует началу анимацииoffset: 1 соответствует завершениюПри отсутствии offset mo.js распределяет ключевые точки по индексу массива.
Между ключевыми точками происходит интерполяция значений свойств. Тип интерполяции зависит от характера данных:
keyframes: [
{ x: 0, scale: 1 },
{ x: 100, scale: 2 },
{ x: 200, scale: 1 }
]
Здесь движение scale формирует «волнообразную» кривую:
увеличение и возврат к исходному значению.
Каждая ключевая точка может задавать собственную функцию сглаживания, влияющую на участок перехода к следующему состоянию.
keyframes: [
{ x: 0, easing: 'linear' },
{ x: 200, easing: 'cubic.out' },
{ x: 100, easing: 'elastic.out' }
]
Такой подход позволяет создавать сложные motion-паттерны без разбиения на отдельные tween-объекты.
Каждая точка может содержать произвольное количество анимируемых параметров.
keyframes: [
{ x: 0, y: 0, scale: 1, opacity: 0 },
{ x: 150, y: -50, scale: 1.5, opacity: 1 },
{ x: 300, y: 0, scale: 1, opacity: 0.3 }
]
При использовании offset можно создавать асимметричные анимации, где разные свойства «живут» по разным временным схемам.
keyframes: [
{ x: 0, opacity: 0, offset: 0 },
{ x: 200, offset: 0.5 },
{ opacity: 1, offset: 0.2 },
{ x: 100, opacity: 0.5, offset: 1 }
]
Такой подход позволяет создавать эффект «развязанных» анимаций, где визуальные параметры изменяются независимо.
mo.js поддерживает интерполяцию цветов в формате HEX, RGB и RGBA.
keyframes: [
{ background: '#ff0000' },
{ background: '#00ff00' },
{ background: '#0000ff' }
]
stepВ shape-модулях mo.js ключевые точки часто применяются для трансформации геометрии и параметров фигуры.
const shape = new mojs.Shape({
shape: 'circle',
radius: { 0: 80 },
stroke: 'white',
strokeWidth: { 2: 10 },
duration: 1500,
keyframes: [
{ scale: 1, strokeWidth: 2 },
{ scale: 1.5, strokeWidth: 8 },
{ scale: 1, strokeWidth: 2 }
]
});
Timeline в mo.js позволяет синхронизировать несколько анимаций, каждая из которых может иметь собственные keyframes.
const timeline = new mojs.Timeline();
const tween1 = new mojs.Tween({
duration: 2000,
keyframes: [
{ x: 0 },
{ x: 300 }
]
});
const tween2 = new mojs.Tween({
duration: 2000,
keyframes: [
{ opacity: 0 },
{ opacity: 1 },
{ opacity: 0 }
]
});
timeline.add(tween1, tween2);
timeline.play();
При большом количестве keyframes важно учитывать влияние на производительность интерполяции.
Множественные keyframes часто используются для создания циклических движений.
keyframes: [
{ y: 0 },
{ y: -50 },
{ y: 0 }
]
Такой паттерн формирует базу для:
При добавлении easing кривые приобретают естественную динамику без необходимости увеличения числа точек.
Некорректная структура keyframes приводит к непредсказуемым результатам интерполяции.