Interact.js предоставляет мощные инструменты для реализации
интерактивного поведения элементов на веб-странице, включая
инерцию при перемещении и изменении размеров. Инерция
позволяет элементам продолжать движение после завершения жеста
пользователя, создавая ощущение естественной физики. В библиотеке этот
функционал реализован через объект inertia, который
настраивается при вызове метода draggable().
interact('.draggable')
.draggable({
inertia: true,
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
],
listeners: {
move (event) {
event.target.style.transform =
`translate(${event.pageX}px, ${event.pageY}px)`;
}
}
});
Ключевые параметры инерции:
inertia: {
resistance: 10,
minSpeed: 100,
endSpeed: 50
}
Для достижения максимально естественного поведения важно использовать
плавные анимации с учетом времени кадра. Interact.js
предоставляет объект события event, содержащий параметры
dx, dy и dt, которые позволяют
вычислять смещение относительно времени, что критично для корректного
применения инерции.
moveListener = function (event) {
const target = event.target;
const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
};
interact('.draggable').draggable({
inertia: {
resistance: 15,
minSpeed: 50,
endSpeed: 10
},
listeners: { move: moveListener }
});
Советы для плавности:
top/left для аппаратного ускорения.data- атрибутах, чтобы не
накапливать погрешности смещения.resistance и endSpeed
индивидуально под тип элемента и UX.Iнерция особенно эффектно выглядит вместе с ограничениями
(modifiers). Interact.js позволяет ограничивать движение
элементa по сетке, внутри родительского
контейнера или по произвольным областям. Важно учитывать, что
инерция корректно взаимодействует с ограничениями только при
использовании endOnly: true.
modifiers: [
interact.modifiers.snap({
targets: [
interact.createSnapGrid({ x: 50, y: 50 })
],
range: Infinity,
relativePoints: [{ x: 0, y: 0 }]
}),
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
]
Здесь элемент после отпускания будет «притягиваться» к сетке и при этом двигаться с инерцией, но при этом не выйдет за границы родителя.
Interact.js поддерживает инерцию не только для drag, но и для resize и gesturable действий. Для изменения размеров или вращения можно задать отдельные параметры инерции:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
inertia: {
resistance: 20,
minSpeed: 100,
endSpeed: 20
},
listeners: {
move (event) {
const target = event.target;
let x = parseFloat(target.getAttribute('data-x')) || 0;
let y = parseFloat(target.getAttribute('data-y')) || 0;
target.style.width = `${event.rect.width}px`;
target.style.height = `${event.rect.height}px`;
x += event.deltaRect.left;
y += event.deltaRect.top;
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
}
}
});
Особенности для resizable и gesturable:
deltaRect позволяет корректно вычислять смещение и
размер элемента при инерции.resistance и endSpeed можно
делать более жесткими для резких объектов или мягкими для плавного
увеличения.gesturable и
инерцию на поворот и масштабирование.move через
requestAnimationFrame или
interact.autoScroll при сложных интерфейсах.data-x,
data-y, чтобы не вычислять позицию через
getBoundingClientRect() каждый кадр.Можно комбинировать инерцию для перемещения, изменения размеров и вращения одновременно. В таком случае каждый listener должен учитывать текущие координаты и параметры трансформации, чтобы движение оставалось плавным и синхронизированным.
interact('.interactive')
.draggable({ inertia: true, listeners: { move: moveListener } })
.resizable({ inertia: true, listeners: { move: resizeListener } })
.gesturable({ inertia: true, listeners: { move: gestureListener } });
Каждое действие вносит свой вклад в итоговую трансформацию, поэтому важно объединять смещения и трансформации аккуратно, чтобы избежать резких скачков при инерции.
Эти подходы обеспечивают реалистичное и плавное поведение элементов, создавая ощущение физики и контроля. Настройка инерции и плавности в Interact.js позволяет строить интерфейсы, где взаимодействие с элементами ощущается естественно, предсказуемо и комфортно для пользователя.