Interact.js предоставляет мощный набор инструментов для управления
событиями, связанными с интерактивными элементами на странице, такими
как перетаскивание, масштабирование и вращение. Центральным элементом
является метод .on(), который позволяет подписываться на
события и обрабатывать их в реальном времени.
Синтаксис метода .on():
interact(target)
.draggable({
listeners: {
start (event) { ... },
move (event) { ... },
end (event) { ... }
}
})
.on('dragmove', function (event) { ... });
target — CSS-селектор, DOM-элемент или NodeList.'dragmove' — название события. Interact.js поддерживает
множество событий: dragstart, dragmove,
dragend, resizemove, gesturemove
и другие.event.target) и дополнительные
данные..off()
для снятия обработчиковМетод .off() используется для удаления ранее назначенных
обработчиков. Его использование предотвращает утечки памяти и позволяет
динамически управлять поведением интерактивных элементов.
interact(target).off('dragmove', dragMoveHandler);
.on(), поддерживая все
стандартные события Interact.js.Interact.js позволяет подписываться сразу на несколько событий через запятую:
interact(target)
.on('dragstart dragmove dragend', function (event) {
console.log(event.type, event.target);
});
Это особенно полезно для элементов, где требуется единая логика обработки разных этапов взаимодействия.
Drag Events включают три ключевых момента:
dragstart, dragmove, dragend.
dragstart вызывается при начале перетаскивания. Обычно
используется для инициализации переменных или изменения стиля
элемента.dragmove срабатывает на каждом изменении позиции
элемента. В объекте события доступны dx и dy —
смещения по осям X и Y.dragend вызывается после завершения перетаскивания.
Часто используется для сохранения финальных координат элемента.Пример обновления позиции элемента:
interact('.draggable')
.draggable({
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);
}
}
});
События изменения размера управляются через resizemove и
resizeend. Ключевой особенностью является предоставление
размеров элемента и смещений, что позволяет динамически подстраивать
стиль или границы контейнеров.
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
listeners: {
move (event) {
let { x, y } = event.target.dataset;
x = (parseFloat(x) || 0) + event.deltaRect.left;
y = (parseFloat(y) || 0) + event.deltaRect.top;
Object.assign(event.target.style, {
width: `${event.rect.width}px`,
height: `${event.rect.height}px`,
transform: `translate(${x}px, ${y}px)`
});
event.target.dataset.x = x;
event.target.dataset.y = y;
}
}
});
Interact.js поддерживает мульти-пальцевые жесты: масштабирование
(gesturemove) и вращение (rotate). Объект
события содержит свойства scale, rotation и
distance, что позволяет точно управлять поведением
элементов.
interact('.gesture')
.gesturable({
listeners: {
move (event) {
const target = event.target;
const currentScale = parseFloat(target.getAttribute('data-scale')) || 1;
const scale = currentScale * event.scale;
target.style.transform = `scale(${scale}) rotate(${event.rotation}deg)`;
target.setAttribute('data-scale', scale);
}
}
});
Interact.js позволяет контролировать низкоуровневые события через
методы on('pointerdown'), on('pointermove'),
on('pointerup'). Эти события полезны при создании кастомных
взаимодействий или для комбинации нескольких типов действий (например,
перетаскивание с жестами).
interact(target)
.on('pointerdown', event => { console.log('Pointer down', event); })
.on('pointermove', event => { console.log('Pointer move', event); })
.on('pointerup', event => { console.log('Pointer up', event); });
Interact.js поддерживает делегирование через селекторы. Это позволяет назначать обработчики на родительский элемент, автоматически управляя событиями для дочерних элементов.
interact('#container')
.on('dragmove', '.draggable', event => {
console.log('Dragged child element', event.target);
});
.draggable внутри контейнера
#container.event.stopPropagation(), предотвращая всплытие к
родительским элементам.event.preventDefault() используется для
предотвращения стандартного поведения браузера (например, выделение
текста при перетаскивании).interact(target).unset() — снимает все обработчики и
отменяет интерактивность для элемента.draggable, resizable,
gesturable) на одном элементе без конфликтов.