原生js实现拖拽功能基本思路详解


Posted in Javascript onApril 18, 2018

如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。

1.onmousedown:鼠标按下事件
2.onmousemove:鼠标移动事件
3.onmouseup:鼠标抬起事件

  拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的 top和left的改变。当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的。

基本思路如下:

拖拽状态 = 0鼠标在元素上按下的时候{   
  拖拽状态 = 1   
  记录下鼠标的x和y坐标   
  记录下元素的x和y坐标   
  }  
 鼠标在元素上移动的时候{   
  如果拖拽状态是0就什么也不做。   
  如果拖拽状态是1,那么   
  元素y = 现在鼠标y - 原来鼠标y + 原来元素y   
  元素x = 现在鼠标x - 原来鼠标x + 原来元素x   
  }    
 鼠标在任何时候放开的时候{   
  拖拽状态 = 0   
}

部分实例代码:

HTML部分

<div class="calculator" id="drag">**********</div>

CSS部分

calculator { 
  position: absolute; /*设置绝对定位,脱离文档流,便于拖拽*/ 
  display: block; 
  width: 218px; 
  height: 280px; 
  cursor: move;  /*鼠标呈拖拽状*/ 
}

JS部分

window.onload = function() { 
  //拖拽功能(主要是触发三个事件:onmousedown\onmousemove\onmouseup) 
  var drag = document.getElementById('drag'); 
  //点击某物体时,用drag对象即可,move和up是全局区域,也就是整个文档通用,应该使用document对象而不是drag对象(否则,采用drag对象时物体只能往右方或下方移动) 
  drag.onmousedown = function(e) { 
    var e = e || window.event; //兼容ie浏览器 
    var diffX = e.clientX - drag.offsetLeft; //鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离 
    var diffY = e.clientY - drag.offsetTop; 
    /*低版本ie bug:物体被拖出浏览器可是窗口外部时,还会出现滚动条, 
      解决方法是采用ie浏览器独有的2个方法setCapture()\releaseCapture(),这两个方法, 
      可以让鼠标滑动到浏览器外部也可以捕获到事件,而我们的bug就是当鼠标移出浏览器的时候, 
      限制超过的功能就失效了。用这个方法,即可解决这个问题。注:这两个方法用于onmousedown和onmouseup中*/ 
      if(typeof drag.setCapture!='undefined'){ 
        drag.setCapture(); 
      } 
    document.onmousemove = function(e) { 
      var e = e || window.event; //兼容ie浏览器 
      var left=e.clientX-diffX; 
      var top=e.clientY-diffY; 
      //控制拖拽物体的范围只能在浏览器视窗内,不允许出现滚动条 
      if(left<0){ 
        left=0; 
      }else if(left >window.innerWidth-drag.offsetWidth){ 
        left = window.innerWidth-drag.offsetWidth; 
      } 
      if(top<0){ 
        top=0; 
      }else if(top >window.innerHeight-drag.offsetHeight){ 
        top = window.innerHeight-drag.offsetHeight; 
      } 
      //移动时重新得到物体的距离,解决拖动时出现晃动的现象 
      drag.style.left = left+ 'px'; 
      drag.style.top = top + 'px'; 
    }; 
    document.onmouseup = function(e) { //当鼠标弹起来的时候不再移动 
      this.onmousemove = null; 
      this.onmouseup = null; //预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动) 
      //修复低版本ie bug 
      if(typeof drag.releaseCapture!='undefined'){ 
        drag.releaseCapture(); 
      } 
    }; 
  }; 
};

总结

以上所述是小编给大家介绍的原生js实现拖拽功能基本思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery 关于event.target使用的几点说明介绍
Apr 26 Javascript
Javascript MVC框架Backbone.js详解
Sep 18 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
node.js中的fs.lstat方法使用说明
Dec 16 Javascript
jquery插件star-rating.js实现星级评分特效
Apr 15 Javascript
学习javascript面向对象 javascript实现继承的方式
Jan 04 Javascript
jQuery实现产品对比功能附源码下载
Aug 09 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
Jan 05 Javascript
Bootstrap面板学习使用
Feb 09 Javascript
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
利用Node.js了解与测量HTTP所花费的时间详解
Sep 22 Javascript
vue-router相关基础知识及工作原理
Mar 16 Javascript
一个基于react的图片裁剪组件示例
Apr 18 #Javascript
JS实现对json对象排序并删除id相同项功能示例
Apr 18 #Javascript
Angular ng-animate和ng-cookies用法详解
Apr 18 #Javascript
JS实现的base64加密解密操作示例
Apr 18 #Javascript
JS实现简单获取最近7天和最近3天日期的方法
Apr 18 #Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 #Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 #jQuery
You might like
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php while循环控制的简单实例
2016/05/30 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
javascript 写类方式之七
2009/07/05 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
在python Numpy中求向量和矩阵的范数实例
2019/08/26 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
电气自动化自荐信
2013/10/10 职场文书
总经理办公室主任岗位职责
2013/11/12 职场文书
研发工程师的岗位职责
2013/11/18 职场文书
财务主管岗位职责
2014/02/28 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android