В библиотеке Interact.js события взаимодействия (interaction events) формируются на основе действий пользователя: движения указателя, нажатий кнопок мыши, касаний сенсорного экрана и событий клавиатуры. Однако архитектура библиотеки позволяет генерировать такие события программно, без реального пользовательского ввода. Это называется симуляцией событий.
Симуляция используется для:
В Interact.js симулируемые события проходят через ту же систему обработки, что и реальные события. Благодаря этому логика обработчиков остается одинаковой, независимо от источника события.
В основе библиотеки лежит модель взаимодействия, включающая несколько ключевых компонентов.
Interactable Объект, представляющий DOM-элемент, с которым можно взаимодействовать.
interact('.box')
Interaction Активный процесс взаимодействия: перетаскивание, изменение размера, жест.
Action Тип взаимодействия:
Event Событие, передаваемое обработчикам
(dragmove, resizemove и т.д.).
Система обработки событий проходит следующие этапы:
При симуляции этот поток запускается программно.
Основной механизм симуляции — создание объекта Interaction через API библиотеки.
const interaction = interact.interactions.new({
pointerType: 'mouse'
});
Параметры:
| Параметр | Назначение |
|---|---|
| pointerType | тип указателя |
| eventTarget | целевой DOM-элемент |
| coords | координаты указателя |
После создания Interaction можно инициировать действия.
Начало взаимодействия соответствует событию:
dragstartresizestartgesturestartДля запуска используется метод start().
const element = document.querySelector('.box');
const interaction = interact.interactions.new({
pointerType: 'mouse'
});
interaction.start(
{ name: 'drag' },
interact(element),
element
);
Параметры метода:
| Параметр | Описание |
|---|---|
| action | тип действия |
| interactable | объект interactable |
| element | DOM-элемент |
После вызова start() генерируется событие:
dragstart
Следующий этап взаимодействия — перемещение указателя. В обычных
условиях оно вызывается pointermove.
При симуляции используется метод:
interaction.move()
interaction.move({
pageX: 200,
pageY: 300,
clientX: 200,
clientY: 300
});
Передаваемый объект имитирует реальное pointer-событие.
Минимально необходимые свойства:
| Свойство | Назначение |
|---|---|
| pageX | координата по X |
| pageY | координата по Y |
| clientX | координата внутри viewport |
| clientY | координата внутри viewport |
После вызова генерируется событие:
dragmove
Окончание взаимодействия соответствует событию:
dragend
Для завершения используется:
interaction.end();
Полный цикл взаимодействия:
interaction.start(...)
interaction.move(...)
interaction.move(...)
interaction.end()
Пример полного сценария программного перетаскивания элемента.
const element = document.querySelector('.box');
interact(element).draggable({
listeners: {
start(event) {
console.log('dragstart');
},
move(event) {
console.log('dragmove', event.dx, event.dy);
},
end(event) {
console.log('dragend');
}
}
});
const interaction = interact.interactions.new({
pointerType: 'mouse'
});
interaction.start(
{ name: 'drag' },
interact(element),
element
);
interaction.move({
pageX: 100,
pageY: 100,
clientX: 100,
clientY: 100
});
interaction.move({
pageX: 200,
pageY: 200,
clientX: 200,
clientY: 200
});
interaction.end();
В результате обработчики выполнятся так же, как при реальном перетаскивании.
Механизм аналогичен drag, но используется действие
resize.
interaction.start(
{
name: 'resize',
edges: { right: true, bottom: true }
},
interact(element),
element
);
Параметр edges указывает стороны изменения размера.
interaction.move({
pageX: 300,
pageY: 250
});
Сгенерируется событие:
resizemove
Gesture используется для сенсорных жестов (масштабирование, вращение).
Запуск:
interaction.start(
{ name: 'gesture' },
interact(element),
element
);
Для симуляции необходимо передавать данные о нескольких указателях.
Пример структуры:
interaction.move({
touches: [
{ pageX: 100, pageY: 100 },
{ pageX: 200, pageY: 200 }
]
});
События:
gesturestartgesturemovegestureendИногда требуется симулировать базовые pointer-события, на основе которых Interact.js генерирует свои события.
Основные типы:
| Событие | Назначение |
|---|---|
| pointerdown | начало взаимодействия |
| pointermove | перемещение |
| pointerup | завершение |
Пример создания:
const event = new PointerEvent('pointermove', {
clientX: 150,
clientY: 200,
bubbles: true
});
element.dispatchEvent(event);
Interact.js обработает событие и запустит соответствующие действия.
Симуляция событий часто применяется в автоматизированных тестах интерфейсов.
Типовой сценарий:
Пример:
interaction.start({ name: 'drag' }, interact(element), element);
interaction.move({
pageX: 400,
pageY: 300
});
interaction.end();
После выполнения можно проверить позицию:
expect(element.style.transform).toContain('translate');
Симуляция может использоваться для создания управляемых анимаций.
Пример: плавное программное перетаскивание.
let x = 0;
let y = 0;
function animate() {
x += 5;
y += 3;
interaction.move({
pageX: x,
pageY: y
});
if (x < 300) {
requestAnimationFrame(animate);
} else {
interaction.end();
}
}
Запуск:
interaction.start({ name: 'drag' }, interact(element), element);
animate();
Симуляция позволяет управлять несколькими элементами одновременно.
Пример синхронного перемещения:
function moveAll(x, y) {
interaction1.move({ pageX: x, pageY: y });
interaction2.move({ pageX: x, pageY: y });
}
Такая техника применяется в:
Иногда требуется вручную создать событие InteractEvent.
Минимальная структура:
const event = {
type: 'dragmove',
target: element,
dx: 10,
dy: 15
};
Передача в обработчики:
interactable.fire(event);
Этот механизм используется для:
Несмотря на гибкость, существуют ограничения.
Симулируемые события могут не иметь уникального идентификатора указателя.
Некоторые браузеры ограничивают:
При симуляции необходимо корректно задавать:
Некорректные значения могут привести к неправильному вычислению смещений.
Для диагностики используются:
interact(element).on('dragmove', event => {
console.log(event);
});
console.log(interaction.interacting());
console.log(interaction.coords);
Программное перемещение элементов:
Показ возможностей интерфейса без действий пользователя.
Сценарий:
interaction.move().| Метод | Назначение |
|---|---|
| interactions.new() | создание Interaction |
| interaction.start() | запуск действия |
| interaction.move() | генерация движения |
| interaction.end() | завершение действия |
| interactable.fire() | ручная генерация события |
Эти методы позволяют полностью воспроизводить пользовательские взаимодействия программно, что делает Interact.js пригодным для сложных интерфейсных систем, тестирования и динамического управления элементами интерфейса.