Interact.js предоставляет мощный набор инструментов для создания интерактивных элементов на веб-странице. Одной из ключевых концепций является область срабатывания (dropzone), которая определяет, где и как объекты могут быть перетаскиваемыми и взаимодействовать с другими элементами. Понимание этих областей необходимо для точной настройки drag-and-drop интерфейсов.
Dropzone — это элемент, который может принимать перетаскиваемые объекты. Основные свойства, определяющие поведение dropzone:
pointer,
center.Пример базовой настройки dropzone:
interact('.dropzone').dropzone({
accept: '.draggable',
overlap: 0.5,
ondropactivate: function (event) {
event.target.classList.add('active-dropzone');
},
ondragenter: function (event) {
const draggableElement = event.relatedTarget;
const dropzoneElement = event.target;
dropzoneElement.classList.add('hovered');
draggableElement.classList.add('can-drop');
},
ondragleave: function (event) {
event.target.classList.remove('hovered');
event.relatedTarget.classList.remove('can-drop');
},
ondrop: function (event) {
event.target.appendChild(event.relatedTarget);
}
});
В этом примере .dropzone принимает
только элементы с классом .draggable, а событие
ondragenter срабатывает при перекрытии на 50%.
Свойство overlap определяет, насколько перетаскиваемый
элемент должен перекрывать dropzone для срабатывания события:
0.5
означает, что половина объекта должна находиться внутри dropzone.interact('.dropzone').dropzone({
overlap: 'pointer'
});
Использование 'pointer' удобно для случаев, когда
визуально требуется более точное срабатывание при наведении мыши.
Свойство accept позволяет ограничить, какие элементы могут быть помещены в dropzone. Можно использовать:
.draggable, #item1)true или false:interact('.dropzone').dropzone({
accept: function (element) {
return element.hasAttribute('data-draggable');
}
});
Такой подход позволяет создавать динамические правила на основе атрибутов, состояния DOM или данных элемента.
Interact.js выделяет несколько ключевых событий, связанных с dropzone:
Каждое событие получает объект event с двумя ключевыми
свойствами:
event.target — DOM-элемент dropzone.event.relatedTarget — DOM-элемент перетаскиваемого
объекта.Для сложных интерфейсов dropzone можно комбинировать несколько правил:
interact('.dropzone').dropzone({
accept: '.draggable',
overlap: 0.6,
ondragenter: function (event) {
event.target.style.background = '#e0f7fa';
},
ondragleave: function (event) {
event.target.style.background = '';
},
ondrop: function (event) {
const dragged = event.relatedTarget;
event.target.appendChild(dragged);
dragged.style.transform = '';
}
});
Здесь используется визуальная подсветка при наведении и возврат стилей после drop. При этом элемент корректно вставляется в dropzone, а transform, применённый при drag, сбрасывается.
Interact.js поддерживает вложенные dropzone. Важно правильно настроить:
interact('.parent-dropzone').dropzone({ accept: '.typeA', overlap: 0.5 });
interact('.child-dropzone').dropzone({ accept: '.typeB', overlap: 0.7 });
При этом элемент типа .typeB, попавший в child-dropzone,
не будет захвачен parent-dropzone, даже если они пересекаются.
Чтобы избежать конфликтов с вложенными элементами, полезно управлять
CSS-свойством pointer-events. Dropzone может быть невидимой
для событий мыши, пока не активен drag:
.dropzone {
pointer-events: none;
}
.dropzone.active-dropzone {
pointer-events: auto;
}
Dropzone можно изменять в процессе выполнения, создавая динамические области срабатывания:
document.addEventListener('click', () => {
interact('.dynamic-dropzone').dropzone({
accept: '.new-draggable',
overlap: 0.5
});
});
Такой подход полезен для интерфейсов, где dropzone создаются и уничтожаются в зависимости от состояния приложения.
ondragenter и ondragleave —
удобный способ реализовать визуальную подсветку.interact(target).dropzone(options).Interact.js позволяет гибко настраивать области срабатывания, обеспечивая точное управление drag-and-drop взаимодействием и визуальной обратной связью. Правильная комбинация accept, overlap и событий dropzone позволяет создавать сложные и интуитивно понятные интерфейсы.