Библиотека Interact.js предоставляет мощный инструмент для реализации перетаскивания элементов и определения зон, куда эти элементы могут быть помещены. Взаимодействие между draggable и dropzone строится на отслеживании событий перетаскивания и проверке попадания элемента в целевую область.
Для того чтобы элемент стал перетаскиваемым, используется метод
interact(target).draggable(options). Ключевые
параметры:
inertia – включает или отключает эффект инерции при завершении перетаскивания.
modifiers – массив ограничителей движения (например, ограничение перемещения внутри контейнера).
listeners – объект с обработчиками событий:
start – начало перетаскивания, полезно для
инициализации состояния.move – событие перемещения, обычно используется для
изменения позиции элемента через CSS трансформации.end – завершение перетаскивания, позволяет реализовать
логику после отпускания элемента.Пример базовой инициализации:
interact('.draggable')
.draggable({
inertia: true,
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
],
listeners: {
start(event) {
console.log('Начало перетаскивания', event.target);
},
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);
},
end(event) {
console.log('Завершение перетаскивания', event.target);
}
}
});
Элемент, который может принимать draggable объекты, настраивается
через interact(target).dropzone(options). Основные
опции:
Пример конфигурации dropzone:
interact('.dropzone')
.dropzone({
accept: '.draggable',
overlap: 0.5,
ondropactivate(event) {
event.target.classList.add('active-zone');
},
ondragenter(event) {
event.target.classList.add('over-zone');
event.relatedTarget.classList.add('can-drop');
},
ondragleave(event) {
event.target.classList.remove('over-zone');
event.relatedTarget.classList.remove('can-drop');
},
ondrop(event) {
console.log('Элемент сброшен в зону:', event.target);
},
ondropdeactivate(event) {
event.target.classList.remove('active-zone');
}
});
Основной механизм взаимодействия — отслеживание позиции draggable элемента относительно границ dropzone. Библиотека автоматически проверяет пересечение и вызывает соответствующие события. Ключевые моменты:
accept фильтрует элементы, которые могут быть сброшены в зону.
overlap позволяет гибко настраивать чувствительность:
overlap: 0 – достаточно коснуться границы.overlap: 1 – требуется полное нахождение элемента
внутри зоны.Классы CSS, добавляемые в событиях
dragenter/dragleave, позволяют визуализировать
допустимые действия.
Interact.js поддерживает динамически добавляемые элементы. Для этого можно использовать делегирование событий через селекторы:
interact(document).on('dragmove', '.draggable', function(event) {
// Обработка перемещения динамического элемента
});
При этом dropzone можно также активировать для новых
элементов, используя interact('.dropzone').dropzone()
повторно или применяя селекторы, которые охватывают динамически
созданные зоны.
Можно определить несколько зон с разной логикой для одного draggable элемента:
interact('.dropzone-a').dropzone({ accept: '.draggable-a' });
interact('.dropzone-b').dropzone({ accept: '.draggable-b', overlap: 0.75 });
В этом случае Interact.js автоматически проверяет попадание каждого
draggable элемента только в те зоны, которые соответствуют условию
accept.
Modifiers и события drag позволяют реализовать сложную логику:
interact.modifiers.snap({ targets: [interact.snappers.grid({ x: 50, y: 50 })] }).interact.modifiers.restrictRect({ restriction: 'parent' }).В сочетании с событиями dropzone это позволяет создавать интерактивные интерфейсы типа drag-and-drop редакторов, перетаскиваемых карточек, динамических списков и интерфейсов для прототипирования.
dragenter/dragleave улучшает UX и визуально
показывает допустимые зоны.data-type
элемента.При стандартном взаимодействии между draggable и dropzone события происходят в следующей последовательности:
dragstart – начало перетаскивания элемента.dropactivate – активация всех потенциальных
dropzone.dragmove – движение элемента.dragenter – элемент пересек границы dropzone.dragleave – элемент покинул dropzone.drop – успешный сброс элемента в dropzone.dropdeactivate – завершение взаимодействия для всех
dropzone.dragend – окончание перетаскивания draggable
элемента.Эта последовательность позволяет точно контролировать и визуализировать каждое взаимодействие.
Использование событий drag и drop позволяет:
Эта комбинация событий и опций делает Interact.js идеальным инструментом для сложных drag-and-drop интерфейсов с высокой интерактивностью.