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 相关文章推荐
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
js string 转 int 注意的问题小结
Aug 15 Javascript
浅析javascript中函数声明和函数表达式的区别
Feb 15 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
Oct 27 Javascript
Bootstrap每天必学之缩略图与警示窗
Nov 29 Javascript
JavaScript动态插入CSS的方法
Dec 10 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
Jan 26 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
Jun 21 Javascript
原生js实现贪吃蛇游戏
Oct 26 Javascript
为什么node.js不适合大型项目
Apr 28 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执行速度全攻略(下)
2006/10/09 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
php和nginx交互实例讲解
2019/09/24 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
使用jQuery给Table动态增加行、清空table的方法
2018/09/05 jQuery
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
对Python强大的可变参数传递机制详解
2019/06/13 Python
Python 变量的创建过程详解
2019/09/02 Python
利用python绘制正态分布曲线
2021/01/04 Python
python中if嵌套命令实例讲解
2021/02/25 Python
通信生自我鉴定
2014/01/18 职场文书
房地产广告词大全
2014/03/19 职场文书
外联部演讲稿
2014/05/24 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
论文致谢词范文
2015/05/14 职场文书
离婚被告答辩状
2015/05/22 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python