Adding a simple left/right swipe gesture Adding a simple left/right swipe gesture vue.js vue.js

Adding a simple left/right swipe gesture


This is how I implemented a simple swipe gesture in one of my projects. You may check this out.

Code:

touchableElement.addEventListener('touchstart', function (event) {    touchstartX = event.changedTouches[0].screenX;    touchstartY = event.changedTouches[0].screenY;}, false);touchableElement.addEventListener('touchend', function (event) {    touchendX = event.changedTouches[0].screenX;    touchendY = event.changedTouches[0].screenY;    handleGesture();}, false);function handleGesture() {    if (touchendX < touchstartX) {        console.log('Swiped Left');    }    if (touchendX > touchstartX) {        console.log('Swiped Right');    }    if (touchendY < touchstartY) {        console.log('Swiped Up');    }    if (touchendY > touchstartY) {        console.log('Swiped Down');    }    if (touchendY === touchstartY) {        console.log('Tap');    }}

Basically, touchableElement mentioned here, refers to the DOM Element that will receive the touch event. If you want to activate swipe options on your entire screen, then you may use your body tag as the touchable element. Or you may configure any specific div element as the touchable element, in case you just want the swipe gesture on that specific div.

On that touchableElement, we are adding 2 event-listeners here:

  1. touchstart:this is when user starts swiping. We take that initial coordinates (x,y) andstore them into touchstartX, touchstartY respectively.
  2. touchend: this is when user stops swiping. We take that final coordinates (x, y) and store them into touchendX, touchendY respectively.

Keep in mind that, the origin of these coordinates is the top left corner of the screen. x-coordinate increases as you go from left to right and y-coordinate increases as you go from top to bottom.

Then, in handleGesture(), we just compare those 2 pair of coordinates (touchstartX, touchstartY) and (touchendX, touchendY), to detect different types of swipe gesture (up, down, left, right):

  • touchendX < touchstartX: says that, user started swiping at a higher X value & stopped swiping at a lower X value. That means, swiped from right to left (Swiped Left).

  • touchendX > touchstartX: says that, user started swiping at a lower X value & stopped swiping at a higher X value. That means, swiped from left to right (Swiped Right).

  • touchendY < touchstartY: says that, user started swiping at a higher Y value & stopped swiping at a lower Y value. That means, swiped from bottom to top (Swiped Up).

  • touchendY > touchstartY: says that, user started swiping at a lower Y value & stopped swiping at a higher Y value. That means, swiped from top to bottom (Swiped Down).

You may add the code for these 4 different events (Swipe Up/Down/Left/Right), on the corresponding if blocks, as shown on the code.


This sounds like a job for Hammer.JS, unless you're trying to avoid dependencies. They have good documentation and examples for getting started

My Vue knowledge is next to nothing, so I'm wary of this becoming a blind leading the blind scenario, but the first thing you'll have to do is add the dependency using either npm or yarn - then add it to the top of your file using

import Hammer from 'hammerjs'

Try adding the below code right above this line: Event.$on('updateImg', index => {

const swipeableEl = document.getElementsByClassName('.hero')[0];this.hammer = Hammer(swipeableEl)this.hammer.on('swipeleft', () => this.next())this.hammer.on('swiperight', () => this.previous())

If it doesn't work you'll have to check your developer tools / console log to see if it's logged any useful errors.

This codepen might be a useful resource too:

Good luck.


I took smmehrab’s answer, added some thresholds to avoid accidental swipes, and turned it into a little library. Might come in handy, so here it is:

export default class TouchEvent{    static SWPIE_THRESHOLD = 50 // Minumum difference in pixels at which a swipe gesture is detected    static SWIPE_LEFT   = 1    static SWIPE_RIGHT  = 2    static SWIPE_UP     = 3    static SWIPE_DOWN   = 4    constructor(startEvent, endEvent)    {        this.startEvent = startEvent        this.endEvent = endEvent || null    }    isSwipeLeft()    {        return this.getSwipeDirection() == TouchEvent.SWIPE_LEFT    }    isSwipeRight()    {        return this.getSwipeDirection() == TouchEvent.SWIPE_RIGHT    }    isSwipeUp()    {        return this.getSwipeDirection() == TouchEvent.SWIPE_UP    }    isSwipeDown()    {        return this.getSwipeDirection() == TouchEvent.SWIPE_DOWN    }    getSwipeDirection()    {        let start = this.startEvent.changedTouches[0]        let end = this.endEvent.changedTouches[0]        if (!start || !end) {            return null        }        let horizontalDifference = start.screenX - end.screenX        let verticalDifference = start.screenY - end.screenY        // Horizontal difference dominates        if (Math.abs(horizontalDifference) > Math.abs(verticalDifference)) {            if (horizontalDifference >= TouchEvent.SWPIE_THRESHOLD) {                return TouchEvent.SWIPE_LEFT            } else if (horizontalDifference <= -TouchEvent.SWPIE_THRESHOLD) {                return TouchEvent.SWIPE_RIGHT            }        // Verical or no difference dominates        } else {            if (verticalDifference >= TouchEvent.SWPIE_THRESHOLD) {                return TouchEvent.SWIPE_UP            } else if (verticalDifference <= -TouchEvent.SWPIE_THRESHOLD) {                return TouchEvent.SWIPE_DOWN            }        }        return null    }    setEndEvent(endEvent)    {        this.endEvent = endEvent    }}

How to use

Simply feed it the events from touchstart and touchend:

import TouchEvent from '@/TouchEvent'let touchEvent = null;document.addEventListener('touchstart', (event) => {    touchEvent = new TouchEvent(event);});document.addEventListener('touchend', handleSwipe);function handleSwipe(event){    if (!touchEvent) {         return;    }    touchEvent.setEndEvent(event);    if (touchEvent.isSwipeRight()) {        // Do something    } else if (touchEvent.isSwipeLeft()) {        // Do something different    }    // Reset event for next touch    touchEvent = null;}