Polski

Odkryj świat gestów dotykowych i naucz się implementować je w swoich projektach JavaScript. Ten przewodnik omawia wszystko, od zdarzeń dotykowych po zaawansowane techniki rozpoznawania gestów.

Gesty dotykowe: Kompleksowy przewodnik po implementacji w JavaScript

W dzisiejszym świecie zdominowanym przez urządzenia mobilne, gesty dotykowe stały się integralną częścią doświadczenia użytkownika. Od prostych stuknięć po złożone interakcje wieloma palcami, gesty dotykowe zapewniają naturalny i intuicyjny sposób interakcji z aplikacjami internetowymi. Ten kompleksowy przewodnik zgłębia świat gestów dotykowych i przedstawia krok po kroku, jak zaimplementować je w swoich projektach JavaScript.

Zrozumienie zdarzeń dotykowych

Zanim zagłębimy się w rozpoznawanie gestów, kluczowe jest zrozumienie podstawowych zdarzeń dotykowych, które napędzają te interakcje. JavaScript dostarcza zestaw zdarzeń, które są wywoływane, gdy użytkownik dotyka ekranu. Zdarzenia te dostarczają informacji o dotyku, takich jak jego lokalizacja i stan.

Podstawowe zdarzenia dotykowe:

Każde z tych zdarzeń zawiera właściwość `touches`, która jest listą obiektów `Touch`. Każdy obiekt `Touch` reprezentuje pojedynczy punkt kontaktu z ekranem i zawiera takie informacje jak:

Przykład: Rejestrowanie współrzędnych dotyku

Ten prosty przykład pokazuje, jak zarejestrować współrzędne punktu dotyku, gdy użytkownik dotknie ekranu:


 document.addEventListener('touchstart', function(event) {
  event.preventDefault(); // Zapobiega domyślnemu zachowaniu przeglądarki (np. przewijaniu)
  let touch = event.touches[0];
  console.log('Dotknięcie rozpoczęte w X: ' + touch.clientX + ', Y: ' + touch.clientY);
 });

Uwaga: Metoda `preventDefault()` jest często używana, aby zapobiec domyślnemu zachowaniu przeglądarki w odpowiedzi na dotyk, takiemu jak przewijanie czy powiększanie.

Implementacja podstawowych gestów

Mając solidne podstawy wiedzy o zdarzeniach dotykowych, możemy teraz zaimplementować podstawowe gesty. Przyjrzyjmy się przykładom takim jak stuknięcie, przesunięcie i przeciąganie. Zostaną one wyjaśnione poprzez zdefiniowanie ich, a następnie przedstawienie przykładów w JavaScript.

Gest stuknięcia (Tap)

Gest stuknięcia to szybkie dotknięcie i zwolnienie ekranu. Aby zaimplementować gest stuknięcia, możemy śledzić zdarzenia `touchstart` i `touchend` oraz mierzyć różnicę czasu między nimi. Jeśli różnica czasu jest poniżej określonego progu (np. 200 milisekund), uznajemy to za stuknięcie.


 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('Wykryto stuknięcie!');
  }
 });

Gest przesunięcia (Swipe)

Gest przesunięcia to szybki, kierunkowy ruch po ekranie. Aby wykryć przesunięcie, musimy śledzić początkową i końcową pozycję dotyku oraz obliczyć odległość i kierunek ruchu. Musimy również wziąć pod uwagę czas trwania przesunięcia.


 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) { // Dostosuj próg w razie potrzeby
   let angle = Math.atan2(deltaY, deltaX) * 180 / Math.PI;

   if (angle > -45 && angle <= 45) {
    console.log('Przesunięcie w prawo!');
   } else if (angle > 45 && angle <= 135) {
    console.log('Przesunięcie w dół!');
   } else if (angle > 135 || angle <= -135) {
    console.log('Przesunięcie w lewo!');
   } else {
    console.log('Przesunięcie w górę!');
   }
  }
 });

Gest przeciągnięcia (Drag)

Gest przeciągnięcia polega na dotknięciu elementu i przesunięciu go po ekranie. Aby zaimplementować gest przeciągnięcia, musimy śledzić zdarzenie touchmove i odpowiednio aktualizować pozycję elementu.


 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;
 });

Upewnij się, że w swoim kodzie HTML masz element o id "draggableElement":


 
Przeciągnij mnie!

Gesty wielodotykowe

Gesty wielodotykowe polegają na użyciu wielu palców do interakcji z ekranem. Pozwala to na bardziej złożone i ekspresyjne interakcje, takie jak szczypanie w celu powiększenia (pinch-to-zoom) i obracanie.

Szczypanie w celu powiększenia (Pinch-to-Zoom)

Szczypanie w celu powiększenia to popularny gest używany do przybliżania i oddalania obrazu lub mapy. Aby zaimplementować ten gest, musimy śledzić odległość między dwoma punktami dotyku i odpowiednio dostosowywać skalę elementu.


 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; // Akumuluj skalowanie
   element.style.transform = 'scale(' + currentScale + ')';
   initialDistance = currentDistance; // Zresetuj dla następnego ruchu
  }
 });

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

Upewnij się, że w swoim kodzie HTML masz obraz o id "zoomableImage":


 

Obrót (Rotation)

Obrót polega na obracaniu elementu za pomocą dwóch palców. Aby zaimplementować obrót, musimy śledzić kąt między dwoma punktami dotyku i odpowiednio obracać element.


 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; // Akumuluj obrót
   element.style.transform = 'rotate(' + currentRotation + 'deg)';
   initialAngle = currentAngle; // Zresetuj dla następnego ruchu
  }
 });

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

Upewnij się, że w swoim kodzie HTML masz obraz o id "rotatableImage":


 

Biblioteki do rozpoznawania gestów

Implementacja złożonych gestów od zera może być trudna i czasochłonna. Na szczęście istnieje kilka bibliotek JavaScript, które mogą uprościć proces rozpoznawania gestów. Biblioteki te dostarczają gotowe mechanizmy do rozpoznawania gestów oraz narzędzia do obsługi zdarzeń dotykowych.

Hammer.js

Hammer.js to popularna biblioteka JavaScript do rozpoznawania gestów. Obsługuje szeroki zakres gestów, w tym stuknięcie, podwójne stuknięcie, przesunięcie, szczypanie, obrót i panoramowanie. Jest lekka, łatwa w użyciu i wysoce konfigurowalna. Hammer.js działa poprzez nasłuchiwanie na zdarzenia dotykowe, a następnie określanie, jaką akcję wykonuje użytkownik na podstawie lokalizacji i czasu trwania punktów dotyku.


 // Dołącz Hammer.js w swoim HTML
 // 

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

 hammer.on('tap', function(event) {
  console.log('Wykryto zdarzenie tap');
 });

 hammer.on('swipe', function(event) {
  console.log('Wykryto zdarzenie swipe');
  console.log('Kierunek przesunięcia: ' + event.direction);
 });

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

 hammer.on('pinch', function(event) {
  console.log('Wykryto zdarzenie pinch');
  element.style.transform = 'scale(' + event.scale + ')';
 });

 hammer.on('rotate', function(event) {
  console.log('Wykryto zdarzenie rotate');
  element.style.transform = 'rotate(' + event.rotation + 'deg)';
 });

AlloyFinger

AlloyFinger to kolejna popularna biblioteka JavaScript specjalizująca się w rozpoznawaniu gestów, szczególnie na urządzeniach mobilnych. Jest znana z niewielkiego rozmiaru i dobrej wydajności. Skupia się na popularnych gestach dotykowych, takich jak stuknięcie, przesunięcie, szczypanie, obrót i naciśnięcie. Dostarcza łatwy w użyciu interfejs API do przypisywania gestów do elementów.


 // Dołącz AlloyFinger w swoim HTML
 //  // Zastąp ścieżką do swojego pliku AlloyFinger

 let element = document.getElementById('myElement');
 let af = new AlloyFinger(element, {
  tap: function() {
   console.log('Wykryto zdarzenie tap');
  },
  swipe: function(evt) {
   console.log('Wykryto zdarzenie swipe');
   console.log('Kierunek przesunięcia: ' + evt.direction); // góra, dół, lewo, prawo
  },
  pinch: function(evt) {
   console.log('Wykryto zdarzenie pinch');
   element.style.transform = 'scale(' + evt.scale + ')';
  },
  rotate: function(evt) {
   console.log('Wykryto zdarzenie rotate');
   element.style.transform = 'rotate(' + evt.angle + 'deg)';
  }
 });

Kwestie dostępności

Podczas implementacji gestów dotykowych niezbędne jest uwzględnienie dostępności dla użytkowników z niepełnosprawnościami. Niektórzy użytkownicy mogą nie być w stanie używać gestów dotykowych z powodu ograniczeń motorycznych. Zapewnienie alternatywnych metod wprowadzania, takich jak sterowanie klawiaturą czy komendy głosowe, gwarantuje, że aplikacja będzie dostępna dla szerszego grona odbiorców.

Optymalizacja wydajności

Zdarzenia dotykowe mogą być kosztowne obliczeniowo, zwłaszcza przy obsłudze złożonych gestów. Optymalizacja kodu pod kątem wydajności jest kluczowa, aby zapewnić płynne i responsywne doświadczenie użytkownika.

Zgodność z różnymi przeglądarkami

Wsparcie dla zdarzeń dotykowych różni się w zależności od przeglądarki i urządzenia. Kluczowe jest testowanie kodu na różnych przeglądarkach i urządzeniach, aby zapewnić zgodność między nimi. Rozważ użycie polyfilli lub bibliotek, które abstrahują różnice między przeglądarkami.

Kwestie internacjonalizacji (i18n)

Implementując gesty dotykowe, pamiętaj o uwzględnieniu internacjonalizacji (i18n). Chociaż same interakcje dotykowe są na ogół niezależne od języka, otaczające je elementy interfejsu użytkownika i mechanizmy informacji zwrotnej powinny być zlokalizowane dla różnych języków i regionów.

Globalne przykłady i uwarunkowania

Rozważmy, jak gesty dotykowe mogą być stosowane inaczej w różnych kontekstach globalnych:

Podsumowanie

Gesty dotykowe to potężne narzędzie do tworzenia angażujących i intuicyjnych doświadczeń użytkownika. Dzięki zrozumieniu podstawowych zdarzeń dotykowych i stosowaniu odpowiednich technik rozpoznawania gestów, możesz zaimplementować szeroki zakres gestów w swoich projektach JavaScript. Pamiętaj o uwzględnieniu dostępności, wydajności i zgodności z różnymi przeglądarkami, aby zapewnić, że Twoja aplikacja działa dobrze dla wszystkich użytkowników. W miarę postępu technologii można spodziewać się nowych rodzajów gestów i interakcji; kontynuuj naukę, aby pozostać w czołówce cyfrowych doświadczeń.

Gesty dotykowe: Kompleksowy przewodnik po implementacji w JavaScript | MLOG