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 相关文章推荐
基于jQuery的Spin Button自定义文本框数值自增或自减
Jul 17 Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 Javascript
使用jQuery将多条数据插入模态框的实现代码
Oct 08 Javascript
浅谈javascript 迭代方法
Jan 21 Javascript
纯Javascript实现ping功能的方法
Mar 20 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 Javascript
你知道setTimeout是如何运行的吗?
Aug 16 Javascript
JS区分Object与Aarry的六种方法总结
Feb 27 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
Jun 14 Javascript
ES6 更易于继承的类语法的使用
Feb 11 Javascript
使用微信SDK自定义分享的方法
Jul 03 Javascript
Vue双向数据绑定(MVVM)的原理
Oct 03 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
PHP应用JSON技巧讲解
2013/02/03 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
Python pandas常用函数详解
2018/02/07 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
ipad上运行python的方法步骤
2019/10/12 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
大学毕业生通用求职信
2013/09/28 职场文书
语文教学随笔感言
2014/02/18 职场文书
会计演讲稿范文
2014/05/23 职场文书
和谐社区口号
2014/06/19 职场文书
单位租车协议书
2015/01/29 职场文书
锅炉工岗位职责
2015/02/13 职场文书
工作年限证明模板
2015/06/15 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
基于Python实现将列表数据生成折线图
2022/03/23 Python