Spring-анимации в Motion One реализуют физически-ориентированную модель движения, в которой переход значения определяется не фиксированной временной кривой, а поведением упругой системы. Вместо привычных easing-функций используется приближение к целевому состоянию через дифференциальное уравнение демпфированного осциллятора. Такой подход позволяет получать естественные движения с инерцией, переразгоном и плавным затуханием.
Spring-модель базируется на классическом уравнении:
Поведение описывается параметрами:
Упрощённая интерпретация:
Spring задаётся как easing-функция внутри параметров анимации:
import { animate, spring } from "motion";
animate(
".box",
{ x: 300 },
{
easing: spring({
stiffness: 120,
damping: 20,
mass: 1
})
}
);
Каждый параметр влияет на динамику:
Определяет скорость притяжения к цели.
Определяет затухание колебаний.
Влияет на инерцию.
Spring-движение делится на несколько режимов:
Характеризуется постоянными колебаниями без стабилизации. В UI используется редко.
Создаёт выраженный overshoot и эффект “пружины”. Часто используется для интерактивных интерфейсов.
Система достигает цели максимально быстро без колебаний. Оптимально для UI-переходов.
Медленное достижение цели без возвратных движений. Используется для тяжёлых, “плавных” эффектов.
Параметр velocity позволяет учитывать текущее движение элемента:
animate(
".box",
{ x: 500 },
{
easing: spring({
stiffness: 200,
damping: 25,
velocity: 800
})
}
);
Скорость усиливает реализм при:
Spring-модель особенно эффективно проявляется в событиях пользовательского ввода.
import { draggable, animate, spring } from "motion";
draggable(".card", {
onDragEnd(info) {
animate(
".card",
{ x: 0, y: 0 },
{
easing: spring({
stiffness: 180,
damping: 22,
velocity: info.velocity.x
})
}
);
}
});
Система возвращает элемент в исходное положение с сохранением импульса.
animate(
".button",
{ scale: 1.05 },
{
easing: spring({
stiffness: 300,
damping: 15
})
}
);
Spring обеспечивает “живую” реакцию без линейного увеличения.
Spring применяется не только к простым числам, но и к комплексным transform-значениям:
animate(
".box",
{
x: 200,
rotate: 45,
scale: 1.2
},
{
easing: spring({
stiffness: 150,
damping: 18
})
}
);
Каждое свойство интерполируется независимо, но синхронизировано по времени системы.
Традиционные easing-функции:
Spring-анимации:
Различие проявляется в поведении:
Поведение spring-системы регулируется комбинацией параметров:
При анимации нескольких свойств одновременно система рассчитывает каждую компоненту отдельно, но синхронизирует их по фазе движения:
animate(
".panel",
{
x: 400,
opacity: 1,
scale: 1
},
{
easing: spring({
stiffness: 140,
damping: 20
})
}
);
Это предотвращает рассинхронизацию трансформаций.
Spring-система сохраняет физическое состояние при остановке анимации:
const controls = animate(".box", {
x: 300
}, {
easing: spring({ stiffness: 120, damping: 18 })
});
controls.stop();
animate(".box", {
x: 600
}, {
easing: spring({ stiffness: 120, damping: 18 })
});
Spring не требует заранее рассчитанных keyframes, что снижает нагрузку в ряде сценариев:
Оптимизация достигается за счёт:
Система завершает анимацию при достижении двух условий:
Это предотвращает бесконечные микроколебания.
Spring может быть встроен в последовательности анимаций:
import { timeline, spring } from "motion";
timeline([
[".box", { x: 200 }, { easing: spring({ stiffness: 150, damping: 20 }) }],
[".box", { y: 100 }, { easing: spring({ stiffness: 120, damping: 18 }) }]
]);
Каждый шаг может иметь собственную физическую модель, создавая сложные траектории движения.
Визуальное поведение spring определяется сочетанием факторов:
Такая динамика приближена к физическим объектам и снижает ощущение “цифровой” анимации в интерфейсах.