В Interact.js активные зоны (dropzones) используются для
обработки перетаскиваемых элементов и определения мест, куда они могут
быть перемещены. Каждый элемент, назначенный как зона, может реагировать
на взаимодействие с перетаскиваемыми объектами, предоставляя визуальную
и функциональную обратную связь.
Активная зона определяется через метод
interact.dropzone(), к которому применяются
конфигурационные параметры:
interact('.dropzone')
.dropzone({
accept: '.draggable',
overlap: 0.75,
ondropactivate: event => { ... },
ondragenter: event => { ... },
ondragleave: event => { ... },
ondrop: event => { ... },
ondropdeactivate: event => { ... }
});
Ключевые параметры:
accept — CSS-селектор или функция, определяющая, какие
элементы могут быть приняты зоной.overlap — число от 0 до 1, задающее процент перекрытия,
при котором зона считается активной.ondropactivate и ondropdeactivate —
события активации и деактивации зоны при начале и завершении
взаимодействия.ondragenter и ondragleave — события при
входе и выходе перетаскиваемого объекта.ondrop — событие, фиксирующее успешное перемещение
элемента в зону.Для улучшения UX визуальные индикаторы активных зон играют критическую роль. Их можно реализовать через динамическое изменение CSS-классов при событиях зоны:
ondragenter: event => {
event.target.classList.add('active-dropzone');
},
ondragleave: event => {
event.target.classList.remove('active-dropzone');
},
ondropdeactivate: event => {
event.target.classList.remove('active-dropzone');
}
Советы по стилю:
overlap, чтобы не создавать ложных срабатываний.Параметр overlap определяет, насколько объект должен
пересекать зону для срабатывания события ondrop.
0 — зона активируется даже при малейшем
касании.0.5 — требуется перекрытие хотя бы на половину
элемента.1 — срабатывает только при полном попадании
элемента в зону.Применение динамического изменения порога может быть полезным для разных типов элементов:
interact('.dropzone').dropzone({
overlap: element => element.classList.contains('large') ? 0.5 : 0.25
});
Interact.js поддерживает несколько зон одновременно, что позволяет создавать сложные интерфейсы с перекрывающимися зонами. Для корректной работы необходимо учитывать:
dragenter и
dragleave — отслеживают точное попадание в каждую
из зон независимо.accept — помогает фильтровать
допустимые элементы для каждой зоны, избегая конфликтов.Пример с двумя зонами:
interact('#zone1').dropzone({ accept: '.typeA', overlap: 0.5 });
interact('#zone2').dropzone({ accept: '.typeB', overlap: 0.5 });
Для визуального усиления интерактивности можно применять CSS-анимации
при изменении состояния зоны. Используются события
ondragenter и ondragleave:
.active-dropzone {
transition: box-shadow 0.3s, border-color 0.3s;
box-shadow: 0 0 15px rgba(0, 150, 136, 0.6);
border-color: #009688;
}
ondragenter: event => event.target.classList.add('active-dropzone'),
ondragleave: event => event.target.classList.remove('active-dropzone')
Эффект плавного появления и исчезновения помогает пользователю интуитивно понять, что зона готова принять элемент.
Можно дополнительно внедрять подсказки и индикаторы:
overlapping, active, ready для
разных фаз взаимодействия.ondragmove: event => {
const overlapRatio = event.interaction.interactables[0].getRect().overlap(event.target);
event.target.style.background = `rgba(0, 150, 136, ${overlapRatio})`;
}
draggable): зоны автоматически реагируют на
элементы, помеченные как draggable.Такой подход к визуальным индикаторам активных зон в Interact.js обеспечивает гибкость, наглядность и точность взаимодействий, создавая интуитивно понятный пользовательский интерфейс.