В анимациях движение редко заканчивается мгновенно. Реалистичность достигается за счёт имитации физических процессов: трения, сопротивления среды и инерции. В библиотеке Popmotion эти эффекты реализуются через специализированные функции, позволяющие моделировать постепенное замедление и «докатывание» объектов.
Затухание (decay) и инерция (inertia) — два взаимосвязанных механизма, описывающих движение объекта после прекращения внешнего воздействия.
Затухание моделирует ситуацию, при которой объект продолжает движение с уменьшающейся скоростью под действием трения. Это типично для прокрутки, свайпов и жестов.
В Popmotion используется функция decay, которая
рассчитывает положение объекта на основе начальной скорости и
коэффициента замедления.
import { decay } from "popmotion";
decay({
velocity: 300, // начальная скорость
from: 0 // начальная позиция
}).start(v => {
console.log(v);
});
Алгоритм основан на экспоненциальном убывании скорости:
Изменяя параметры, можно добиться разных эффектов:
decay({
velocity: 500,
power: 0.6,
timeConstant: 200
}).start(v => {
console.log(v);
});
power — более длинное движениеtimeConstant — быстреее затуханиеЧасто требуется ограничить движение диапазоном значений. В этом
случае используются параметры min и max.
decay({
velocity: 400,
from: 0,
min: 0,
max: 300
}).start(v => {
console.log(v);
});
Если значение выходит за границы, Popmotion может автоматически применить эффект «отскока».
Для создания эффекта упругости используются параметры:
decay({
velocity: 600,
from: 100,
min: 0,
max: 300,
bounceStiffness: 200,
bounceDamping: 20
}).start(v => {
console.log(v);
});
Это создаёт ощущение физического взаимодействия с границами.
Инерция — более высокоуровневая абстракция, объединяющая:
В Popmotion инерция реализована через функцию inertia,
которая автоматически выбирает подходящую модель движения.
import { inertia } from "popmotion";
inertia({
velocity: 300,
from: 0,
min: 0,
max: 500
}).start(v => {
console.log(v);
});
Функция inertia:
| Характеристика | decay | inertia |
|---|---|---|
| Уровень | Низкоуровневый | Высокоуровневый |
| Контроль | Полный | Частично автоматический |
| Ограничения | Опционально | Встроены |
| Отскок | Настраивается | Встроен |
Затухание и инерция активно применяются в обработке жестов:
Пример интеграции с drag:
import { listen, inertia } from "popmotion";
let velocity = 0;
listen(document, "pointermove").start(e => {
velocity = e.movementX;
});
listen(document, "pointerup").start(() => {
inertia({
velocity,
from: 0
}).start(v => {
console.log(v);
});
});
Popmotion позволяет комбинировать затухание с другими типами анимаций:
spring — для возврата в исходное положениеtween — для управляемых переходовkeyframes — для сложных последовательностейПример:
import { decay, spring } from "popmotion";
decay({
velocity: 500,
from: 0,
min: 0,
max: 300
}).start({
update: v => console.log(v),
complete: () => {
spring({
from: 300,
to: 0
}).start(v => console.log(v));
}
});
velocity усиливает эффектpower влияет на дальностьdecay + spring создаёт физически
правдоподобное поведениеupdatestart,
stop, updateКаждое движение — это непрерывное вычисление значений, основанное на времени и параметрах физической модели.
decay({
velocity: 300,
restDelta: 0.5
}).start(v => {
console.log(v);
});
Позволяет контролировать точность завершения анимации.
Хотя Popmotion не требует ручного контроля времени, параметры позволяют косвенно влиять на длительность:
timeConstantpowerimport { decay, transform } from "popmotion";
const map = transform({
from: [0, 300],
to: [0, 1]
});
decay({
velocity: 400
}).start(v => {
console.log(map(v));
});
Позволяет преобразовывать значения в другие диапазоны.
Затухание и инерция делают интерфейс:
Неправильная настройка приводит к:
Корректная настройка параметров позволяет добиться ощущения «живого» интерфейса, где каждое движение подчиняется логике реального мира.