Физическая модель пружины в анимациях основана на имитации реального движения объектов под действием силы упругости. В отличие от линейных или временных анимаций, где изменение значения строго привязано ко времени, пружинная модель описывает движение через физические параметры: массу, жесткость и демпфирование.
В библиотеке Motion One пружинные анимации позволяют создавать более естественные, «живые» переходы, особенно в интерфейсах, где важна тактильность и отзывчивость.
Движение пружины описывается дифференциальным уравнением второго порядка:
[ m x’’ + c x’ + k x = 0]
где:
Это уравнение отражает баланс сил:
Motion One предоставляет упрощённый интерфейс для работы с этой моделью, скрывая сложную математику за набором параметров.
Определяет, насколько сильно пружина «тянет» объект обратно.
animate(element, { x: 100 }, {
type: "spring",
stiffness: 300
});
Контролирует затухание колебаний.
animate(element, { x: 100 }, {
type: "spring",
damping: 10
});
Влияет на инерцию объекта.
animate(element, { x: 100 }, {
type: "spring",
mass: 2
});
animate(element, { x: 100 }, {
type: "spring",
stiffness: 200,
damping: 5
});
animate(element, { x: 100 }, {
type: "spring",
stiffness: 200,
damping: 20
});
animate(element, { x: 100 }, {
type: "spring",
stiffness: 200,
damping: 50
});
Motion One использует численное интегрирование для вычисления положения объекта на каждом кадре. Вместо фиксированной длительности анимации, система:
Анимация завершается, когда:
Для определения момента остановки используются дополнительные параметры:
Минимальная скорость, при которой движение считается завершённым.
animate(element, { x: 100 }, {
type: "spring",
restSpeed: 0.01
});
Минимальное расстояние до цели.
animate(element, { x: 100 }, {
type: "spring",
restDelta: 0.01
});
Пружина может учитывать начальную скорость, что важно при интерактивных сценариях.
animate(element, { x: 100 }, {
type: "spring",
velocity: 5
});
Это позволяет:
Пружинная модель особенно эффективна при:
После отпускания элемент «возвращается» с учетом скорости:
animate(element, { x: 0 }, {
type: "spring",
velocity: currentVelocity
});
Создание мягкой реакции интерфейса:
animate(button, { scale: 1.1 }, {
type: "spring",
stiffness: 400,
damping: 15
});
Плавные переходы между UI-состояниями:
animate(panel, { opacity: 1, y: 0 }, {
type: "spring",
stiffness: 150,
damping: 20
});
| Характеристика | Пружина | Временная анимация |
|---|---|---|
| Основа | Физика | Время |
| Контроль | Через параметры | Через duration/easing |
| Поведение | Нелинейное | Предсказуемое |
| Реализм | Высокий | Ограниченный |
Параметры взаимосвязаны:
Пример сбалансированной конфигурации:
animate(element, { x: 100 }, {
type: "spring",
stiffness: 250,
damping: 25,
mass: 1
});
Пружинная модель чувствительна к частоте обновления (обычно 60 FPS). Motion One компенсирует это, используя delta-time между кадрами, что обеспечивает стабильность анимации даже при просадках производительности.
Несколько элементов могут использовать одинаковые параметры, создавая согласованное движение:
items.forEach((item, i) => {
animate(item, { y: 0 }, {
delay: i * 0.05,
type: "spring"
});
});
Можно имитировать цепочки объектов, где один влияет на другой через общие параметры или состояние.
Параметры могут адаптироваться во время выполнения:
const stiffness = isActive ? 300 : 100;
animate(element, { scale: 1.2 }, {
type: "spring",
stiffness
});
const springConfig = {
type: "spring",
stiffness: 200,
damping: 20
};
animate(el1, { x: 100 }, springConfig);
animate(el2, { y: 50 }, springConfig);
Пружинная анимация в Motion One — это не просто эффект, а симуляция физического поведения, где: