Română

Explorați gesturile tactile și învățați implementarea lor în JavaScript. Ghidul acoperă evenimente de bază și tehnici avansate de recunoaștere a gesturilor.

Gesturi tactile: Un ghid complet pentru implementarea în JavaScript

În lumea de astăzi, orientată spre mobil, gesturile tactile au devenit o parte integrantă a experienței utilizatorului. De la simple atingeri la interacțiuni complexe cu mai multe degete, gesturile tactile oferă o modalitate naturală și intuitivă pentru utilizatori de a interacționa cu aplicațiile web. Acest ghid cuprinzător explorează lumea gesturilor tactile și oferă o abordare pas cu pas pentru implementarea acestora în proiectele dvs. JavaScript.

Înțelegerea evenimentelor tactile

Înainte de a ne aprofunda în recunoașterea gesturilor, este crucial să înțelegem evenimentele tactile subiacente care stau la baza acestor interacțiuni. JavaScript oferă un set de evenimente care se declanșează atunci când un utilizator atinge ecranul. Aceste evenimente furnizează informații despre atingere, cum ar fi locația și starea acesteia.

Evenimente tactile de bază:

Fiecare dintre aceste evenimente conține o proprietate `touches`, care este o listă de obiecte `Touch`. Fiecare obiect `Touch` reprezintă un singur punct de contact pe ecran și conține informații precum:

Exemplu: Înregistrarea coordonatelor tactile

Acest exemplu simplu demonstrează cum se înregistrează coordonatele unui punct de atingere atunci când utilizatorul atinge ecranul:


 document.addEventListener('touchstart', function(event) {
  event.preventDefault(); // Previne comportamentul implicit al browserului (de ex., derularea)
  let touch = event.touches[0];
  console.log('Atingere începută la X: ' + touch.clientX + ', Y: ' + touch.clientY);
 });

Notă: Metoda `preventDefault()` este adesea folosită pentru a împiedica browserul să execute comportamentul său tactil implicit, cum ar fi derularea sau zoom-ul.

Implementarea gesturilor de bază

Cu o înțelegere solidă a evenimentelor tactile, putem acum implementa gesturi de bază. Să analizăm exemple precum atingerea rapidă (tap), glisarea (swipe) și tragerea (drag). Acestea vor fi explicate prin definirea lor inițială, urmată de exemple JavaScript.

Gest de atingere rapidă (Tap)

Un gest de atingere rapidă este o atingere și eliberare rapidă pe ecran. Pentru a implementa un gest de atingere rapidă, putem urmări evenimentele `touchstart` și `touchend` și măsura diferența de timp dintre ele. Dacă diferența de timp este sub un anumit prag (de ex., 200 de milisecunde), o considerăm o atingere rapidă.


 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('Atingere rapidă detectată!');
  }
 });

Gest de glisare (Swipe)

Un gest de glisare este o mișcare rapidă, direcțională pe ecran. Pentru a detecta o glisare, trebuie să urmărim pozițiile de început și de sfârșit ale atingerii și să calculăm distanța și direcția mișcării. De asemenea, trebuie să luăm în considerare durata glisării.


 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) { // Ajustați pragul după necesități
   let angle = Math.atan2(deltaY, deltaX) * 180 / Math.PI;

   if (angle > -45 && angle <= 45) {
    console.log('Glisare la dreapta!');
   } else if (angle > 45 && angle <= 135) {
    console.log('Glisare în jos!');
   } else if (angle > 135 || angle <= -135) {
    console.log('Glisare la stânga!');
   } else {
    console.log('Glisare în sus!');
   }
  }
 });

Gest de tragere (Drag)

Un gest de tragere implică atingerea unui element și deplasarea acestuia pe ecran. Pentru a implementa un gest de tragere, trebuie să urmărim evenimentul touchmove și să actualizăm poziția elementului în consecință.


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

Asigurați-vă că aveți un element cu id-ul "draggableElement" în HTML-ul dvs.:


 
Trage-mă!

Gesturi Multi-Touch

Gesturile multi-touch implică utilizarea mai multor degete pentru a interacționa cu ecranul. Acest lucru permite interacțiuni mai complexe și mai expresive, cum ar fi ciupirea pentru zoom (pinch-to-zoom) și rotația.

Pinch-to-Zoom (Ciupire pentru zoom)

Ciupirea pentru zoom este un gest comun folosit pentru a mări și micșora o imagine sau o hartă. Pentru a implementa acest gest, trebuie să urmărim distanța dintre două puncte de atingere și să ajustăm scara elementului în consecință.


 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; // Acumulează scalarea
   element.style.transform = 'scale(' + currentScale + ')';
   initialDistance = currentDistance; // Resetează pentru următoarea mișcare
  }
 });

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

Asigurați-vă că aveți o imagine cu id-ul "zoomableImage" în HTML-ul dvs.:


 

Rotație

Rotația implică rotirea unui element folosind două degete. Pentru a implementa rotația, trebuie să urmărim unghiul dintre două puncte de atingere și să rotim elementul în consecință.


 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; // Acumulează rotația
   element.style.transform = 'rotate(' + currentRotation + 'deg)';
   initialAngle = currentAngle; // Resetează pentru următoarea mișcare
  }
 });

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

Asigurați-vă că aveți o imagine cu id-ul "rotatableImage" în HTML-ul dvs.:


 

Biblioteci pentru recunoașterea gesturilor

Implementarea gesturilor complexe de la zero poate fi dificilă și consumatoare de timp. Din fericire, mai multe biblioteci JavaScript pot simplifica procesul de recunoaștere a gesturilor. Aceste biblioteci oferă recunoaștere pre-construită a gesturilor și utilități pentru gestionarea evenimentelor tactile.

Hammer.js

Hammer.js este o bibliotecă JavaScript populară pentru recunoașterea gesturilor. Suportă o gamă largă de gesturi, inclusiv tap, double-tap, swipe, pinch, rotate și pan. Este ușoară, simplu de utilizat și foarte personalizabilă. Hammer.js funcționează prin ascultarea evenimentelor tactile și apoi determinarea acțiunii pe care o efectuează utilizatorul pe baza locației și duratei punctelor de atingere.


 // Includeți Hammer.js în HTML-ul dvs.
 // 

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

 hammer.on('tap', function(event) {
  console.log('Eveniment de tap detectat');
 });

 hammer.on('swipe', function(event) {
  console.log('Eveniment de swipe detectat');
  console.log('Direcția swipe: ' + event.direction);
 });

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

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

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

AlloyFinger

AlloyFinger este o altă bibliotecă JavaScript populară specializată în recunoașterea gesturilor, în special pentru dispozitivele mobile. Este cunoscută pentru dimensiunea sa redusă și performanța bună. Se concentrează pe gesturi tactile comune precum tap, swipe, pinch, rotate și press. Oferă un API ușor de utilizat pentru legarea gesturilor de elemente.


 // Includeți AlloyFinger în HTML-ul dvs.
 //  // Înlocuiți cu calea către AlloyFinger

 let element = document.getElementById('myElement');
 let af = new AlloyFinger(element, {
  tap: function() {
   console.log('Eveniment de tap detectat');
  },
  swipe: function(evt) {
   console.log('Eveniment de swipe detectat');
   console.log('Direcția swipe: ' + evt.direction); // up, down, left, right
  },
  pinch: function(evt) {
   console.log('Eveniment de pinch detectat');
   element.style.transform = 'scale(' + evt.scale + ')';
  },
  rotate: function(evt) {
   console.log('Eveniment de rotate detectat');
   element.style.transform = 'rotate(' + evt.angle + 'deg)';
  }
 });

Considerații privind accesibilitatea

Atunci când implementați gesturi tactile, este esențial să luați în considerare accesibilitatea pentru utilizatorii cu dizabilități. Unii utilizatori s-ar putea să nu poată folosi gesturi tactile din cauza deficiențelor motorii. Furnizarea de metode alternative de introducere, cum ar fi controalele de la tastatură sau comenzile vocale, asigură că aplicația dvs. este accesibilă unui public mai larg.

Optimizarea performanței

Evenimentele tactile pot fi costisitoare din punct de vedere computațional, în special la gestionarea gesturilor complexe. Optimizarea codului pentru performanță este crucială pentru a asigura o experiență de utilizator fluidă și receptivă.

Compatibilitate între browsere

Suportul pentru evenimentele tactile variază între diferite browsere și dispozitive. Este crucial să vă testați codul pe o varietate de browsere și dispozitive pentru a asigura compatibilitatea între browsere. Luați în considerare utilizarea de polyfill-uri sau biblioteci care abstractizează diferențele dintre browsere.

Considerații privind internaționalizarea (i18n)

La implementarea gesturilor tactile, nu uitați să luați în considerare internaționalizarea (i18n). Deși interacțiunile tactile în sine sunt în general agnostice din punct de vedere lingvistic, elementele UI înconjurătoare și mecanismele de feedback ar trebui localizate pentru diferite limbi și regiuni.

Exemple și considerații globale

Să luăm în considerare modul în care gesturile tactile ar putea fi aplicate diferit în diverse contexte globale:

Concluzie

Gesturile tactile sunt un instrument puternic pentru crearea de experiențe de utilizator captivante și intuitive. Înțelegând evenimentele tactile subiacente și utilizând tehnici adecvate de recunoaștere a gesturilor, puteți implementa o gamă largă de gesturi în proiectele dvs. JavaScript. Nu uitați să luați în considerare accesibilitatea, performanța și compatibilitatea între browsere pentru a vă asigura că aplicația dvs. funcționează bine pentru toți utilizatorii. Pe măsură ce tehnologia avansează, așteptați-vă să vedeți noi tipuri de gesturi și interacțiuni, continuați să învățați pentru a rămâne în fruntea experiențelor digitale.