Interact.js использует унифицированную модель событий, которая обеспечивает согласованное поведение для всех типов взаимодействий: перетаскивания, масштабирования, вращения и жестов. Эта модель позволяет работать с событиями на уровне абстракции действий, а не конкретных устройств ввода, таких как мышь, сенсорный экран или стилус.
Interaction Объект Interaction
представляет текущее взаимодействие пользователя с элементом. Он
содержит всю информацию о состоянии взаимодействия, включая:
target — DOM-элемент, на котором выполняется
действие;pointerType — тип указателя (mouse,
touch, pen);currentAction — текущее действие (drag,
resize, gesture);interacting — флаг, указывающий, происходит ли
взаимодействие в данный момент.Event События Interact.js наследуются от
InteractEvent и содержат следующие ключевые свойства:
type — тип события (dragstart,
dragmove, dragend, resizestart и
т.д.);target — элемент, с которым связано событие;currentTarget — элемент, на который слушатель
установлен;dx, dy — смещения указателя относительно
предыдущего события;pageX, pageY — координаты указателя
относительно документа;rect — текущие размеры и положение элемента;deltaTime — время между событиями;pointerType — тип устройства ввода.Action Действие описывает тип манипуляции, которую пользователь выполняет с элементом:
drag — перетаскивание;resize — изменение размера;gesture — мультитач-жесты (например, масштабирование
двумя пальцами).Каждое действие генерирует собственный набор событий, но все они имеют одинаковую структуру, что упрощает обработку в коде.
Interact.js использует циклическую модель событий, где каждое взаимодействие проходит через несколько стадий:
start Событие *start инициируется в
момент, когда пользователь начинает взаимодействие. Примеры:
dragstart, resizestart. Ключевые свойства на
этом этапе:
pageX, pageY — начальная позиция
указателя;rect — начальные размеры элемента;interaction — объект текущего взаимодействия.move Событие *move срабатывает при
каждом изменении позиции указателя во время действия
(dragmove, resizemove). Важные параметры:
dx, dy — относительные смещения;deltaTime — время между событиями;velocityX, velocityY — скорость
перемещения указателя.end Событие *end фиксирует
завершение действия (dragend, resizeend). На
этом этапе можно получить:
Interact.js автоматически привязывает события к типу
указателя. Вне зависимости от устройства (mouse,
touch, pen) события имеют одинаковый
интерфейс. Это достигается через:
pointerdown, pointermove,
pointerup);mousedown,
mousemove, mouseup и touchstart,
touchmove, touchend.Унифицированный объект события содержит поле
pointerType, которое позволяет определить источник ввода,
сохраняя при этом единый формат данных для всех действий.
Все действия в Interact.js используют единый обработчик событий, который можно настраивать через цепочку методов:
interact('.draggable')
.draggable({
inertia: true,
modifiers: [interact.modifiers.restrictRect({
restriction: 'parent'
})],
listeners: {
start(event) { console.log('dragstart', event); },
move(event) { console.log('dragmove', event.dx, event.dy); },
end(event) { console.log('dragend', event); }
}
});
Преимущество модели: независимо от того, перетаскивается элемент
мышью или пальцем, структура объекта event остается
одинаковой.
Аналогично реализованы resize и gesture:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
listeners: {
start(event) { console.log('resizestart', event.rect); },
move(event) { console.log('resizemove', event.deltaRect); },
end(event) { console.log('resizeend'); }
}
});
interact('.gesturable')
.gesturable({
listeners: {
start(event) { console.log('gesture start'); },
move(event) { console.log('scale', event.scale, 'rotation', event.rotation); },
end(event) { console.log('gesture end'); }
}
});
Унифицированная модель позволяет легко работать с мульти-тач
событиями. Для каждого указателя создается отдельный объект
pointer, а взаимодействие объединяет их в один
interaction.
Ключевые свойства для мульти-тач:
event.pointers — массив всех активных указателей;event.touches — идентификаторы пальцев;event.scale — масштабирование между пальцами;event.rotation — угол поворота жеста.Interact.js поддерживает модификаторы, которые могут автоматически корректировать события:
restrict — ограничение перемещения внутри
контейнера;snap — привязка к сетке;invert — зеркальное отражение движения;restrictEdges — ограничение изменения размера.Модификаторы работают на этапе генерации *move событий,
изменяя свойства dx, dy и финальное положение
элемента без изменения исходного указателя.
При динамическом создании или удалении элементов Interact.js сохраняет унифицированную модель событий через делегирование:
event.target;dx, dy,
pointerType, interaction, обеспечивая
консистентность.Эта модель является фундаментом всех функциональных возможностей Interact.js и обеспечивает мощный, предсказуемый и масштабируемый механизм работы с пользовательским взаимодействием.