Search code examples
javascriptjqueryhtmlcssswipe

How would i get negative numbers from swipe detection?


I have a variable called x which would be starting point, myCount for counting every swipes a user has done, and last variable dist that returns specific numbers how far from the starting point.

I would like to store -1 in myCount if dist is going to under -201 dragging(swipe in mobile) to the left side by the user.

Storing positive number is working fine(by dragging right side), but it never stores negative number.

Is there any solutions to fix this problem?

This is what I've done so far by myself:

CodePen

$(function stripeAnimeModule() {
  // Variables
    var screen = $('.page1'),
    buttons = $('.buttons').find('.button'),
    myCount = 1,
    x,
    dist;
  // Functions
    function clicked(e) {
      if ($(this).hasClass('prev')) {
        myCount -= 1;
        console.log(myCount, 'this is clicked');
      } else {
        myCount += 1;
        console.log(myCount);
      }
    }
    function touchStart(e) {
      return x = e.touches[0].pageX;
      e.preventDefault();
    }
    function touchMove(e) {
      var drag = e.touches[0].pageX;
      var dist = Math.sqrt(x + drag);
      e.preventDefault();
    }
    function touchEnd(e) {
      var dist = e.changedTouches[0].pageX - x;
      if (dist < Math.abs(-200)) {
        myCount = myCount;
        console.log('nothing', dist, myCount);
      } else if (dist > 201) {
        myCount += 1;
        console.log('distance is: ' + dist, x, 'myCount is: '+ myCount);
      } else if (dist > -201) {
        myCount -= 1;
        console.log('distance is: ' + dist, x, 'myCount is: '+ myCount);
      }
      e.stopPropagation();
      e.preventDefault();
    }
    buttons.on({click: clicked});
    screen.bind({touchstart:touchStart, touchmove:touchMove, touchend: touchEnd});
})
* {
  margin: 0;
  padding: 0;
}
ul li {
  list-style: none;
}
a {
  display: block;
}
.page1 {
  position: absolute;
  width: 100vw;
  height: 100vh;
  background-color: grey;
}
.buttons {
  z-index: 1;
}
.prev {
  position: absolute;
  left: 0;
  margin: 0 40px;
}
.shrink {
  position: absolute;
}
.next {
  position: absolute;
  right: 0;
  margin: 0 40px;
}
<div class="page1" href="#"></div>
<ul class="buttons">
  <li class="button prev">Prev</li>
  <li class="shrink"></li>
  <li class="button next">Next</li>
</ul>
<br><br><br><br><br><br><br><br><br><br><br><br><br>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


Solution

  • $(function stripeAnimeModule() {
      // Variables
        var screen = $('.page1'),
        buttons = $('.buttons').find('.button'),
        myCount = 1,
        x,
        dist;
      // Functions
        function clicked(e) {
          if ($(this).hasClass('prev')) {
            myCount -= 1;
            console.log(myCount, 'this is clicked');
          } else {
            myCount += 1;
            console.log(myCount);
          }
        }
        function touchStart(e) {
          return x = e.touches[0].pageX;
          e.preventDefault();
        }
        function touchMove(e) {
          var drag = e.touches[0].pageX;
          var dist = Math.sqrt(x + drag);
          e.preventDefault();
        }
        function touchEnd(e) {
          var dist = e.changedTouches[0].pageX - x;
          if (dist > 201) {
            myCount += 1;
            console.log('distance is: ' + dist, x, 'myCount is: '+ myCount);
          } else if (dist < -201) {
            myCount -= 1;
            console.log('distance is: ' + dist, x, 'myCount is: '+ myCount);
          } else {
            myCount = myCount;
            console.log('nothing', dist, myCount);
          }
          e.stopPropagation();
          e.preventDefault();
        }
        buttons.on({click: clicked});
        screen.bind({touchstart:touchStart, touchmove:touchMove, touchend: touchEnd});
    })
    * {
      margin: 0;
      padding: 0;
    }
    ul li {
      list-style: none;
    }
    a {
      display: block;
    }
    .page1 {
      position: absolute;
      width: 100vw;
      height: 100vh;
      background-color: grey;
    }
    .buttons {
      z-index: 1;
    }
    .prev {
      position: absolute;
      left: 0;
      margin: 0 40px;
    }
    .shrink {
      position: absolute;
    }
    .next {
      position: absolute;
      right: 0;
      margin: 0 40px;
    }
    <div class="page1" href="#"></div>
    <ul class="buttons">
      <li class="button prev">Prev</li>
      <li class="shrink"></li>
      <li class="button next">Next</li>
    </ul>
    <br><br><br><br><br><br><br><br><br><br><br><br><br>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    Please have a look and let me know if this is what you are looking for.