原生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 相关文章推荐
select标签模拟/美化方法采用JS外挂式插件
Apr 01 Javascript
jquery获取自定义属性(attr和prop)实例介绍
Apr 21 Javascript
js中function()使用方法
Dec 24 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
JQuery Mobile 弹出式登录框的实现方法
May 28 Javascript
javascript prototype原型详解(比较基础)
Dec 26 Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
Nov 07 Javascript
微信小程序实现列表下拉刷新上拉加载
Jul 29 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
一个基于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创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
php动态变量定义及使用
2015/06/10 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
非主流的textarea自增长实现js代码
2011/12/20 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
python采集微信公众号文章
2018/12/20 Python
numpy基础教程之np.linalg
2019/02/12 Python
python日期相关操作实例小结
2019/06/24 Python
Python datetime模块使用方法小结
2020/06/18 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
Python Selenium库的基本使用教程
2021/01/04 Python
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
岗位明星事迹材料
2014/05/18 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2014年文员工作总结
2014/11/18 职场文书
复兴之路观后感
2015/06/02 职场文书
小学生家长意见
2015/06/03 职场文书
紫日观后感
2015/06/05 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS