Пружинная физика в анимациях моделирует поведение реальных упругих систем, основанных на законе Гука. В библиотеке Popmotion она используется для создания естественных, плавных и «живых» переходов между значениями. В отличие от линейных или временных анимаций, пружинные движения зависят не только от времени, но и от физических параметров: массы, жесткости и демпфирования.
Ключевая идея — имитация силы, которая стремится вернуть объект к равновесию, с возможными колебаниями вокруг целевого значения.
В основе лежит дифференциальное уравнение второго порядка:
F = -k * xF_d = -c * vГде:
k — коэффициент жесткости (stiffness)x — отклонение от равновесияc — коэффициент демпфирования (damping)v — скоростьm — масса объектаПолная формула движения:
m * a = -k * x - c * v
Popmotion решает это уравнение численно, обновляя состояние на каждом кадре.
Определяет, насколько сильно пружина стремится вернуть объект к цели.
spring({ from: 0, to: 100, stiffness: 200 })
Контролирует затухание колебаний.
spring({ from: 0, to: 100, damping: 10 })
Влияет на инерцию системы.
spring({ from: 0, to: 100, mass: 2 })
import { spring } from "popmotion";
spring({
from: 0,
to: 300
}).start(v => {
console.log(v);
});
Анимация автоматически рассчитывает промежуточные значения и завершает работу, когда система стабилизируется.
Система возвращается к цели максимально быстро без колебаний.
spring({
from: 0,
to: 100,
stiffness: 100,
damping: 20
});
spring({
from: 0,
to: 100,
stiffness: 150,
damping: 5
});
Результат — эффект “перелета” и возврата.
spring({
from: 0,
to: 100,
stiffness: 50,
damping: 50
});
Движение медленное и без колебаний.
Пружина может стартовать с заданной скоростью:
spring({
from: 0,
to: 100,
velocity: 200
});
Это важно при работе с жестами (drag, swipe), когда объект уже движется в момент начала анимации.
Popmotion завершает анимацию, когда движение становится незаметным.
restSpeed — минимальная скоростьrestDelta — минимальное расстояние до целиspring({
from: 0,
to: 100,
restSpeed: 0.01,
restDelta: 0.01
});
Это предотвращает бесконечные микроколебания.
Пружины работают не только с числами, но и с массивами или объектами:
spring({
from: { x: 0, y: 0 },
to: { x: 100, y: 200 }
}).start(v => {
console.log(v.x, v.y);
});
Каждое значение анимируется независимо, но с общей физической моделью.
import { styler } from "popmotion";
const div = document.querySelector("div");
const divStyler = styler(div);
spring({
from: 0,
to: 300
}).start(v => {
divStyler.set("x", v);
});
Использование styler обеспечивает эффективное обновление
свойств.
Пружины часто применяются после взаимодействий:
import { listen, pointer, spring } from "popmotion";
listen(document, "mousedown").start(() => {
pointer().start(pos => {
// перемещение элемента
});
});
После отпускания:
spring({
from: currentPosition,
to: 0,
velocity: currentVelocity
});
Так достигается естественное «возвращение» элемента.
| Свойство | spring | tween |
|---|---|---|
| Основа | физика | время |
| Контроль | параметры системы | duration, easing |
| Поведение | динамическое | предсказуемое |
| Реализм | высокий | средний |
Пружины лучше подходят для UI, где важна отзывчивость и натуральность.
import { chain, spring, tween } from "popmotion";
chain(
tween({ to: 100, duration: 300 }),
spring({ to: 0 })
).start(console.log);
import { parallel, spring } from "popmotion";
parallel(
spring({ from: 0, to: 100 }),
spring({ from: 50, to: 200 })
).start(console.log);
import { clamp } from "popmotion";
spring({
from: 0,
to: 500
})
.pipe(clamp(0, 300))
.start(console.log);
Позволяет ограничить диапазон движения.
Пружинные анимации в Popmotion оптимизированы:
requestAnimationFrameРекомендуется:
stylerspring({
from: draggedX,
to: 0,
velocity: dragVelocity
});
spring({
from: 1,
to: 1.2,
stiffness: 300,
damping: 10
});
spring({
from: 0,
to: 1,
stiffness: 120,
damping: 15
});
Небольшие изменения параметров радикально меняют восприятие:
stiffness делает интерфейс «резким»damping добавляет игривостьmass создаёт ощущение тяжестиЭти параметры позволяют передавать «характер» интерфейса.
Popmotion использует пошаговую интеграцию:
Это происходит на каждом кадре (~60 раз в секунду), что создаёт плавную анимацию.
Тем не менее, для UI-задач модель оптимальна по балансу производительности и реализма.
stiffness: 100–300,
damping: 10–30damping < 10mass > 1.5stiffness, снижать
massВ отличие от tween, пружины не используют
easing-функции. Их поведение формируется исключительно физическими
параметрами. Это делает анимацию менее предсказуемой, но более
естественной.
Для анализа поведения удобно:
const animation = spring({ from: 0, to: 100 }).start(v => {
console.log(v);
});
// остановка
animation.stop();
animation.stop();
spring({ from: current, to: newTarget }).start();
Пружинная физика в Popmotion — это инструмент для создания динамичных, адаптивных анимаций, реагирующих на контекст и взаимодействие. Управление через физические параметры позволяет добиваться высокой выразительности интерфейса без сложных математических вычислений вручную.