Interact.js предоставляет мощный и гибкий механизм для работы с указателями — мышью, сенсорными экранами и стилусами. Обработка указателей в библиотеке строится вокруг событий взаимодействия и контекста перетаскивания, которые позволяют управлять элементами на странице с высокой точностью.
Для начала работы с элементом используется метод
interact(), который возвращает объект
Interactable, на котором можно настроить события:
interact('.draggable')
.draggable({
inertia: true,
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
],
autoScroll: true,
listeners: {
move: dragMoveListener,
end: dragEndListener
}
});
Ключевые моменты:
inertia — добавляет эффект инерции
после отпуска элемента.modifiers — позволяют ограничивать
область перемещения, изменять размер и применять трансформации.listeners — объект с функциями,
обрабатывающими события start, move и
end.Interact.js разделяет события на несколько типов:
pointerdown — срабатывает при нажатии
на элемент.pointermove — отслеживает движение
указателя.pointerup — фиксирует отпускание
указателя.tap и doubletap — для
обработки кликов и двойных кликов на элементах.Использование этих событий напрямую или через методы
draggable(), resizable(),
gesturable() позволяет создать интерактивное поведение для
любого элемента.
Interact.js поддерживает делегирование событий, что полезно при работе с динамически создаваемыми элементами:
interact('#container')
.draggable({
listeners: { move: dragMoveListener },
allowFrom: '.handle'
});
Параметр allowFrom ограничивает начало
взаимодействия только элементами с указанным селектором. Это
предотвращает случайное срабатывание перетаскивания при кликах на другие
части контейнера.
Для управления областью перемещения используется
modifiers:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: { top: 0, left: 0, bottom: 500, right: 800 },
endOnly: true
})
]
});
restriction может быть элементом,
объектом с координатами или CSS-селектором.endOnly — если true,
ограничение применится только в конце перемещения.Для плавного взаимодействия можно тонко настроить параметры инерции и чувствительности:
interact('.draggable').draggable({
inertia: {
resistance: 20,
minSpeed: 100,
endSpeed: 10
},
listeners: { move: dragMoveListener }
});
resistance — сопротивление движения,
чем больше значение, тем быстрее объект замедляется.minSpeed и
endSpeed — минимальная скорость старта и
окончания инерции.Interact.js автоматически обрабатывает несколько указателей для
элементов с gesturable() и draggable(). Это
позволяет реализовать масштабирование и вращение одновременно с
перемещением:
interact('.gesture')
.gesturable({
listeners: {
move: function(event) {
let scale = event.scale;
let angle = event.delta.angle;
event.target.style.transform =
`scale(${scale}) rotate(${angle}deg)`;
}
}
});
event.scale — масштаб жеста.event.delta.angle — изменение угла
между двумя пальцами.Для предотвращения случайного срабатывания перетаскивания можно
использовать параметры delay и threshold:
interact('.draggable').draggable({
listeners: { move: dragMoveListener },
delay: 100,
hold: 500,
max: 2
});
delay — задержка перед запуском
drag-события.hold — время удержания до
срабатывания.max — максимальное количество
указателей, которые могут одновременно влиять на объект.Interact.js предоставляет координаты относительно начальной точки взаимодействия:
function dragMoveListener(event) {
let target = event.target;
let x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
let 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);
}
event.dx и event.dy —
смещение указателя от предыдущего события.data-x и data-y обеспечивает
сохранение позиции при повторных взаимодействиях.Interact.js легко комбинируется с нативными событиями DOM:
interact('.draggable')
.on('tap', function(event) {
console.log('Элемент был нажат');
})
.on('doubletap', function(event) {
console.log('Двойной клик зафиксирован');
});
Это позволяет строить гибкую логику пользовательского интерфейса без конфликтов между событиями мыши и касаний.
Этот подход к настройке обработки указателей обеспечивает полный контроль над поведением элементов в приложениях, поддерживает сенсорные экраны, мышь и мультитач, и позволяет создавать интерактивные интерфейсы с высокой точностью и плавностью анимации.