Popmotion представляет собой JavaScript-библиотеку для создания анимаций и управления движением объектов через декларативные и функциональные примитивы. В её основе лежит идея представления анимации как потока значений во времени, а не как набора императивных изменений CSS или DOM.
Ключевая особенность Popmotion заключается в том, что она не ограничивается классической моделью tween-анимаций. Вместо этого она объединяет несколько подходов к движению:
Такой подход делает библиотеку не просто инструментом для визуальных эффектов, а универсальной системой описания движения.
В основе Popmotion лежит концепция actions — объектов, которые могут производить поток значений во времени. Любая анимация рассматривается как функция, генерирующая последовательность состояний.
Движение в Popmotion описывается не через изменение свойств напрямую, а через преобразование значений:
Каждое изменение состояния является результатом вычисления функции, зависящей от времени и параметров анимации.
Простейшая структура анимационного потока:
import { tween, styler } from 'popmotion';
const divStyler = styler(document.querySelector('div'));
tween({
from: 0,
to: 300,
duration: 1000
}).start(v => {
divStyler.set('x', v);
});
В этом примере tween создаёт поток значений от 0 до 300,
а styler применяет эти значения к DOM-элементу.
Action — базовая единица системы. Это абстракция, представляющая источник значений во времени.
Action может быть:
Каждый action имеет методы жизненного цикла: старт, обновление и завершение.
Tween представляет собой интерполяцию между двумя значениями за заданное время.
Функциональная модель tween:
from)to)duration)tween({
from: 0,
to: 1,
duration: 500
})
Tween используется для предсказуемых линейных или криволинейных переходов.
Popmotion поддерживает физически-основанные модели движения, где поведение определяется не временем, а законами динамики.
Основные типы:
Физическая модель задаёт не конечную точку, а параметры системы:
import { spring } from 'popmotion';
spring({
from: 0,
to: 300,
stiffness: 200,
damping: 20
}).start(v => {
console.log(v);
});
Такой подход позволяет создавать естественные, нелинейные движения без ручной настройки таймингов.
Popmotion опирается на идею композиции потоков данных. Actions можно комбинировать, преобразовывать и связывать.
Основные операции:
Потоки позволяют строить сложные сценарии движения из простых компонентов.
Одним из ключевых компонентов Popmotion является система отслеживания пользовательского ввода.
Pointer action преобразует события мыши или касания в поток координат.
import { pointer } from 'popmotion';
pointer().start(({ x, y }) => {
console.log(x, y);
});
Данные поступают как непрерывный поток значений, что позволяет напрямую связывать ввод с анимацией без промежуточных обработчиков событий.
Popmotion не привязан к конкретной UI-библиотеке. Он работает как слой логики движения, отделённый от рендеринга.
Рендеринг может выполняться через:
Пример использования styler:
import { styler } from 'popmotion';
const box = document.querySelector('.box');
const boxStyler = styler(box);
boxStyler.set({
x: 100,
opacity: 0.5
});
Styler абстрагирует способ применения значений к элементу, позволяя менять реализацию без изменения логики анимации.
Popmotion строится на функциональных принципах:
Анимация рассматривается как функция времени:
f(t) → value
где t — время, а value — состояние
объекта.
Такой подход делает поведение системы предсказуемым и легко комбинируемым.
Popmotion стал основой для более высокоуровневых решений, включая анимационные системы в React-библиотеках. Его принципы — потоки значений и физические модели — используются в построении декларативных анимационных API.
Особенно важна концепция отделения:
Эта архитектура позволяет использовать Popmotion как низкоуровневый слой для сложных интерфейсных систем.
В Popmotion используется несколько моделей времени:
Каждая модель определяет, как вычисляется следующее значение потока.
Система трансформаций позволяет изменять поток данных до его применения:
Пример интерполяции:
import { transform } from 'popmotion';
const scale = transform([0, 1], [0, 100]);
scale(0.5); // 50
Popmotion можно описать как комбинацию трёх уровней:
Так формируется универсальная модель движения, где анимация перестаёт быть отдельной сущностью и становится частью общей системы потоков данных.