js实现一个可以兼容PC端和移动端的div拖动效果实例


Posted in Javascript onDecember 09, 2016

前段时间写了一个简单的div拖动效果,不料昨天项目上正好需要一个相差不多的需求,就正好用上了,但是在移动端的时候却碰到了问题,拖动时候用到的三个事件:mousedown、mousemove、mouseup在移动端都不起任何作用。毕竟移动端是没有鼠标的,查资料后发现,在移动端与之相对应的分别是:touchstart、touchmove、touchend事件。还有一点要注意的是在PC端获取当前鼠标的坐标是:event.clientX和event.clientY,在移动端获取坐标位置则是:event.touches[0].clientX和event.touches[0].clientY。

下面就来说说怎么实现这个效果吧,先看一下效果:

PC端

js实现一个可以兼容PC端和移动端的div拖动效果实例

移动端

js实现一个可以兼容PC端和移动端的div拖动效果实例

先来分析一个拖动的流程,以PC端为例,首先是鼠标按下(mousedown事件),然后移动(mousemove事件),最后释放鼠标(mouseup事件),首先要设置一个变量记录鼠标是否按下,在鼠标按下的时候,我们做一个标记,然后需要记录一下鼠标当前的坐标,还有这个div当前的偏移量,当鼠标开始移动的时候,记录下鼠标当前的坐标,用鼠标当前的坐标减去鼠标按下时的坐标再加上鼠标按下时div的偏移量就是现在div距离父辈元素的距离,当鼠标释放的时候将标记改为鼠标已经释放。

下面来看一下代码:

var flag = false;    //是否按下鼠标的标记
var cur = {       //记录鼠标按下时的坐标
  x:0,
  y:0
}
var nx,ny,dx,dy,x,y ;
//鼠标按下时的函数
function down(){
  flag = true;       //确认鼠标按下
  cur.x = event.clientX;  //记录当前鼠标的x坐标
  cur.y = event.clientY;  //记录当前鼠标的y坐标
  dx = div2.offsetLeft;  //记录div当时的左偏移量
  dy = div2.offsetTop;   //记录div的上偏移量
}
//鼠标移动时的函数
function move(){
  if(flag){            //如果是鼠标按下则继续执行
    nx = event.clientX - cur.x; //记录鼠标在x轴移动的数据
    ny = event.clientY - cur.y; //记录鼠标在y轴移动的数据
    x = dx+nx;          //div在x轴的偏移量加上鼠标在x轴移动的距离
    y = dy+ny;          //div在y轴的偏移量加上鼠标在y轴移动的距离
    div2.style.left = x+"px";
    div2.style.top = y +"px";
  }
}
//鼠标释放时候的函数
function end(){
  flag = false;          //鼠标释放
}

 然后在将事件加入到这个div中即可,下面再来看一个在移动端需要做些什么,首先是事件不同,只需要在添加移动端的touchatart、touchmove、touchend就可以了,还有一个不同的时移动端获取坐标是event.touches[0].clientX和event.touches[0].clientY,这也很简单,只要加上判断就可以了,如果是PC端就使用event,如果是移动端就使用event.touches:

var touch ;
if(event.touches){
  touch = event.touches[0];
}else {
  touch = event;
}

 还有一点要注意,在移动端拖动div的时候移动端的页面会自动产生滑动效果,所以还需要在touchmove的是给页面添加一个阻止默认事件的函数。

下面是整个代码,可以在Chrome下模拟移动端测试,点击这里查看:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>适配移动端的拖动效果</title>
  <style>
    #div1{
      height: 1000px;
    }
    #div2{
      position: absolute;
      top:0;
      left:0;
      width: 100px;
      height: 100px;
      background: #bbbbbb;
    }
  </style>
</head>
<body>
<div id="div1">
  <div id="div2"></div>
</div>
<script>
  var flag = false;
  var cur = {
    x:0,
    y:0
  }
  var nx,ny,dx,dy,x,y ;
  function down(){
    flag = true;
    var touch ;
    if(event.touches){
      touch = event.touches[0];
    }else {
      touch = event;
    }
    cur.x = touch.clientX;
    cur.y = touch.clientY;
    dx = div2.offsetLeft;
    dy = div2.offsetTop;
  }
  function move(){
    if(flag){
      var touch ;
      if(event.touches){
        touch = event.touches[0];
      }else {
        touch = event;
      }
      nx = touch.clientX - cur.x;
      ny = touch.clientY - cur.y;
      x = dx+nx;
      y = dy+ny;
      div2.style.left = x+"px";
      div2.style.top = y +"px";
      //阻止页面的滑动默认事件
      document.addEventListener("touchmove",function(){
        event.preventDefault();
      },false);
    }
  }
  //鼠标释放时候的函数
  function end(){
    flag = false;
  }
  var div2 = document.getElementById("div2");
  div2.addEventListener("mousedown",function(){
    down();
  },false);
  div2.addEventListener("touchstart",function(){
    down();
  },false)
  div2.addEventListener("mousemove",function(){
    move();
  },false);
  div2.addEventListener("touchmove",function(){
    move();
  },false)
  document.body.addEventListener("mouseup",function(){
    end();
  },false);
  div2.addEventListener("touchend",function(){
    end();
  },false);
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
表单切换,用回车键替换Tab健(不支持IE)
Jul 20 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
Jan 20 Javascript
javascript如何动态加载表格与动态添加表格行
Nov 27 Javascript
Extjs grid panel自带滚动条失效的解决方法
Sep 11 Javascript
node.js中的buffer.copy方法使用说明
Dec 14 Javascript
js密码强度校验
Nov 10 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
Jan 15 Javascript
jquery实现轮播图效果
Feb 13 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
Mar 02 Javascript
原生js实现拖拽功能基本思路详解
Apr 18 Javascript
vue做移动端适配最佳解决方案(亲测有效)
Sep 04 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
Nov 02 Javascript
利用JS实现页面删除并重新排序功能
Dec 09 #Javascript
Bootstrap table使用方法详细介绍
Dec 09 #Javascript
jQuery Validate设置onkeyup验证的实例代码
Dec 09 #Javascript
任意Json转成无序列表的方法示例
Dec 09 #Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 #Javascript
解析微信JS-SDK配置授权,实现分享接口
Dec 09 #Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 #Javascript
You might like
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
深入解析Python中的变量和赋值运算符
2015/10/12 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
Python2与Python3的区别实例总结
2019/04/17 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
某科技软件测试面试题
2013/05/19 面试题
软件测试常见笔试题
2012/02/04 面试题
求职简历的自我评价怎样写好
2013/10/07 职场文书
科研课题实施方案
2014/03/18 职场文书
标准毕业生自荐信
2014/06/24 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
个人更名证明
2015/06/23 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
浅谈MySQL函数
2021/10/05 MySQL