原生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中交替点击事件的实现代码
Feb 14 Javascript
jQuery获取选中内容及设置元素属性的方法
Jul 09 Javascript
node.js中的fs.fchmodSync方法使用说明
Dec 16 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
JavaScript动态加载样式表的方法
Mar 21 Javascript
JS 作用域与作用域链详解
Apr 07 Javascript
简单谈谈Javascript中类型的判断
Oct 19 Javascript
JS简单实现String转Date的方法
Mar 02 Javascript
利用JQuery阻止事件冒泡
Dec 01 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
Jul 25 Javascript
详解vue-router的Import异步加载模块问题的解决方案
May 13 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
May 20 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设计模式之装饰者模式
2012/02/29 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
Python读取键盘输入的2种方法
2015/06/16 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
重构Python代码的六个实例
2020/11/25 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
护士实习鉴定范文
2013/12/22 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript