Interact.js предоставляет гибкий механизм для управления позиционированием элементов на странице через drag-and-drop, масштабирование и другие интерактивные действия. В основе этого механизма лежат координаты мыши, позиция элемента в DOM и трансформации CSS.
Каждое интерактивное событие (dragmove,
resize, gesturemove) содержит объект события с
несколькими ключевыми свойствами для определения положения:
event.pageX и event.pageY — координаты
курсора относительно страницы.event.clientX и event.clientY — координаты
относительно видимой области браузера.event.dx и event.dy — смещение курсора с
предыдущего события. Полезно для инкрементного
перемещения.Использование этих координат позволяет точно вычислять новые позиции элемента, независимо от его начального положения.
Interact.js по умолчанию работает через CSS
transform: translate(), что обеспечивает плавное и
высокопроизводительное перемещение. Для отслеживания позиции элемента
используется собственный объект data, где хранятся текущие
координаты:
target.dataset.x = (parseFloat(target.dataset.x) || 0) + event.dx;
target.dataset.y = (parseFloat(target.dataset.y) || 0) + event.dy;
target.style.transform =
`translate(${target.dataset.x}px, ${target.dataset.y}px)`;
Ключевые моменты:
dataset позволяет хранить абсолютные координаты без
постоянного чтения CSS стилей.dx/dy применяется инкрементно.transform гарантирует аппаратное ускорение и
минимизирует сдвиг макета страницы.В случаях, когда элемент находится внутри контейнера с собственным позиционированием, важно учитывать смещение родительского блока:
const rect = parent.getBoundingClientRect();
const offsetX = event.clientX - rect.left;
const offsetY = event.clientY - rect.top;
getBoundingClientRect() возвращает текущие координаты
контейнера относительно окна браузера.offsetX и offsetY позволяют вычислять
локальные координаты внутри родителя.restrict) и сетки (snapGrid).Interact.js поддерживает ограничения движения с
помощью метода modifiers. Для позиционирования на сетке
используется snap:
interact(target).draggable({
modifiers: [
interact.modifiers.snap({
targets: [
interact.snappers.grid({ x: 50, y: 50 })
],
range: Infinity,
relativePoints: [{ x: 0, y: 0 }]
})
]
});
snap.targets определяет точки, к которым элемент будет
притягиваться.grid({ x, y }) задает шаг сетки по горизонтали и
вертикали.relativePoints определяет точку элемента, к которой
применяется притяжение.После изменения масштаба (scale) или вращения
(rotate) элемент может иметь нестандартные
координаты в системе страницы. Для корректного вычисления
применяются методы:
const rect = target.getBoundingClientRect();
const style = window.getComputedStyle(target);
const matrix = new DOMMatrixReadOnly(style.transform);
const x = matrix.m41; // трансляция по X
const y = matrix.m42; // трансляция по Y
DOMMatrixReadOnly позволяет извлечь текущие значения
translate, scale, rotate.Interact.js поддерживает два подхода:
dx/dy к
текущим координатам (плавное перемещение).Пример абсолютного позиционирования:
target.style.left = `${event.pageX - offsetX}px`;
target.style.top = `${event.pageY - offsetY}px`;
position: absolute или
relative в родительском контейнере.Для сложных интерфейсов часто требуется вычислять позицию с учётом
нескольких интерактивных действий одновременно (drag +
resize). Interact.js предоставляет объект interaction:
interact(target).on('dragmove resize', event => {
const x = (parseFloat(target.dataset.x) || 0) + event.dx;
const y = (parseFloat(target.dataset.y) || 0) + event.dy;
target.dataset.x = x;
target.dataset.y = y;
target.style.transform = `translate(${x}px, ${y}px)`;
});
interaction объединяет события и позволяет применять
общую логику смещения.dataset позволяет легко
комбинировать смещения и трансформации.transform: translate() обеспечивает
производительное позиционирование.getBoundingClientRect()
необходим для корректной работы с контейнерами.modifiers позволяет легко реализовать сетки,
ограничения и притяжение к точкам.DOMMatrixReadOnly для точного получения координат после
масштабирования и вращения.Такой подход позволяет реализовать точное, плавное и управляемое позиционирование элементов в любых интерактивных интерфейсах на базе Interact.js.