Вся система анимаций строится вокруг конфигурационных объектов, которые описывают поведение движения: начальные и конечные значения, тип интерполяции, физическую модель, временные параметры и дополнительные ограничения. Вместо императивного управления кадрами используется декларативное описание параметров, которые движок преобразует в последовательность значений во времени.
Ключевая особенность архитектуры — единый подход к параметрам во всех
модулях: tween, spring, physics,
keyframes, value, styler.
Несмотря на различие моделей движения, структура входных данных остаётся
предсказуемой и типизированной.
Popmotion работает не только с числами. Поддерживаются несколько категорий значений, каждая из которых требует собственного подхода к интерполяции.
Наиболее простой тип данных:
animate({
from: 0,
to: 300
});
Числа используются для координат, углов, масштабов, прозрачности и любых непрерывных величин.
Поддерживаются CSS-значения:
animate({
from: "0px",
to: "100px"
});
Интерполяция происходит по числовой части с сохранением единиц.
Цвета интерполируются по каналам:
animate({
from: "rgba(255, 0, 0, 1)",
to: "rgba(0, 0, 255, 1)"
});
Поддерживаются форматы rgb, rgba,
hsl, hex.
Объекты и массивы интерполируются рекурсивно:
animate({
from: { x: 0, y: 0 },
to: { x: 100, y: 200 }
});
Каждое поле обрабатывается отдельно с собственной интерполяцией.
tween — параметрическая временная анимация, основанная
на интерполяции между двумя точками.
from — начальное значениеto — конечное значениеduration — длительность в миллисекундахease — функция сглаживанияflip — инверсия направленияloop — зацикливаниеyoyo — возврат в обратном направленииtween({
from: 0,
to: 1,
duration: 1000,
ease: easing.easeInOut
});
from и to должны быть совместимыми типами.
Несовместимость приводит к невозможности построения интерполятора.
Допустимые пары:
Spring-модель основана на имитации физического пружинного движения.
from — стартовая позицияto — целевая точкаstiffness — жёсткость пружиныdamping — демпфированиеmass — масса объектаvelocity — начальная скоростьrestSpeed — порог остановки по скоростиrestDelta — допустимая погрешность позицииspring({
from: 0,
to: 500,
stiffness: 120,
damping: 20,
mass: 1
});
Физическая модель требует числовых значений. Передача строк или структурных объектов невозможна без предварительной нормализации.
Physics-модель оперирует силами и скоростями, а не конечными точками.
from — начальное значениеvelocity — скоростьacceleration — ускорениеfriction — трениеrestSpeed — остановка при минимальной скоростиphysics({
from: 0,
velocity: 50,
friction: 0.8
});
Все параметры строго числовые. В отличие от tween,
отсутствует понятие конечной точки to.
Keyframes описывают дискретные состояния анимации.
values — массив значенийtimes — временные меткиduration — общая длительностьease — кривые сглаживанияkeyframes({
values: [0, 100, 50, 200],
times: [0, 0.3, 0.6, 1],
duration: 2000
});
Все элементы массива должны быть одного типа:
value — базовый контейнер состояния, который принимает
любые поддерживаемые типы.
initial — начальное значениеonUpdate — обработчик измененийtransform — функция преобразованияformat — формат выводаconst x = value(0, {
onUpdate: v => console.log(v)
});
Контейнер автоматически определяет тип при инициализации:
Сглаживание определяет характер изменения параметра во времени.
ease: easing.easeInOut
Easing-функции имеют сигнатуру:
(progress: number) => number
Ограничения:
Модуль transform объединяет функции преобразования значений.
interpolateclampblendpipeconst convert = transform.interpolate([0, 100], ["0px", "100px"]);
Интерполяция требует согласованности доменов:
Несоответствие длины массивов приводит к невозможности построения функции.
Библиотека предоставляет набор типов, описывающих конфигурации анимаций.
type TweenProps = {
from: number | string | object;
to: number | string | object;
duration?: number;
ease?: (v: number) => number;
};
type SpringProps = {
from: number;
to: number;
stiffness?: number;
damping?: number;
mass?: number;
};
type Animatable =
| number
| string
| Color
| { [key: string]: Animatable };
Система параметров предполагает строгую согласованность входных данных.
from или toPopmotion использует несколько моделей времени:
Используется в tween:
progress = elapsed / duration
Используется в spring и physics:
Используется в keyframes:
Разные анимационные модели могут использовать одни и те же типы значений, но интерпретировать их по-разному.
Тип данных остаётся одинаковым, различается только функция его изменения во времени.