Русский

Изучите мир сенсорных жестов и научитесь реализовывать их в своих проектах на JavaScript. Это руководство охватывает все, от базовых сенсорных событий до продвинутых техник распознавания жестов.

Сенсорные жесты: Полное руководство по реализации на JavaScript

В современном мире, ориентированном на мобильные устройства, сенсорные жесты стали неотъемлемой частью пользовательского опыта. От простых касаний до сложных взаимодействий несколькими пальцами, сенсорные жесты предоставляют пользователям естественный и интуитивно понятный способ взаимодействия с веб-приложениями. Это всеобъемлющее руководство исследует мир сенсорных жестов и предлагает пошаговый подход к их реализации в ваших проектах на JavaScript.

Понимание сенсорных событий

Прежде чем погружаться в распознавание жестов, крайне важно понять лежащие в их основе сенсорные события, которые обеспечивают эти взаимодействия. JavaScript предоставляет набор событий, которые срабатывают, когда пользователь касается экрана. Эти события предоставляют информацию о касании, такую как его местоположение и состояние.

Основные сенсорные события:

Каждое из этих событий содержит свойство `touches`, которое представляет собой список объектов `Touch`. Каждый объект `Touch` представляет одну точку контакта с экраном и содержит такую информацию, как:

Пример: Логирование координат касания

Этот простой пример демонстрирует, как логировать координаты точки касания, когда пользователь касается экрана:


 document.addEventListener('touchstart', function(event) {
  event.preventDefault(); // Предотвращает стандартное поведение браузера (например, прокрутку)
  let touch = event.touches[0];
  console.log('Касание началось в X: ' + touch.clientX + ', Y: ' + touch.clientY);
 });

Примечание: Метод `preventDefault()` часто используется для предотвращения выполнения браузером своего стандартного поведения при касании, такого как прокрутка или масштабирование.

Реализация основных жестов

Имея твердое понимание сенсорных событий, мы теперь можем реализовать основные жесты. Давайте рассмотрим такие примеры, как касание, смахивание и перетаскивание. Они будут объяснены путем определения того, что они собой представляют, а затем будут приведены примеры на JavaScript.

Жест касания (Tap)

Жест касания — это быстрое прикосновение и отпускание экрана. Для реализации жеста касания мы можем отслеживать события `touchstart` и `touchend` и измерять разницу во времени между ними. Если разница во времени ниже определенного порога (например, 200 миллисекунд), мы считаем это касанием.


 let tapStartTime = null;

 document.addEventListener('touchstart', function(event) {
  tapStartTime = new Date().getTime();
 });

 document.addEventListener('touchend', function(event) {
  let tapEndTime = new Date().getTime();
  let tapDuration = tapEndTime - tapStartTime;

  if (tapDuration < 200) {
   console.log('Обнаружено касание (Tap)!');
  }
 });

Жест смахивания (Swipe)

Жест смахивания — это быстрое направленное движение по экрану. Чтобы обнаружить смахивание, нам нужно отслеживать начальное и конечное положение касания и вычислять расстояние и направление движения. Нам также необходимо учитывать продолжительность смахивания.


 let swipeStartX = null;
 let swipeStartY = null;

 document.addEventListener('touchstart', function(event) {
  swipeStartX = event.touches[0].clientX;
  swipeStartY = event.touches[0].clientY;
 });

 document.addEventListener('touchend', function(event) {
  let swipeEndX = event.changedTouches[0].clientX;
  let swipeEndY = event.changedTouches[0].clientY;
  let deltaX = swipeEndX - swipeStartX;
  let deltaY = swipeEndY - swipeStartY;
  let swipeDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);

  if (swipeDistance > 50) { // При необходимости отрегулируйте порог
   let angle = Math.atan2(deltaY, deltaX) * 180 / Math.PI;

   if (angle > -45 && angle <= 45) {
    console.log('Смахивание вправо!');
   } else if (angle > 45 && angle <= 135) {
    console.log('Смахивание вниз!');
   } else if (angle > 135 || angle <= -135) {
    console.log('Смахивание влево!');
   } else {
    console.log('Смахивание вверх!');
   }
  }
 });

Жест перетаскивания (Drag)

Жест перетаскивания включает в себя касание элемента и его перемещение по экрану. Для реализации жеста перетаскивания нам нужно отслеживать событие touchmove и соответствующим образом обновлять положение элемента.


 let dragging = false;
 let offsetX, offsetY;
 let element = document.getElementById('draggableElement');

 element.addEventListener('touchstart', function(event) {
  dragging = true;
  offsetX = event.touches[0].clientX - element.offsetLeft;
  offsetY = event.touches[0].clientY - element.offsetTop;
 });

 document.addEventListener('touchmove', function(event) {
  if (dragging) {
   element.style.left = (event.touches[0].clientX - offsetX) + 'px';
   element.style.top = (event.touches[0].clientY - offsetY) + 'px';
  }
 });

 document.addEventListener('touchend', function(event) {
  dragging = false;
 });

Убедитесь, что в вашем HTML есть элемент с id "draggableElement":


 
Перетащи меня!

Мультитач-жесты

Мультитач-жесты предполагают использование нескольких пальцев для взаимодействия с экраном. Это позволяет создавать более сложные и выразительные взаимодействия, такие как масштабирование щипком и вращение.

Масштабирование щипком (Pinch-to-Zoom)

Масштабирование щипком — это распространенный жест, используемый для увеличения и уменьшения масштаба изображения или карты. Для реализации масштабирования щипком нам нужно отслеживать расстояние между двумя точками касания и соответствующим образом изменять масштаб элемента.


 let initialDistance = null;
 let currentScale = 1;
 let element = document.getElementById('zoomableImage');

 function getDistance(event) {
  let touch1 = event.touches[0];
  let touch2 = event.touches[1];
  let x = touch2.clientX - touch1.clientX;
  let y = touch2.clientY - touch1.clientY;
  return Math.sqrt(x * x + y * y);
 }

 element.addEventListener('touchstart', function(event) {
  if (event.touches.length === 2) {
   initialDistance = getDistance(event);
  }
 });

 element.addEventListener('touchmove', function(event) {
  if (event.touches.length === 2) {
   event.preventDefault();
   let currentDistance = getDistance(event);
   let scaleFactor = currentDistance / initialDistance;
   currentScale *= scaleFactor; // Накапливаем масштабирование
   element.style.transform = 'scale(' + currentScale + ')';
   initialDistance = currentDistance; // Сбрасываем для следующего движения
  }
 });

 element.addEventListener('touchend', function(event) {
  initialDistance = null;
 });

Убедитесь, что в вашем HTML есть изображение с id "zoomableImage":


 

Вращение

Вращение включает в себя поворот элемента с помощью двух пальцев. Для реализации вращения нам нужно отслеживать угол между двумя точками касания и соответствующим образом вращать элемент.


 let initialAngle = null;
 let currentRotation = 0;
 let element = document.getElementById('rotatableImage');

 function getAngle(event) {
  let touch1 = event.touches[0];
  let touch2 = event.touches[1];
  return Math.atan2(touch2.clientY - touch1.clientY, touch2.clientX - touch1.clientX) * 180 / Math.PI;
 }

 element.addEventListener('touchstart', function(event) {
  if (event.touches.length === 2) {
   initialAngle = getAngle(event);
  }
 });

 element.addEventListener('touchmove', function(event) {
  if (event.touches.length === 2) {
   event.preventDefault();
   let currentAngle = getAngle(event);
   let rotation = currentAngle - initialAngle;
   currentRotation += rotation; // Накапливаем вращение
   element.style.transform = 'rotate(' + currentRotation + 'deg)';
   initialAngle = currentAngle; // Сбрасываем для следующего движения
  }
 });

 element.addEventListener('touchend', function(event) {
  initialAngle = null;
 });

Убедитесь, что в вашем HTML есть изображение с id "rotatableImage":


 

Библиотеки для распознавания жестов

Реализация сложных жестов с нуля может быть сложной и трудоемкой. К счастью, несколько библиотек JavaScript могут упростить процесс распознавания жестов. Эти библиотеки предоставляют готовые распознаватели жестов и утилиты для обработки сенсорных событий.

Hammer.js

Hammer.js — это популярная библиотека JavaScript для распознавания жестов. Она поддерживает широкий спектр жестов, включая касание, двойное касание, смахивание, щипок, вращение и панорамирование. Она легкая, проста в использовании и легко настраивается. Hammer.js работает, прослушивая сенсорные события, а затем определяя, какое действие выполняет пользователь, на основе местоположения и продолжительности точек касания.


 // Подключите Hammer.js в вашем HTML
 // 

 let element = document.getElementById('myElement');
 let hammer = new Hammer(element);

 hammer.on('tap', function(event) {
  console.log('Обнаружено событие tap');
 });

 hammer.on('swipe', function(event) {
  console.log('Обнаружено событие swipe');
  console.log('Направление смахивания: ' + event.direction);
 });

 hammer.get('pinch').set({ enable: true });
 hammer.get('rotate').set({ enable: true });

 hammer.on('pinch', function(event) {
  console.log('Обнаружено событие pinch');
  element.style.transform = 'scale(' + event.scale + ')';
 });

 hammer.on('rotate', function(event) {
  console.log('Обнаружено событие rotate');
  element.style.transform = 'rotate(' + event.rotation + 'deg)';
 });

AlloyFinger

AlloyFinger — еще одна популярная библиотека JavaScript, специализирующаяся на распознавании жестов, особенно для мобильных устройств. Она известна своим небольшим размером и хорошей производительностью. Она фокусируется на общих сенсорных жестах, таких как касание, смахивание, щипок, вращение и нажатие. Она предоставляет простой в использовании API для привязки жестов к элементам.


 // Подключите AlloyFinger в вашем HTML
 //  // Замените на ваш путь к AlloyFinger

 let element = document.getElementById('myElement');
 let af = new AlloyFinger(element, {
  tap: function() {
   console.log('Обнаружено событие tap');
  },
  swipe: function(evt) {
   console.log('Обнаружено событие swipe');
   console.log('Направление смахивания: ' + evt.direction); // up, down, left, right
  },
  pinch: function(evt) {
   console.log('Обнаружено событие pinch');
   element.style.transform = 'scale(' + evt.scale + ')';
  },
  rotate: function(evt) {
   console.log('Обнаружено событие rotate');
   element.style.transform = 'rotate(' + evt.angle + 'deg)';
  }
 });

Вопросы доступности

При реализации сенсорных жестов важно учитывать доступность для пользователей с ограниченными возможностями. Некоторые пользователи могут быть не в состоянии использовать сенсорные жесты из-за двигательных нарушений. Предоставление альтернативных методов ввода, таких как управление с клавиатуры или голосовые команды, гарантирует, что ваше приложение будет доступно для более широкой аудитории.

Оптимизация производительности

Сенсорные события могут быть вычислительно затратными, особенно при обработке сложных жестов. Оптимизация вашего кода для производительности имеет решающее значение для обеспечения плавного и отзывчивого пользовательского опыта.

Кросс-браузерная совместимость

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

Вопросы интернационализации (i18n)

При реализации сенсорных жестов не забывайте учитывать интернационализацию (i18n). Хотя сами сенсорные взаимодействия в целом не зависят от языка, окружающие элементы пользовательского интерфейса и механизмы обратной связи должны быть локализованы для разных языков и регионов.

Глобальные примеры и соображения

Давайте рассмотрим, как сенсорные жесты могут применяться по-разному в различных глобальных контекстах:

Заключение

Сенсорные жесты — это мощный инструмент для создания увлекательного и интуитивно понятного пользовательского опыта. Понимая лежащие в их основе сенсорные события и используя соответствующие техники распознавания жестов, вы можете реализовать широкий спектр жестов в своих проектах на JavaScript. Не забывайте учитывать доступность, производительность и кросс-браузерную совместимость, чтобы ваше приложение хорошо работало для всех пользователей. По мере развития технологий ожидайте появления новых типов жестов и взаимодействий, продолжайте учиться, чтобы оставаться на переднем крае цифрового опыта.