Interact.js предоставляет унифицированный интерфейс для обработки
событий перетаскивания, масштабирования и жестов,
поддерживая как мышь, так и сенсорные
устройства. Однако, несмотря на высокоуровневую абстракцию,
существует ряд важных различий в поведении событий mouse и
touch, которые напрямую влияют на реализацию интерактивных
интерфейсов.
Mouse события включают:
mousedown — нажатие кнопки мыши.mousemove — перемещение мыши при удерживаемой
кнопке.mouseup — отпускание кнопки мыши.click и dblclick — одиночное и двойное
нажатие.Touch события включают:
touchstart — начало касания пальцем.touchmove — движение пальца по экрану.touchend — завершение касания.touchcancel — отмена касания системой или
браузером.Особенность: в touch событиях может участвовать
несколько точек касания одновременно (multi-touch), что
важно для жестов масштабирования и вращения.
Mouse события возвращают координаты относительно
документа (clientX, clientY,
pageX, pageY) и всегда имеют одну
точку взаимодействия.
Touch события содержат массив touches,
targetTouches и changedTouches, каждая из
которых имеет собственные координаты. Для обработки multi-touch
необходимо использовать эти коллекции.
Пример:
interact(element).draggable({
listeners: {
move(event) {
let x = event.clientX; // для мыши
// для touch:
if(event.touches) {
x = event.touches[0].clientX;
}
}
}
});
Mouse ограничен одной точкой, поэтому жесты типа pinch или rotate не применимы напрямую.
Touch позволяет работать с несколькими точками касания:
event.touches.length — количество активных
пальцев.event.scale — коэффициент масштабирования (если
используется gesture).event.rotation — угол вращения между двумя
пальцами.Interact.js абстрагирует жесты через модуль
gesturable:
interact(element).gesturable({
listeners: {
move(event) {
element.style.transform =
`scale(${event.scale}) rotate(${event.rotation}deg)`;
}
}
});
В touch событиях браузеры накладывают задержку для определения клика (обычно 300 мс). Это может создавать эффект «торможения» при drag & drop. Для устранения используется CSS свойство:
element {
touch-action: none;
}
touch-action: none отключает стандартное поведение
браузера (скролл, масштабирование) для элемента, позволяя Interact.js
обрабатывать все события самостоятельно. Для мыши это свойство не
оказывает влияния.
Interact.js автоматически использует mouse fallback на устройствах без сенсорного экрана, но важно учитывать:
preventDefault() в touch-событиях или проверять
pointerType:interact(element).draggable({
listeners: {
start(event) {
if(event.pointerType === 'mouse') {
// обработка мыши
} else if(event.pointerType === 'touch') {
// обработка touch
}
}
}
});
Interact.js поддерживает Pointer Events API,
объединяющий mouse и touch события через pointerdown,
pointermove, pointerup. Преимущества:
pointerId.При использовании pointer events различие между mouse и touch скрывается, но все тонкости координат и multi-touch остаются актуальными для жестов.
touch-action: none.gesturable и проверять
количество касаний.pointerType или использовать pointer events.draggable, resizable и
gesturable, различая обработку по типу устройства.Различия между mouse и touch требуют внимательного подхода при разработке интерактивных элементов. Понимание особенностей событий и их координатной системы позволяет создавать плавный и предсказуемый пользовательский опыт на всех устройствах.