移动端拖动元素事件

  移动端页面有时候会有在页面中显示浮动按钮的需求,这个浮动按钮有时候会遮盖下面的文字图片等内容,这个时候就有了拖动的需求,

  下面是封装好的方法,可以直接使用

  

/**
 * 拖动元素事件
 * @param {*} obj  [ 结构 { element, distanceTop, distanceLeft, distanceRight, distanceBottom } 
 */
function dragElement(obj) {
  const dragNode = obj.element;
  const distanceTop = obj.distanceTop || 0;
  const distanceLeft = obj.distanceLeft || 0;
  const distanceRight = obj.distanceRight || 0;
  const distanceBottom = obj.distanceBottom || 0;
  //限制最大宽高,不让滑块出去
  let maxW = document.body.clientWidth - dragNode.offsetWidth;
  let maxH = document.body.clientHeight - dragNode.offsetHeight;
  if (distanceRight) {
    maxW = maxW - distanceRight
  }
  if (distanceBottom) {
    maxH = maxH - distanceBottom
  }

  let oL,oT;
  //手指触摸开始,记录div的初始位置
  dragNode.addEventListener('touchstart', function(e) {
    var ev = e || window.event;
    var touch = ev.targetTouches[0];
    oL = touch.clientX - dragNode.offsetLeft;
    oT = touch.clientY - dragNode.offsetTop;
    document.addEventListener("touchmove", defaultEvent, false);
  });
  //触摸中的,位置记录
  dragNode.addEventListener('touchmove', function(e) {
    const ev = e || window.event;
    const touch = ev.targetTouches[0];
    let oLeft = touch.clientX - oL;
    let oTop = touch.clientY - oT;
    if(oLeft < distanceLeft) {
      oLeft = distanceLeft;
    } else if(oLeft >= maxW) {
      oLeft = maxW;
    }
    if(oTop < distanceTop) {
      oTop = distanceTop;
    } else if(oTop >= maxH) {
      oTop = maxH;
    }
    dragNode.style.left = oLeft + 'px';
    dragNode.style.top = oTop + 'px';
  });
  //触摸结束时的处理
  dragNode.addEventListener('touchend', function() {
    document.removeEventListener("touchmove", defaultEvent);
  });
  //阻止默认事件
  function defaultEvent(e) {
    e.preventDefault();
  }
}

 

  使用时只需要这么用:

// 拖动元素事件
utils.dragElement({
  element: $('#drag-node')[0]
})

 

  就可以了,这个是拖动到哪里就停在哪里~

 

posted @ 2020-12-04 23:09  深lin人不知  阅读(301)  评论(0编辑  收藏  举报