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 相关文章推荐
escape、encodeURI、encodeURIComponent等方法的区别比较
Dec 27 Javascript
javascript loadScript异步加载脚本示例讲解
Nov 14 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
May 05 Javascript
推荐5 个常用的JavaScript调试技巧
Jan 08 Javascript
JavaScript错误处理
Feb 03 Javascript
JavaScript来实现打开链接页面的简单实例
Jun 02 Javascript
Bootstrap 手风琴菜单的实现代码
Jan 20 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
Apr 13 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
Dec 28 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
微信小程序点击item使之滚动到屏幕中间位置
Mar 25 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
DIY实用性框形天线
2021/03/02 无线电
坏狼php学习 计数器实例代码
2008/06/15 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
PHP中文乱码解决方案
2015/03/05 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
jquery select操作的日期联动实现代码
2009/12/06 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
开源Web应用框架Django图文教程
2017/03/09 Python
python绘制热力图heatmap
2020/03/23 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
Python中and和or如何使用
2020/05/28 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
求职推荐信范文
2013/12/01 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
检察官就职演讲稿
2014/01/13 职场文书
区优秀教师事迹材料
2014/02/10 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
五好关工委申报材料
2014/05/31 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
教师节寄语2015
2015/03/23 职场文书
保护校园环境倡议书
2015/04/28 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python