Interact.js предоставляет мощные инструменты для реализации интерактивных элементов на веб-странице, включая управление курсорами, визуальную обратную связь при перетаскивании, масштабировании и вращении элементов. Основные возможности можно разделить на несколько ключевых направлений: изменение стиля курсора, динамическая визуализация взаимодействия и работа с событиями drag, resize и gesture.
Interact.js позволяет автоматически изменять курсор в зависимости от
действия пользователя. Для этого используется свойство
cursorChecker, которое можно задать при инициализации
интерактивного элемента:
interact('.draggable')
.draggable({
cursorChecker: function (action, interactable, element, interacting) {
if (interacting) {
return 'grabbing';
}
return 'grab';
}
});
Ключевые моменты:
action — объект действия, например 'drag'
или 'resize'.interactable — объект, представляющий элемент, с
которым происходит взаимодействие.interacting — булево значение, указывающее, активен ли
процесс взаимодействия.'pointer', 'move', 'grab',
'grabbing' и т. д.).Использование cursorChecker позволяет обеспечить
динамическую визуальную обратную связь, которая
изменяется в зависимости от состояния действия.
Interact.js не только управляет курсорами, но и позволяет добавлять или удалять CSS-классы во время взаимодействия. Это особенно полезно для отображения состояния перетаскивания, масштабирования или вращения:
interact('.draggable')
.draggable({
onstart: function (event) {
event.target.classList.add('dragging');
},
onend: function (event) {
event.target.classList.remove('dragging');
}
});
Особенности:
onstart — срабатывает при начале действия.onmove — срабатывает при каждом изменении позиции.onend — срабатывает при завершении действия..dragging может содержать любые визуальные
эффекты: тень, изменение прозрачности, рамки или трансформации.Такой подход обеспечивает моментальное визуальное подтверждение действий пользователя, что делает интерфейс более отзывчивым и понятным.
Interact.js позволяет не только отслеживать движение курсора, но и ограничивать его движение в пределах определённой области:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent',
endOnly: true
})
]
});
restriction: 'parent' — ограничивает перемещение
элементом родителя.endOnly: true — ограничение применяется только после
завершения перетаскивания, предотвращая резкие “срезы” на границах.Такое ограничение сохраняет контроль над положением элементов, предотвращает выход за пределы контейнера и помогает избежать визуального хаоса.
Для создания плавного визуального отклика используется CSS-трансформация и динамическое обновление координат:
interact('.draggable')
.draggable({
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);
}
}
});
Преимущества такого подхода:
data-x и data-y
позволяют сохранять позицию элемента между
событиями.transform обеспечивает
плавную и аппаратно ускоренную анимацию.Interact.js поддерживает жесты gesture и масштабирование
resize с визуальной обратной связью:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
listeners: {
move(event) {
let { x, y } = event.target.dataset;
x = parseFloat(x || 0) + event.deltaRect.left;
y = parseFloat(y || 0) + event.deltaRect.top;
Object.assign(event.target.style, {
width: `${event.rect.width}px`,
height: `${event.rect.height}px`,
transform: `translate(${x}px, ${y}px)`
});
event.target.dataset.x = x;
event.target.dataset.y = y;
}
}
});
Особенности:
edges определяет, с каких сторон элемента возможно
изменение размеров.deltaRect используется для точного расчета смещения при
изменении размеров.width, height и
transform позволяет создавать интерактивный и
отзывчивый интерфейс.Для улучшения UX можно использовать привязку к сетке или определённым точкам:
interact('.draggable')
.draggable({
modifiers: [
interact.modifiers.snap({
targets: [
interact.snappers.grid({ x: 50, y: 50 })
],
range: Infinity,
relativePoints: [{ x: 0, y: 0 }]
})
]
});
Interact.js предоставляет полную свободу для кастомизации визуальных эффектов, включая:
Пример интеграции с CSS-анимациями:
.draggable.dragging {
box-shadow: 0 8px 16px rgba(0,0,0,0.3);
opacity: 0.85;
transition: box-shadow 0.2s ease, opacity 0.2s ease;
}
Такой подход позволяет обеспечить богатую визуальную обратную связь без сложной логики на стороне JavaScript.
Interact.js сочетает гибкое управление курсорами и широкие возможности визуальной обратной связи, позволяя создавать интуитивные, отзывчивые и визуально привлекательные интерфейсы. Все изменения стилей, трансформаций и визуальных индикаторов могут быть полностью кастомизированы под любые сценарии использования.