Hrvatski

Istražite svijet gesta dodirom i naučite kako ih implementirati u svoje JavaScript projekte. Ovaj vodič pokriva sve, od osnovnih događaja dodirom do naprednih tehnika prepoznavanja gesta.

Geste dodirom: Sveobuhvatan vodič za implementaciju u JavaScriptu

U današnjem svijetu usmjerenom na mobilne uređaje, geste dodirom postale su sastavni dio korisničkog iskustva. Od jednostavnih dodira do složenih interakcija s više prstiju, geste dodirom pružaju prirodan i intuitivan način interakcije korisnika s web aplikacijama. Ovaj sveobuhvatni vodič istražuje svijet gesta dodirom i pruža korak-po-korak pristup njihovoj implementaciji u vašim JavaScript projektima.

Razumijevanje događaja dodirom

Prije nego što uronimo u prepoznavanje gesta, ključno je razumjeti temeljne događaje dodirom koji pokreću te interakcije. JavaScript pruža skup događaja koji se aktiviraju kada korisnik dodirne zaslon. Ti događaji pružaju informacije o dodiru, kao što su njegova lokacija i stanje.

Osnovni događaji dodirom:

Svaki od ovih događaja sadrži svojstvo `touches`, koje je lista `Touch` objekata. Svaki `Touch` objekt predstavlja jednu točku kontakta na zaslonu i sadrži informacije kao što su:

Primjer: Bilježenje koordinata dodira

Ovaj jednostavan primjer pokazuje kako zabilježiti koordinate točke dodira kada korisnik dodirne zaslon:


 document.addEventListener('touchstart', function(event) {
  event.preventDefault(); // Sprječava zadano ponašanje preglednika (npr. pomicanje)
  let touch = event.touches[0];
  console.log('Dodir je započeo na X: ' + touch.clientX + ', Y: ' + touch.clientY);
 });

Napomena: Metoda `preventDefault()` se često koristi kako bi se spriječilo da preglednik izvrši svoje zadano ponašanje na dodir, kao što je pomicanje ili zumiranje.

Implementacija osnovnih gesta

S dobrim razumijevanjem događaja dodirom, sada možemo implementirati osnovne geste. Pogledajmo primjere kao što su dodir (tap), povlačenje (swipe) i povlačenje i ispuštanje (drag). Objasnit ćemo ih tako što ćemo prvo definirati što su, a zatim pružiti primjere u JavaScriptu.

Gesta dodira (Tap)

Gesta dodira (tap) je brzi dodir i otpuštanje na zaslonu. Da bismo implementirali gestu dodira, možemo pratiti događaje `touchstart` i `touchend` te mjeriti vremensku razliku između njih. Ako je vremenska razlika ispod određenog praga (npr. 200 milisekundi), smatramo to dodirom.


 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('Dodir detektiran!');
  }
 });

Gesta povlačenja (Swipe)

Gesta povlačenja (swipe) je brzi, usmjereni pokret preko zaslona. Da bismo detektirali povlačenje, moramo pratiti početne i završne položaje dodira te izračunati udaljenost i smjer pokreta. Također moramo uzeti u obzir trajanje povlačenja.


 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) { // Prilagodite prag prema potrebi
   let angle = Math.atan2(deltaY, deltaX) * 180 / Math.PI;

   if (angle > -45 && angle <= 45) {
    console.log('Povlačenje udesno!');
   } else if (angle > 45 && angle <= 135) {
    console.log('Povlačenje prema dolje!');
   } else if (angle > 135 || angle <= -135) {
    console.log('Povlačenje ulijevo!');
   } else {
    console.log('Povlačenje prema gore!');
   }
  }
 });

Gesta povlačenja i ispuštanja (Drag)

Gesta povlačenja i ispuštanja uključuje dodirivanje elementa i njegovo pomicanje po zaslonu. Za implementaciju ove geste, moramo pratiti događaj `touchmove` i sukladno tome ažurirati položaj elementa.


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

Provjerite imate li u svom HTML-u element s ID-jem "draggableElement":


 
Povuci me!

Višedodirne geste

Višedodirne geste uključuju korištenje više prstiju za interakciju sa zaslonom. To omogućuje složenije i izražajnije interakcije, kao što su zumiranje prstima (pinch-to-zoom) i rotacija.

Zumiranje prstima (Pinch-to-Zoom)

Zumiranje prstima je uobičajena gesta koja se koristi za povećavanje i smanjivanje slike ili karte. Za implementaciju zumiranja prstima, moramo pratiti udaljenost između dvije točke dodira i sukladno tome prilagoditi mjerilo (scale) elementa.


 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; // Akumuliraj skaliranje
   element.style.transform = 'scale(' + currentScale + ')';
   initialDistance = currentDistance; // Resetiraj za sljedeći pokret
  }
 });

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

Provjerite imate li u svom HTML-u sliku s ID-jem "zoomableImage":


 

Rotacija

Rotacija uključuje rotiranje elementa pomoću dva prsta. Za implementaciju rotacije, moramo pratiti kut između dvije točke dodira i sukladno tome rotirati 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; // Akumuliraj rotaciju
   element.style.transform = 'rotate(' + currentRotation + 'deg)';
   initialAngle = currentAngle; // Resetiraj za sljedeći pokret
  }
 });

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

Provjerite imate li u svom HTML-u sliku s ID-jem "rotatableImage":


 

Biblioteke za prepoznavanje gesta

Implementacija složenih gesta od nule može biti izazovna i dugotrajna. Srećom, postoji nekoliko JavaScript biblioteka koje mogu pojednostaviti proces prepoznavanja gesta. Ove biblioteke pružaju unaprijed izgrađene prepoznavače gesta i uslužne programe za rukovanje događajima dodirom.

Hammer.js

Hammer.js je popularna JavaScript biblioteka za prepoznavanje gesta. Podržava širok raspon gesta, uključujući dodir (tap), dvostruki dodir (double-tap), povlačenje (swipe), zumiranje prstima (pinch), rotaciju (rotate) i pomicanje (pan). Lagana je, jednostavna za korištenje i vrlo prilagodljiva. Hammer.js radi tako što sluša događaje dodirom i zatim određuje koju radnju korisnik izvodi na temelju lokacije i trajanja točaka dodira.


 // Uključite Hammer.js u svoj HTML
 // 

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

 hammer.on('tap', function(event) {
  console.log('Događaj dodira detektiran');
 });

 hammer.on('swipe', function(event) {
  console.log('Događaj povlačenja detektiran');
  console.log('Smjer povlačenja: ' + event.direction);
 });

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

 hammer.on('pinch', function(event) {
  console.log('Događaj zumiranja prstima detektiran');
  element.style.transform = 'scale(' + event.scale + ')';
 });

 hammer.on('rotate', function(event) {
  console.log('Događaj rotacije detektiran');
  element.style.transform = 'rotate(' + event.rotation + 'deg)';
 });

AlloyFinger

AlloyFinger je još jedna popularna JavaScript biblioteka specijalizirana za prepoznavanje gesta, posebno za mobilne uređaje. Poznata je po svojoj maloj veličini i dobrim performansama. Fokusira se na uobičajene geste dodirom kao što su dodir (tap), povlačenje (swipe), zumiranje prstima (pinch), rotacija (rotate) i pritisak (press). Pruža API jednostavan za korištenje za povezivanje gesta s elementima.


 // Uključite AlloyFinger u svoj HTML
 //  // Zamijenite putanjom do vašeg AlloyFinger-a

 let element = document.getElementById('myElement');
 let af = new AlloyFinger(element, {
  tap: function() {
   console.log('Događaj dodira detektiran');
  },
  swipe: function(evt) {
   console.log('Događaj povlačenja detektiran');
   console.log('Smjer povlačenja: ' + evt.direction); // up, down, left, right
  },
  pinch: function(evt) {
   console.log('Događaj zumiranja prstima detektiran');
   element.style.transform = 'scale(' + evt.scale + ')';
  },
  rotate: function(evt) {
   console.log('Događaj rotacije detektiran');
   element.style.transform = 'rotate(' + evt.angle + 'deg)';
  }
 });

Razmatranja o pristupačnosti

Pri implementaciji gesta dodirom, ključno je uzeti u obzir pristupačnost za korisnike s invaliditetom. Neki korisnici možda neće moći koristiti geste dodirom zbog motoričkih oštećenja. Pružanje alternativnih metoda unosa, kao što su kontrole tipkovnicom ili glasovne naredbe, osigurava da je vaša aplikacija dostupna široj publici.

Optimizacija performansi

Događaji dodirom mogu biti računalno zahtjevni, posebno pri rukovanju složenim gestama. Optimizacija vašeg koda za performanse ključna je za osiguravanje glatkog i responzivnog korisničkog iskustva.

Kompatibilnost s različitim preglednicima

Podrška za događaje dodirom razlikuje se među različitim preglednicima i uređajima. Ključno je testirati svoj kod na raznim preglednicima i uređajima kako bi se osigurala kompatibilnost. Razmislite o korištenju polyfill-ova ili biblioteka koje apstrahiraju razlike među preglednicima.

Razmatranja o internacionalizaciji (i18n)

Pri implementaciji gesta dodirom, ne zaboravite uzeti u obzir internacionalizaciju (i18n). Iako su same interakcije dodirom uglavnom neovisne o jeziku, okolni elementi korisničkog sučelja i mehanizmi povratnih informacija trebaju biti lokalizirani za različite jezike i regije.

Globalni primjeri i razmatranja

Razmotrimo kako bi se geste dodirom mogle različito primjenjivati u različitim globalnim kontekstima:

Zaključak

Geste dodirom moćan su alat za stvaranje privlačnih i intuitivnih korisničkih iskustava. Razumijevanjem temeljnih događaja dodirom i korištenjem odgovarajućih tehnika prepoznavanja gesta, možete implementirati širok raspon gesta u svoje JavaScript projekte. Ne zaboravite uzeti u obzir pristupačnost, performanse i kompatibilnost s različitim preglednicima kako biste osigurali da vaša aplikacija dobro radi za sve korisnike. Kako tehnologija napreduje, očekujte nove vrste gesta i interakcija; nastavite učiti kako biste ostali na čelu digitalnih iskustava.