原生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 相关文章推荐
解释&amp;&amp;和||在javascript中的另类用法
Jul 28 Javascript
JS实现向表格行添加新单元格的方法
Mar 30 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
谈谈Vue.js——vue-resource全攻略
Jan 16 Javascript
详解使用Node.js 将txt文件转为Excel文件
Jul 05 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
Oct 25 Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 Javascript
vue slot 在子组件中显示父组件传递的模板
Mar 02 Javascript
JavaScript中call和apply方法的区别实例分析
Aug 03 Javascript
React Component存在的几种形式详解
Nov 06 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
PHP数据类型之布尔型的介绍
2013/04/28 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
教大家制作简单的php日历
2015/11/17 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
使用Python的PEAK来适配协议的教程
2015/04/14 Python
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
python调用百度API实现人脸识别
2020/11/17 Python
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
安全教育月活动总结
2014/05/05 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
紧急迫降观后感
2015/06/15 职场文书
军训新闻稿范文
2015/07/17 职场文书
作文之亲情600字
2019/09/23 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python