Interact.js предоставляет гибкий механизм управления взаимодействием элементов с пользователем, включая перетаскивание, масштабирование и вращение. Одной из ключевых особенностей библиотеки является возможность имитировать физические свойства объектов, такие как сопротивление движению. Это позволяет создавать более естественные, плавные и реалистичные интерфейсы.
Сопротивление (resistance) применяется для замедления или ограничения движения объектов, создавая ощущение инерции или трения. В Interact.js оно реализуется через события движения и настройки ограничений (modifiers).
Ключевые моменты:
Interact.js поддерживает встроенные модификаторы, такие как
restrict и snap, которые можно настроить для
реализации сопротивления. Пример конфигурации перетаскивания с
сопротивлением:
interact('.draggable')
.draggable({
inertia: true,
modifiers: [
interact.modifiers.restrict({
restriction: 'parent',
endOnly: true
}),
{
// Кастомный модификатор сопротивления
set: function (arg) {
const resistanceFactor = 0.2;
arg.page.x += (arg.delta.x * resistanceFactor);
arg.page.y += (arg.delta.y * resistanceFactor);
return arg;
}
}
],
listeners: {
move(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);
}
}
});
Разбор примера:
inertia: true — включает инерцию, позволяя объекту
продолжать движение после отпускания мыши.restrict ограничивает движение объекта
рамками родителя.set реализует сопротивление,
уменьшая фактическое смещение (delta) на заданный
коэффициент (resistanceFactor).Для более реалистичного поведения можно применять экспоненциальное или синусоидальное сопротивление. Пример нелинейного сопротивления:
{
set: function (arg) {
const factor = 0.5;
arg.page.x += arg.delta.x * (1 - Math.exp(-Math.abs(arg.delta.x) * factor));
arg.page.y += arg.delta.y * (1 - Math.exp(-Math.abs(arg.delta.y) * factor));
return arg;
}
}
Такое сопротивление обеспечивает мягкое замедление при начале движения и резкое при приближении к пределу, создавая эффект пружины или вязкого трения.
Сопротивление можно применять не только к перетаскиванию, но и к жестам изменения размера:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
{
set: function (arg) {
const resistance = 0.3;
arg.rect.width += arg.delta.width * resistance;
arg.rect.height += arg.delta.height * resistance;
return arg;
}
}
],
listeners: {
move(event) {
const target = event.target;
target.style.width = `${event.rect.width}px`;
target.style.height = `${event.rect.height}px`;
}
}
});
Особенности применения:
arg.delta.width и arg.delta.height
уменьшаются на коэффициент сопротивления.Сопротивление тесно связано с настройками инерции
(inertia) в Interact.js. Параметры инерции:
resistance — коэффициент сопротивления движению.minSpeed — минимальная скорость, при которой объект
продолжает движение.endSpeed — скорость, при которой движение полностью
останавливается.Пример использования:
interact('.draggable')
.draggable({
inertia: {
resistance: 15, // сопротивление движению
minSpeed: 100, // минимальная скорость для инерции
endSpeed: 10 // скорость остановки
}
});
Такое сочетание позволяет добиться плавного затухания движения, похожего на физическое трение.
resistance инерции.Сопротивление в Interact.js — это мощный инструмент для создания интерфейсов с ощущением реальной физики, плавных анимаций и естественных взаимодействий. Правильная настройка коэффициентов и модификаторов позволяет контролировать реакцию элементов на действия пользователя, создавая интуитивно понятное поведение.