Popmotion представляет собой функциональную анимационную библиотеку, построенную вокруг независимых “примитивов движения”. Основная идея заключается в том, что анимации описываются как функции преобразования значений во времени.
Подключение выполняется через ES-модули:
import { animate, spring, keyframes, decay, physics } from 'popmotion';
Каждый экспорт отвечает за отдельный тип движения. Архитектура не привязана к DOM и может использоваться в любых JS-окружениях.
Любая анимация в Popmotion сводится к преобразованию значения от начального состояния к конечному с течением времени. Управление происходит через конфигурационные объекты, которые описывают поведение движения.
Основная функция animate является универсальным
инструментом:
animate({
from: 0,
to: 100,
duration: 1000,
onUpdate: (latest) => {
console.log(latest);
}
});
Внутренняя модель работы построена на:
from)to)Каждый тик анимации передаёт актуальное значение в
onUpdate.
Функция animate поддерживает расширенную
конфигурацию:
animate({
from: 0,
to: 300,
duration: 800,
ease: (t) => t * t,
onUpdate: (v) => {
element.style.transform = `translateX(${v}px)`;
},
onComplete: () => {
console.log('done');
}
});
Ключевые параметры:
from — начальное значениеto — конечное значениеduration — длительность в миллисекундахease — функция сглаживанияonUpdate — обработка промежуточных значенийonComplete — завершение анимацииРанние версии Popmotion использовали tween, который
описывал линейные или eased переходы.
import { tween } from 'popmotion';
tween({
from: 0,
to: 1,
duration: 500
}).start(v => {
console.log(v);
});
Характерной особенностью является цепочка .start(),
запускающая поток значений.
Spring-модель основана на физике упругости. Движение задаётся параметрами жесткости и демпфирования.
spring({
from: 0,
to: 200,
stiffness: 100,
damping: 10
}).start(v => {
console.log(v);
});
Физическая модель обеспечивает:
Синтаксис spring не требует явного времени, поскольку движение определяется параметрами системы.
Keyframes позволяют описывать последовательность состояний, аналогично CSS-анимациям.
keyframes({
values: [0, 100, 50, 200],
duration: 1200
}).start(v => {
console.log(v);
});
Каждое значение интерполируется по времени, формируя ступенчатую траекторию движения.
Decay моделирует затухающее движение на основе начальной скорости.
decay({
from: 0,
velocity: 300,
deceleration: 0.95
}).start(v => {
console.log(v);
});
Поведение:
Physics позволяет комбинировать силы, создавая более сложные движения.
physics({
from: { x: 0, y: 0 },
velocity: { x: 100, y: -50 },
friction: 0.8
}).start(v => {
console.log(v);
});
Используется для симуляции:
Для взаимодействия с DOM используется styler, который
связывает числовые значения с CSS-свойствами.
import { styler, animate } from 'popmotion';
const box = document.querySelector('.box');
const boxStyler = styler(box);
animate({
from: 0,
to: 300,
onUpdate: (v) => {
boxStyler.set({
x: v
});
}
});
Styler абстрагирует работу с transform и стилями, преобразуя числовые значения в корректные CSS-операции.
Popmotion включает инструменты для обработки потоков значений перед их применением.
Основной механизм — композиция функций:
import { pipe, clamp } from 'popmotion';
const process = pipe(
clamp(0, 100)
);
Такой подход позволяет строить цепочки преобразований:
Интерполяция используется для преобразования одного диапазона в другой.
const mapRange = (minA, maxA, minB, maxB) => (v) =>
((v - minA) / (maxA - minA)) * (maxB - minB) + minB;
Popmotion использует подобные принципы внутри своих анимационных функций для расчёта промежуточных значений.
Ранее Popmotion предоставлял value как реактивный
контейнер состояния.
import { value } from 'popmotion';
const x = value(0, (latest) => {
console.log(latest);
});
x.update(50);
Объект value позволял:
Каждая анимация возвращает контроллер, позволяющий управлять процессом выполнения.
const controls = animate({
from: 0,
to: 100,
onUpdate: console.log
});
controls.stop();
Поддерживаются операции:
Popmotion ориентирован на композицию. Различные типы движений могут комбинироваться для создания сложных эффектов.
animate({
from: 0,
to: 1,
onUpdate: (v) => {
const springX = spring({
from: v,
to: 100
});
springX.start(console.log);
}
});
Композиционный подход позволяет строить:
Синтаксис Popmotion характеризуется следующими принципами:
Каждая анимация является изолированной единицей поведения, не зависящей от внешнего состояния, если это явно не задано через коллбеки или стилизацию.