原生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 相关文章推荐
PJ Blog修改-禁止复制的代码和方法
Oct 25 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 Javascript
Javascript 面向对象 对象(Object)
May 13 Javascript
用jquery写的菜单从左往右滑动出现
Apr 11 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
js输出数据精确到小数点后n位代码
Jul 02 Javascript
d3.js中冷门却实用的内置函数总结
Feb 04 Javascript
Angular 如何使用第三方库的方法
Apr 18 Javascript
JavaScript门道之标准库
May 26 Javascript
react-native滑动吸顶效果的实现过程
Jun 03 Javascript
vue  elementUI 表单嵌套验证的实例代码
Nov 06 Javascript
Vue $emit()不能触发父组件方法的原因及解决
Jul 28 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
php 不同编码下的字符串长度区分
2009/09/26 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
基于Python os模块常用命令介绍
2017/11/03 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
详解python中的数据类型和控制流
2019/08/08 Python
wxPython实现文本框基础组件
2019/11/18 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
python 串行执行和并行执行实例
2020/04/30 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
美国旅游网站:Tours4Fun
2017/02/17 全球购物
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
竟聘演讲稿范文
2013/12/31 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
2014年导购员工作总结
2014/11/18 职场文书
支教个人总结
2015/03/04 职场文书
golang特有程序结构入门教程
2021/06/02 Python