Interactable — это ключевой объект библиотеки
Interact.js, который представляет HTML-элемент или
группу элементов с возможностью интерактивного поведения. Этот объект
позволяет управлять перетаскиванием, изменением размеров и
жестами, задавая детализированные параметры взаимодействия.
Каждому DOM-элементу можно сопоставить один Interactable
через функцию interact():
const box = document.querySelector('.draggable');
const draggableInteractable = interact(box);
После этого draggableInteractable становится точкой
настройки всех событий и опций для элемента.
Чтобы объект реагировал на перетаскивание, используется метод
draggable():
draggableInteractable.draggable({
inertia: true,
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
],
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);
}
}
});
Ключевые моменты:
inertia включает эффект инерции при отпускании
элемента.modifiers позволяют ограничивать область перемещения,
например до родительского контейнера.listeners.move срабатывает на каждом шаге перемещения и
используется для изменения позиции элемента.Метод resizable() позволяет задавать интерактивное
изменение размеров:
draggableInteractable.resizable({
edges: { left: true, right: true, bottom: true, top: true },
listeners: {
move(event) {
const target = event.target;
let { width, height } = event.rect;
target.style.width = `${width}px`;
target.style.height = `${height}px`;
const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.deltaRect.left;
const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.deltaRect.top;
target.style.transform = `translate(${x}px, ${y}px)`;
target.setAttribute('data-x', x);
target.setAttribute('data-y', y);
}
},
modifiers: [
interact.modifiers.restrictSize({
min: { width: 50, height: 50 },
max: { width: 500, height: 500 }
})
],
inertia: true
});
Особенности:
edges определяет, с каких сторон можно изменять
размеры.modifiers.restrictSize ограничивает минимальные и
максимальные размеры.event.deltaRect позволяет корректировать позицию
элемента при изменении размеров.Interact.js позволяет комбинировать действия на одном элементе:
interact('.box')
.draggable({ inertia: true })
.resizable({ edges: { left: true, right: true, bottom: true, top: true } });
При этом объект Interactable управляет всеми настройками
одновременно, автоматически синхронизируя события.
Interactable поддерживает мультитач жесты:
масштабирование и вращение через метод gesturable():
draggableInteractable.gesturable({
listeners: {
move(event) {
const target = event.target;
const currentScale = parseFloat(target.getAttribute('data-scale')) || 1;
const newScale = currentScale * (1 + event.ds);
target.style.transform = `scale(${newScale}) rotate(${event.angle}deg)`;
target.setAttribute('data-scale', newScale);
}
}
});
Особенности:
event.ds — изменение масштаба.event.angle — угол поворота.Interactable предоставляет гибкую систему событий:
on('dragstart', callback)on('dragmove', callback)on('dragend', callback)Пример:
draggableInteractable.on('dragstart', event => {
event.target.style.borderColor = 'red';
});
draggableInteractable.on('dragend', event => {
event.target.style.borderColor = '';
});
Методы on и off позволяют добавлять и
удалять обработчики событий, что делает объект гибким в управлении
интерактивностью.
Interactable поддерживает мощные
модификаторы:
restrictRect — ограничение перемещения по области.restrictSize — ограничение размеров.snap — привязка к сетке или другим элементам.restrictEdges — ограничение движения по краям
контейнера.Модификаторы передаются через массив modifiers и могут
применяться к любому типу действия (drag, resize, gesture).
Interact.js позволяет работать с группой элементов через селекторы, используя делегирование:
interact('.list-item')
.draggable({
listeners: { move: dragMoveListener },
ignoreFrom: '.non-draggable',
allowFrom: '.handle'
});
Пояснения:
ignoreFrom исключает элементы, по которым нельзя
инициировать перетаскивание.allowFrom разрешает взаимодействие только с указанными
элементами.Через объект Interactable можно динамически изменять
поведение элемента:
draggableInteractable.draggable(false); // отключить перетаскивание
draggableInteractable.draggable(true); // включить обратно
Также можно изменять отдельные опции без пересоздания объекта:
draggableInteractable.draggable({ inertia: false }); // отключить инерцию
Объект Interactable является сердцем системы
интерактивности Interact.js, позволяя:
Он формирует основу для создания интерактивных интерфейсов и сложных UI-компонентов с минимальными усилиями.