Slovenščina

Raziščite svet gest na dotik in se naučite, kako jih implementirati v svoje projekte JavaScript. Ta vodnik zajema vse od osnovnih dogodkov na dotik do naprednih tehnik prepoznavanja gest.

Geste na dotik: Celovit vodnik za implementacijo v JavaScriptu

V današnjem svetu, kjer so mobilne naprave na prvem mestu, so geste na dotik postale sestavni del uporabniške izkušnje. Od preprostih tapov do zapletenih interakcij z več prsti, geste na dotik uporabnikom omogočajo naraven in intuitiven način interakcije s spletnimi aplikacijami. Ta celovit vodnik raziskuje svet gest na dotik in ponuja postopen pristop k njihovi implementaciji v vaših projektih JavaScript.

Razumevanje dogodkov na dotik

Preden se poglobimo v prepoznavanje gest, je ključnega pomena razumeti osnovne dogodke na dotik, ki poganjajo te interakcije. JavaScript ponuja nabor dogodkov, ki se sprožijo, ko se uporabnik dotakne zaslona. Ti dogodki zagotavljajo informacije o dotiku, kot sta njegova lokacija in stanje.

Osnovni dogodki na dotik:

Vsak od teh dogodkov vsebuje lastnost `touches`, ki je seznam objektov `Touch`. Vsak objekt `Touch` predstavlja eno samo točko stika na zaslonu in vsebuje informacije, kot so:

Primer: Beleženje koordinat dotika

Ta preprost primer prikazuje, kako beležiti koordinate točke dotika, ko se uporabnik dotakne zaslona:


 document.addEventListener('touchstart', function(event) {
  event.preventDefault(); // Prepreči privzeto obnašanje brskalnika (npr. drsenje)
  let touch = event.touches[0];
  console.log('Dotik se je začel pri X: ' + touch.clientX + ', Y: ' + touch.clientY);
 });

Opomba: Metoda `preventDefault()` se pogosto uporablja za preprečevanje privzetega obnašanja brskalnika ob dotiku, kot sta drsenje ali povečevanje.

Implementacija osnovnih gest

Z dobrim razumevanjem dogodkov na dotik lahko sedaj implementiramo osnovne geste. Oglejmo si primere, kot so tap, poteg in vlečenje. Te bomo razložili tako, da najprej opredelimo, kaj so, nato pa ponudimo primere v JavaScriptu.

Gesta tapa (kratkega dotika)

Gesta tapa je hiter dotik in sprostitev na zaslonu. Za implementacijo geste tapa lahko sledimo dogodkoma `touchstart` in `touchend` ter merimo časovno razliko med njima. Če je časovna razlika pod določenim pragom (npr. 200 milisekund), jo štejemo za tap.


 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('Zaznan tap!');
  }
 });

Gesta potega (swipe)

Gesta potega je hitro, usmerjeno gibanje po zaslonu. Za zaznavanje potega moramo slediti začetni in končni poziciji dotika ter izračunati razdaljo in smer gibanja. Upoštevati moramo tudi trajanje potega.


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

   if (angle > -45 && angle <= 45) {
    console.log('Poteg v desno!');
   } else if (angle > 45 && angle <= 135) {
    console.log('Poteg navzdol!');
   } else if (angle > 135 || angle <= -135) {
    console.log('Poteg v levo!');
   } else {
    console.log('Poteg navzgor!');
   }
  }
 });

Gesta vlečenja (drag)

Gesta vlečenja vključuje dotik elementa in njegovo premikanje po zaslonu. Za implementacijo geste vlečenja moramo slediti dogodku `touchmove` in ustrezno posodabljati 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;
 });

Prepričajte se, da imate v svojem HTML-ju element z ID-jem "draggableElement":


 
Vleci me!

Geste z več dotiki (Multi-Touch)

Geste z več dotiki vključujejo uporabo več prstov za interakcijo z zaslonom. To omogoča bolj zapletene in izrazne interakcije, kot sta ščipanje za povečavo (pinch-to-zoom) in vrtenje.

Ščipanje za povečavo (Pinch-to-Zoom)

Ščipanje za povečavo je pogosta gesta za povečevanje in pomanjševanje slike ali zemljevida. Za implementacijo ščipanja za povečavo moramo slediti razdalji med dvema točkama dotika in ustrezno prilagajati merilo 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; // Ponastavi za naslednje gibanje
  }
 });

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

Prepričajte se, da imate v svojem HTML-ju sliko z ID-jem "zoomableImage":


 

Vrtenje

Vrtenje vključuje vrtenje elementa z dvema prstoma. Za implementacijo vrtenja moramo slediti kotu med dvema točkama dotika in ustrezno vrteti 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 vrtenje
   element.style.transform = 'rotate(' + currentRotation + 'deg)';
   initialAngle = currentAngle; // Ponastavi za naslednje gibanje
  }
 });

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

Prepričajte se, da imate v svojem HTML-ju sliko z ID-jem "rotatableImage":


 

Knjižnice za prepoznavanje gest

Implementacija zapletenih gest iz nič je lahko zahtevna in dolgotrajna. Na srečo obstaja več knjižnic JavaScript, ki lahko poenostavijo postopek prepoznavanja gest. Te knjižnice ponujajo vnaprej pripravljene prepoznavalnike gest in pripomočke za obravnavo dogodkov na dotik.

Hammer.js

Hammer.js je priljubljena knjižnica JavaScript za prepoznavanje gest. Podpira širok nabor gest, vključno s tapom, dvojnim tapom, potegom, ščipanjem, vrtenjem in premikanjem. Je lahka, enostavna za uporabo in zelo prilagodljiva. Hammer.js deluje tako, da posluša dogodke na dotik in nato na podlagi lokacije in trajanja točk dotika določi, katero dejanje uporabnik izvaja.


 // Vključite Hammer.js v vaš HTML
 // 

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

 hammer.on('tap', function(event) {
  console.log('Zaznan dogodek tap');
 });

 hammer.on('swipe', function(event) {
  console.log('Zaznan dogodek potega');
  console.log('Smer potega: ' + event.direction);
 });

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

 hammer.on('pinch', function(event) {
  console.log('Zaznan dogodek ščipanja');
  element.style.transform = 'scale(' + event.scale + ')';
 });

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

AlloyFinger

AlloyFinger je še ena priljubljena knjižnica JavaScript, specializirana za prepoznavanje gest, zlasti za mobilne naprave. Znana je po svoji majhnosti in dobri zmogljivosti. Osredotoča se na običajne geste na dotik, kot so tap, poteg, ščipanje, vrtenje in pritisk. Ponuja enostaven API za vezavo gest na elemente.


 // Vključite AlloyFinger v vaš HTML
 //  // Zamenjajte s potjo do vaše datoteke AlloyFinger

 let element = document.getElementById('myElement');
 let af = new AlloyFinger(element, {
  tap: function() {
   console.log('Zaznan dogodek tap');
  },
  swipe: function(evt) {
   console.log('Zaznan dogodek potega');
   console.log('Smer potega: ' + evt.direction); // gor, dol, levo, desno
  },
  pinch: function(evt) {
   console.log('Zaznan dogodek ščipanja');
   element.style.transform = 'scale(' + evt.scale + ')';
  },
  rotate: function(evt) {
   console.log('Zaznan dogodek vrtenja');
   element.style.transform = 'rotate(' + evt.angle + 'deg)';
  }
 });

Premisleki o dostopnosti

Pri implementaciji gest na dotik je bistveno upoštevati dostopnost za uporabnike z oviranostmi. Nekateri uporabniki morda ne bodo mogli uporabljati gest na dotik zaradi motoričnih okvar. Zagotavljanje alternativnih načinov vnosa, kot so kontrolniki s tipkovnico ali glasovni ukazi, zagotavlja, da je vaša aplikacija dostopna širšemu občinstvu.

Optimizacija zmogljivosti

Dogodki na dotik so lahko računsko zahtevni, zlasti pri obravnavi zapletenih gest. Optimizacija kode za zmogljivost je ključnega pomena za zagotavljanje gladke in odzivne uporabniške izkušnje.

Združljivost med brskalniki

Podpora za dogodke na dotik se razlikuje med različnimi brskalniki in napravami. Ključnega pomena je, da svojo kodo preizkusite na različnih brskalnikih in napravah, da zagotovite združljivost med njimi. Razmislite o uporabi polyfillov ali knjižnic, ki abstrahirajo razlike med brskalniki.

Premisleki o internacionalizaciji (i18n)

Pri implementaciji gest na dotik ne pozabite upoštevati internacionalizacije (i18n). Medtem ko so interakcije na dotik same po sebi na splošno neodvisne od jezika, morajo biti okoliški elementi uporabniškega vmesnika in mehanizmi za povratne informacije lokalizirani za različne jezike in regije.

Globalni primeri in premisleki

Poglejmo, kako se lahko geste na dotik različno uporabljajo v različnih globalnih kontekstih:

Zaključek

Geste na dotik so močno orodje za ustvarjanje privlačnih in intuitivnih uporabniških izkušenj. Z razumevanjem osnovnih dogodkov na dotik in uporabo ustreznih tehnik prepoznavanja gest lahko v svoje projekte JavaScript implementirate širok nabor gest. Ne pozabite upoštevati dostopnosti, zmogljivosti in združljivosti med brskalniki, da zagotovite, da vaša aplikacija dobro deluje za vse uporabnike. Z napredkom tehnologije pričakujte nove vrste gest in interakcij; nadaljujte z učenjem, da ostanete v ospredju digitalnih izkušenj.

Geste na dotik: Celovit vodnik za implementacijo v JavaScriptu | MLOG