Skip to content

How to make a draggable for touch?

I want the orange rectangle to be draggable using mouse or touch. The function for the mouse is working for me, so I tried copying it and replacing mousedown with ontouchstart, mousemove with ontouchmove and mouseup with ontouchend but it doesn’t seem to move. Any suggestions? Thanks!

var move = document.querySelector('.move');

move.addEventListener('mousedown', mousedown);
move.addEventListener('ontouchstart', ontouchstart);

function mousedown() {

  move.addEventListener('mousemove', mousemove); 
  move.addEventListener('mouseup', mouseup); 
  function mousemove(e){
    
    var x = e.clientX - 100 + 'px';
    var y = e.clientY - 100 + 'px'; 
    this.style.left = x;
    this.style.top = y;

  }

  function mouseup() {
    move.removeEventListener('mousemove', mousemove)
  }
 
}

function ontouchstart() {

  move.addEventListener('ontouchmove', ontouchmove); 
  move.addEventListener('ontouchend', ontouchend);
  function ontouchmove(e){
    
    var x = e.clientX - 100 + 'px';
    var y = e.clientY - 100 + 'px'; 
    this.style.left = x;
    this.style.top = y;

  }

  function ontouchend() {
    move.removeEventListener('ontouchmove', ontouchmove)
  }
 
}
.move {
  height: 200px;
  width: 200px;
  background: orange;
  position: fixed;
}
<body>
  <div class="move"></div>

  <script src="script.js"></script>
</body>

Answer

For one, the names of your events are incorrect. Omit the on prefix.

Second, touchmove works a little different from mousemove. The event parameter that gets passed to touchmove does not have a clientX or clientY property. Instead it contains a TouchList that needs to be iterated. See below:

var move = document.querySelector('.move');

move.addEventListener('mousedown', mousedown);
move.addEventListener('touchstart', ontouchstart);

function mousedown() {

  move.addEventListener('mousemove', mousemove);
  move.addEventListener('mouseup', mouseup);

  function mousemove(e) {

    var x = e.clientX - 100 + 'px';
    var y = e.clientY - 100 + 'px';
    this.style.left = x;
    this.style.top = y;

  }

  function mouseup() {
    move.removeEventListener('mousemove', mousemove)
  }

}

function ontouchstart() {

  move.addEventListener('touchmove', ontouchmove);
  move.addEventListener('touchend', ontouchend);

  function ontouchmove(e) {

    e.preventDefault();
    for (target of e.targetTouches) {
      var x = target.clientX - 100 + "px";
      var y = target.clientY - 100 + "px";
      this.style.left = x;
      this.style.top = y;
    }

  }

  function ontouchend() {
    move.removeEventListener('touchmove', ontouchmove)
  }

}
.move {
  height: 200px;
  width: 200px;
  background: orange;
  position: fixed;
}
<body>
  <div class="move"></div>

  <script src="script.js"></script>
</body>

For more information see Touch Events and Using Touch Events.