原生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 相关文章推荐
Javascript 检测键盘按键信息及键码值对应介绍
Jan 03 Javascript
javascript制作loading动画效果 loading效果
Jan 14 Javascript
JavaScript里四舍五入函数round用法实例
Apr 06 Javascript
js运动应用实例解析
Dec 28 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
May 25 Javascript
AngularJS实现根据不同条件显示不同控件
Apr 20 Javascript
React Native之prop-types进行属性确认详解
Dec 19 Javascript
JavaScript链式调用实例浅析
Dec 19 Javascript
javascript实现页面的实时时钟显示示例
Aug 06 Javascript
Vue如何实现验证码输入交互
Dec 07 Vue.js
通过滑动翻页效果实现和移动端click事件问题
Jan 26 Javascript
js不常见操作运算符总结
Nov 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中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
jQuery UI Dialog 创建友好的弹出对话框实现代码
2012/04/12 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
windows下python之mysqldb模块安装方法
2017/09/07 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
Django权限机制实现代码详解
2018/02/05 Python
Python iter()函数用法实例分析
2018/03/17 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
Django发送邮件功能实例详解
2019/09/02 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
Python模块相关知识点小结
2020/03/09 Python
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
金融专业个人的自我评价
2013/10/18 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
国际贸易求职信
2014/07/05 职场文书
档案接收函格式
2015/01/30 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
歌剧魅影观后感
2015/06/05 职场文书
中学团支部工作总结
2015/08/13 职场文书