原生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 相关文章推荐
js 判断 enter 事件
Feb 12 Javascript
JQuery切换显示的效果实例代码
Feb 27 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
Js为表单动态添加节点内容的方法
Feb 10 Javascript
Node.js读写文件之批量替换图片的实现方法
Sep 07 Javascript
Vue组件开发初探
Feb 14 Javascript
Vue.js 2.0学习教程之从基础到组件详解
Apr 24 Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 Javascript
vue拖拽组件使用方法详解
Dec 01 Javascript
高性能js数组去重(12种方法,史上最全)
Dec 21 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
Sep 12 Javascript
mapboxgl实现带箭头轨迹线的代码
Jan 04 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
mysq GBKl乱码
2006/11/28 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php页面防重复提交方法总结
2013/11/25 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
php利用header函数下载各种文件
2016/08/24 PHP
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
创业计划书中要认真思考的问题
2013/12/28 职场文书
房屋租赁意向书
2014/04/01 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
2015年司机工作总结
2015/04/23 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
大一新生军训新闻稿
2015/07/17 职场文书