原生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编程开发中的五个实用小技巧
Jul 22 Javascript
jquery遍历数组与筛选数组的方法
Nov 05 Javascript
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 Javascript
javascript实现日期时间动态显示示例代码
Sep 08 Javascript
jQuery stop()用法实例详解
Jul 28 Javascript
node.js爬虫爬取拉勾网职位信息
Mar 14 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
Apr 27 jQuery
js数字滑动时钟的简单实现(示例讲解)
Aug 14 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
如何利用ES6进行Promise封装总结
Feb 11 Javascript
JS实现简单日历特效
Jan 03 Javascript
Vite和Vue CLI的优劣
Jan 30 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实现mysql数据库备份类
2008/03/20 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python使用folium excel绘制point
2019/01/03 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
python实现视频读取和转化图片
2019/12/10 Python
Python-opencv 双线性插值实例
2020/01/17 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
大四学生毕业自荐信
2013/11/07 职场文书
项目建议书模板
2014/05/12 职场文书
活动总结格式
2014/08/30 职场文书
安全责任书
2015/01/29 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书