Nederlands

Ontdek de wereld van aanraakgebaren en leer hoe je ze implementeert in je JavaScript-projecten. Deze gids behandelt alles, van basis touch-events tot geavanceerde technieken voor gebarenherkenning.

Aanraakgebaren: Een Uitgebreide Gids voor JavaScript-implementatie

In de hedendaagse 'mobile-first' wereld zijn aanraakgebaren een integraal onderdeel geworden van de gebruikerservaring. Van eenvoudige tikken tot complexe interacties met meerdere vingers, aanraakgebaren bieden een natuurlijke en intuïtieve manier voor gebruikers om met webapplicaties te interageren. Deze uitgebreide gids verkent de wereld van aanraakgebaren en biedt een stapsgewijze aanpak om ze in uw JavaScript-projecten te implementeren.

Touch-events Begrijpen

Voordat we ons verdiepen in gebarenherkenning, is het cruciaal om de onderliggende touch-events te begrijpen die deze interacties mogelijk maken. JavaScript biedt een reeks events die worden geactiveerd wanneer een gebruiker het scherm aanraakt. Deze events geven informatie over de aanraking, zoals de locatie en de status.

Basis Touch-events:

Elk van deze events bevat een `touches`-eigenschap, wat een lijst is van `Touch`-objecten. Elk `Touch`-object vertegenwoordigt een enkel contactpunt op het scherm en bevat informatie zoals:

Voorbeeld: Touch-coördinaten Loggen

Dit eenvoudige voorbeeld demonstreert hoe u de coördinaten van een aanraakpunt kunt loggen wanneer de gebruiker het scherm aanraakt:


 document.addEventListener('touchstart', function(event) {
  event.preventDefault(); // Voorkomt standaard browsergedrag (bijv. scrollen)
  let touch = event.touches[0];
  console.log('Aanraking gestart op X: ' + touch.clientX + ', Y: ' + touch.clientY);
 });

Let op: De `preventDefault()`-methode wordt vaak gebruikt om te voorkomen dat de browser zijn standaard aanraakgedrag uitvoert, zoals scrollen of zoomen.

Basisgebaren Implementeren

Met een solide begrip van touch-events kunnen we nu basisgebaren implementeren. Laten we kijken naar voorbeelden zoals tikken, vegen en slepen. Deze worden uitgelegd door eerst te definiëren wat ze zijn, en vervolgens JavaScript-voorbeelden te geven.

Tikgebaar

Een tikgebaar is een snelle aanraking en loslating op het scherm. Om een tikgebaar te implementeren, kunnen we de `touchstart`- en `touchend`-events volgen en het tijdsverschil tussen beide meten. Als het tijdsverschil onder een bepaalde drempel ligt (bijv. 200 milliseconden), beschouwen we het als een tik.


 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('Tik gedetecteerd!');
  }
 });

Veegebaar

Een veeggebaar is een snelle, directionele beweging over het scherm. Om een veeg te detecteren, moeten we de begin- en eindposities van de aanraking volgen en de afstand en richting van de beweging berekenen. We moeten ook rekening houden met de duur van de veeg.


 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) { // Pas de drempelwaarde naar wens aan
   let angle = Math.atan2(deltaY, deltaX) * 180 / Math.PI;

   if (angle > -45 && angle <= 45) {
    console.log('Veeg naar rechts!');
   } else if (angle > 45 && angle <= 135) {
    console.log('Veeg naar beneden!');
   } else if (angle > 135 || angle <= -135) {
    console.log('Veeg naar links!');
   } else {
    console.log('Veeg omhoog!');
   }
  }
 });

Sleepgebaar

Een sleepgebaar houdt in dat je een element aanraakt en het over het scherm beweegt. Om een sleepgebaar te implementeren, moeten we het `touchmove`-event volgen en de positie van het element dienovereenkomstig bijwerken.


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

Zorg ervoor dat u een element met id "draggableElement" in uw HTML heeft:


 
Sleep Mij!

Multi-Touch Gebaren

Multi-touch gebaren maken gebruik van meerdere vingers om met het scherm te interageren. Dit maakt complexere en expressievere interacties mogelijk, zoals pinch-to-zoom en roteren.

Pinch-to-Zoom

Pinch-to-zoom is een veelvoorkomend gebaar dat wordt gebruikt om in en uit te zoomen op een afbeelding of kaart. Om pinch-to-zoom te implementeren, moeten we de afstand tussen twee aanraakpunten volgen en de schaal van het element dienovereenkomstig aanpassen.


 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; // Schalen accumuleren
   element.style.transform = 'scale(' + currentScale + ')';
   initialDistance = currentDistance; // Reset voor de volgende beweging
  }
 });

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

Zorg ervoor dat u een afbeelding met id "zoomableImage" in uw HTML heeft:


 

Rotatie

Rotatie houdt in dat een element wordt gedraaid met twee vingers. Om rotatie te implementeren, moeten we de hoek tussen twee aanraakpunten volgen en het element dienovereenkomstig roteren.


 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; // Rotatie accumuleren
   element.style.transform = 'rotate(' + currentRotation + 'deg)';
   initialAngle = currentAngle; // Reset voor de volgende beweging
  }
 });

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

Zorg ervoor dat u een afbeelding met id "rotatableImage" in uw HTML heeft:


 

Bibliotheken voor Gebarenherkenning

Het vanaf de basis implementeren van complexe gebaren kan uitdagend en tijdrovend zijn. Gelukkig zijn er verschillende JavaScript-bibliotheken die het proces van gebarenherkenning kunnen vereenvoudigen. Deze bibliotheken bieden vooraf gebouwde gebarenherkenners en hulpprogramma's voor het afhandelen van touch-events.

Hammer.js

Hammer.js is een populaire JavaScript-bibliotheek voor het herkennen van gebaren. Het ondersteunt een breed scala aan gebaren, waaronder tikken, dubbel tikken, vegen, knijpen, roteren en pannen. Het is lichtgewicht, gemakkelijk te gebruiken en zeer aanpasbaar. Hammer.js werkt door te luisteren naar touch-events en vervolgens te bepalen welke actie de gebruiker uitvoert op basis van de locatie en duur van aanraakpunten.


 // Voeg Hammer.js toe aan uw HTML
 // 

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

 hammer.on('tap', function(event) {
  console.log('Tik-event gedetecteerd');
 });

 hammer.on('swipe', function(event) {
  console.log('Veeg-event gedetecteerd');
  console.log('Veegrichting: ' + event.direction);
 });

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

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

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

AlloyFinger

AlloyFinger is een andere populaire JavaScript-bibliotheek die gespecialiseerd is in gebarenherkenning, met name voor mobiele apparaten. Het staat bekend om zijn kleine omvang en goede prestaties. Het richt zich op veelvoorkomende aanraakgebaren zoals tikken, vegen, knijpen, roteren en drukken. Het biedt een eenvoudig te gebruiken API voor het koppelen van gebaren aan elementen.


 // Voeg AlloyFinger toe aan uw HTML
 //  // Vervang door uw AlloyFinger-pad

 let element = document.getElementById('myElement');
 let af = new AlloyFinger(element, {
  tap: function() {
   console.log('Tik-event gedetecteerd');
  },
  swipe: function(evt) {
   console.log('Veeg-event gedetecteerd');
   console.log('Veegrichting: ' + evt.direction); // omhoog, omlaag, links, rechts
  },
  pinch: function(evt) {
   console.log('Knijp-event gedetecteerd');
   element.style.transform = 'scale(' + evt.scale + ')';
  },
  rotate: function(evt) {
   console.log('Roteer-event gedetecteerd');
   element.style.transform = 'rotate(' + evt.angle + 'deg)';
  }
 });

Overwegingen voor Toegankelijkheid

Bij het implementeren van aanraakgebaren is het essentieel om rekening te houden met de toegankelijkheid voor gebruikers met een handicap. Sommige gebruikers kunnen mogelijk geen aanraakgebaren gebruiken vanwege motorische beperkingen. Het bieden van alternatieve invoermethoden, zoals toetsenbordbediening of spraakopdrachten, zorgt ervoor dat uw applicatie toegankelijk is voor een breder publiek.

Prestatieoptimalisatie

Touch-events kunnen rekenintensief zijn, vooral bij het verwerken van complexe gebaren. Het optimaliseren van uw code voor prestaties is cruciaal om een soepele en responsieve gebruikerservaring te garanderen.

Cross-Browser Compatibiliteit

Ondersteuning voor touch-events varieert tussen verschillende browsers en apparaten. Het is cruciaal om uw code op verschillende browsers en apparaten te testen om cross-browser compatibiliteit te garanderen. Overweeg het gebruik van polyfills of bibliotheken die browserverschillen abstraheren.

Overwegingen voor Internationalisering (i18n)

Bij het implementeren van aanraakgebaren, vergeet dan niet rekening te houden met internationalisering (i18n). Hoewel aanraakinteracties zelf over het algemeen taalonafhankelijk zijn, moeten de omliggende UI-elementen en feedbackmechanismen worden gelokaliseerd voor verschillende talen en regio's.

Wereldwijde Voorbeelden en Overwegingen

Laten we bekijken hoe aanraakgebaren verschillend kunnen worden toegepast in verschillende wereldwijde contexten:

Conclusie

Aanraakgebaren zijn een krachtig hulpmiddel voor het creëren van boeiende en intuïtieve gebruikerservaringen. Door de onderliggende touch-events te begrijpen en de juiste technieken voor gebarenherkenning te gebruiken, kunt u een breed scala aan gebaren in uw JavaScript-projecten implementeren. Vergeet niet rekening te houden met toegankelijkheid, prestaties en cross-browser compatibiliteit om ervoor te zorgen dat uw applicatie goed werkt voor alle gebruikers. Naarmate de technologie vordert, kunt u nieuwe soorten gebaren en interacties verwachten; blijf leren om voorop te blijven lopen in digitale ervaringen.