Жесты и touch-события

Polymer предоставляет мощный инструментарий для работы с пользовательскими взаимодействиями через сенсорные экраны и мышь. Основой работы с жестами является компонент gesture-event-listeners, который позволяет отслеживать события касаний, свайпов, тапа и других жестов, абстрагируя низкоуровневую работу с touchstart, touchmove и touchend.

Подключение жестов

Для использования системы жестов в Polymer необходимо импортировать модуль:

import '@polymer/polymer/lib/elements/gesture-event-listeners.js';

Этот элемент автоматически добавляет слушатели событий к своему дочернему дереву, позволяя использовать такие события, как tap, track, down, up и hold.

Событие tap

Событие tap фиксирует кратковременное касание или клик. Оно объединяет обработку мыши и сенсорного экрана, обеспечивая кросс-платформенность.

<div on-tap="handleTap">Нажми на меня</div>
handleTap(event) {
  console.log('Произошел tap:', event);
}

Особенности:

  • Отрабатывает при быстром касании или клике.
  • Не требует анализа координат или времени удержания.
  • Игнорирует движения, превышающие порог 10px.

Событие track

track используется для отслеживания перемещений пальца или курсора по элементу. Полезно для создания свайпов, перетаскивания и жестов с изменением позиции.

<div on-track="handleTrack">Перетаскивай меня</div>
handleTrack(event) {
  const {dx, dy, state} = event.detail;
  if (state === 'track') {
    console.log(`Смещение dx=${dx}, dy=${dy}`);
  }
}

Свойства события:

  • dx, dy — смещение относительно точки начала касания.
  • x, y — текущие координаты указателя.
  • state — состояние жеста: start, track, end.

События down, up и hold

  • down — событие начала касания или нажатия.
  • up — событие окончания касания.
  • hold — возникает при удержании элемента более 400 мс.
<div on-down="handleDown" on-up="handleUp" on-hold="handleHold">Жесты</div>
handleDown() { console.log('Начало касания'); }
handleUp() { console.log('Конец касания'); }
handleHold() { console.log('Удержание'); }

Эти события позволяют реализовывать сложные сценарии: контекстные меню, drag-and-drop или длинное нажатие.

Использование жестов с Shadow DOM

В Polymer все события жестов корректно всплывают внутри shadow DOM. Чтобы отслеживать события в компоненте, достаточно использовать синтаксис on-event в шаблоне элемента. Для глобальных жестов можно применить document.addEventListener('tap', callback) с последующей фильтрацией по цели события.

Кастомные жесты

Polymer позволяет расширять стандартный набор жестов. Для этого создается объект с обработчиками setup, teardown и handler:

import {addListener} from '@polymer/polymer/lib/utils/gestures.js';

addListener(document.body, 'custom-swipe', (event) => {
  console.log('Произошел кастомный свайп:', event);
});

Кастомные жесты полезны, когда требуется особая логика распознавания движения или мультитач.

Практические рекомендации

  • Использовать tap вместо click на сенсорных устройствах для снижения задержки.
  • Событие track комбинировать с CSS-переходами для плавного перетаскивания элементов.
  • Обрабатывать hold для создания контекстных меню и специальных интерактивных действий.
  • Для сложных интерфейсов с мультитачем и жестами использовать кастомные события с фильтрацией по touch.identifier.

Интеграция с анимацией

Комбинирование жестов с Web Animations API или CSS-переходами позволяет создавать динамичные интерфейсы:

handleTrack(event) {
  const {dx} = event.detail;
  this.style.transform = `translateX(${dx}px)`;
}

Это позволяет элементам реагировать на перемещения пользователя в реальном времени, создавая ощущение естественного взаимодействия.

Поддержка кросс-платформенности

Система жестов Polymer скрывает различия между мышью и тач-событиями. tap и track работают одинаково на ПК и мобильных устройствах, что упрощает разработку универсальных интерфейсов.


Жесты и touch-события в Polymer обеспечивают высокоуровневый и удобный способ обработки пользовательского взаимодействия, абстрагируя низкоуровневую работу с событиями касания и мыши. Это позволяет создавать адаптивные и отзывчивые интерфейсы с минимальными усилиями и высокой стабильностью.