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 相关文章推荐
for 循环性能比较 提高for循环的效率
Mar 19 Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 Javascript
前端开发的开始---基于面向对象的Ajax类
Sep 17 Javascript
Jquery实现仿腾讯微博发表广播
Nov 17 Javascript
js正则表达式匹配数字字母下划线等
Apr 14 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
Aug 10 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
Feb 24 Javascript
jQuery实现的可编辑表格完整实例
Jun 20 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
vue实现路由懒加载的3种方法示例
Sep 01 Javascript
vue实现动态表格提交参数动态生成控件的操作
Nov 09 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
Access数据库导入Mysql的方法之一
2006/10/09 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
如何基于js判断浏览器版本
2020/02/20 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python多线程http下载实现示例
2013/12/30 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
matplotlib中legend位置调整解析
2017/12/19 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
python命令行参数用法实例分析
2019/06/25 Python
浅析matlab中imadjust函数
2020/02/27 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
保护水资源的标语
2014/06/17 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
警察群众路线整改措施
2014/09/26 职场文书
地震捐款简报
2015/07/21 职场文书
生产车间管理制度
2015/08/04 职场文书
2016年元旦寄语
2015/08/17 职场文书
mysql部分操作
2021/04/05 MySQL
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python