原生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 相关文章推荐
xml 封装与解析(javascript和C#中)
Jul 26 Javascript
javascript日期对象格式化为字符串的实现方法
Jan 14 Javascript
JavaScript实现拖拽网页内元素的方法
Apr 15 Javascript
Javascript 高阶函数使用介绍
Jun 15 Javascript
浅析JS异步加载进度条
May 05 Javascript
微信支付 JS API支付接口详解
Jul 11 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
Jul 22 jQuery
小程序rich-text组件如何改变内部img图片样式的方法
May 22 Javascript
Vue数据绑定实例写法
Aug 06 Javascript
解决layui的table插件无法多层级获取json数据的问题
Sep 19 Javascript
vue实现全屏滚动效果(非fullpage.js)
Mar 07 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代码
2008/09/10 PHP
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
php实现微信模板消息推送
2018/03/30 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
Python复制文件操作实例详解
2015/11/10 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
美国玩具公司:U.S.Toy
2018/05/19 全球购物
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
《望庐山瀑布》教学反思
2014/04/22 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
国际贸易专业求职信
2014/06/04 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
企业2014年度工作总结
2014/12/10 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书