Инерция в анимации — это имитация физического поведения объектов после завершения активного воздействия. В интерфейсах она проявляется как продолжение движения элемента после отпускания курсора или завершения жеста. Библиотека Motion One предоставляет инструменты для создания таких эффектов с использованием параметров скорости, трения и упругости.
Инерционное движение описывается тремя основными характеристиками:
В Motion One инерция реализуется через функцию animate с
использованием параметра type: "inertia".
Простейшая форма инерции:
import { animate } from "motion";
animate(element, { x: 500 }, {
type: "inertia",
velocity: 1000
});
Ключевые параметры:
velocity — определяет начальный импульсpower — влияет на дистанцию, которую пройдет
элементtimeConstant — регулирует скорость затуханияЗатухание движения моделируется экспоненциальной функцией. Чем выше
значение timeConstant, тем дольше сохраняется движение:
animate(element, { x: 500 }, {
type: "inertia",
velocity: 800,
timeConstant: 300
});
100–200) создают резкую остановку400+) дают эффект “скольжения”Часто требуется ограничить перемещение элемента. Motion One
поддерживает это через min и max:
animate(element, { x: 1000 }, {
type: "inertia",
velocity: 1200,
min: 0,
max: 800
});
При достижении границы возможны два сценария:
Для создания более реалистичной физики добавляется параметр
bounce:
animate(element, { x: 1000 }, {
type: "inertia",
velocity: 1500,
min: 0,
max: 800,
bounce: 0.5
});
0 — без отскока1 — максимальная упругостьДополнительно:
bounceStiffness — жесткость отскокаbounceDamping — затухание колебанийИнерция особенно важна при работе с drag-жестами. Motion One позволяет отслеживать скорость перемещения и использовать её для продолжения движения.
Пример с использованием Pointer Events:
let velocity = 0;
let lastX = 0;
let lastTime = 0;
element.addEventListener("pointermove", (event) => {
const now = performance.now();
const delta = event.clientX - lastX;
const time = now - lastTime;
velocity = delta / time * 1000;
lastX = event.clientX;
lastTime = now;
});
element.addEventListener("pointerup", () => {
animate(element, { x: "+=0" }, {
type: "inertia",
velocity
});
});
Здесь:
Хотя Motion One не использует напрямую понятие массы, её можно имитировать через комбинацию параметров:
timeConstantanimate(element, { x: 500 }, {
type: "inertia",
velocity: 1000,
timeConstant: 600
});
Часто инерция сочетается с пружиной при достижении границ:
animate(element, { x: 1000 }, {
type: "inertia",
velocity: 1200,
min: 0,
max: 800,
bounce: 0.6,
bounceStiffness: 300,
bounceDamping: 20
});
Так создаётся поведение:
Инерция активно применяется в интерфейсах свайпа:
element.addEventListener("pointerup", () => {
if (velocity > 500) {
animate(element, { x: 1000 }, {
type: "inertia",
velocity
});
} else {
animate(element, { x: 0 }, {
type: "spring"
});
}
});
Логика:
Инерция учитывает знак скорости:
animate(element, { x: 0 }, {
type: "inertia",
velocity: -800
});
Анимация может быть остановлена:
const controls = animate(element, { x: 500 }, {
type: "inertia",
velocity: 1000
});
controls.stop();
Это важно при повторных взаимодействиях, чтобы избежать накопления эффектов.
Сбалансированная инерция:
velocity: 500–1500timeConstant: 200–400Для мобильных интерфейсов:
Для desktop:
Инерция должна:
Чрезмерная инерция ухудшает UX, особенно в интерфейсах с точным позиционированием.
Инерцию можно применять не только к x и y,
но и к другим параметрам:
animate(element, { rotate: 360 }, {
type: "inertia",
velocity: 200
});
Однако визуально правдоподобной остаётся только трансляция и прокрутка.
Motion One использует экспоненциальное затухание:
Это даёт:
velocity → элемент “вылетает” за
пределыbounce → неестественная физикаИнерционный скроллинг:
animate(container, { scrollTop: 1000 }, {
type: "inertia",
velocity: 2000
});
Карусели:
Игровые интерфейсы:
Комбинация параметров формирует характер движения:
| Параметр | Эффект |
|---|---|
| velocity | начальный импульс |
| timeConstant | длительность движения |
| power | дальность |
| bounce | упругость |
| min/max | границы |
Грамотная настройка этих параметров позволяет создавать интерфейсы, максимально приближенные к физическому взаимодействию, что делает пользовательский опыт более естественным и интуитивным.