原生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 相关文章推荐
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
jQuery实现鼠标滑过点击事件音效试听
Aug 31 Javascript
Bootstrap3.0学习教程之JS折叠插件
May 27 Javascript
深入理解(function(){... })();
Aug 16 Javascript
JavaScript中ES6字符串扩展方法
Aug 26 Javascript
分享JavaScript监听全部Ajax请求事件的方法
Aug 28 Javascript
js实现按钮控制带有停顿效果的图片滚动
Aug 30 Javascript
工厂模式在JS中的实践
Jan 18 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
Feb 10 Javascript
React全家桶环境搭建过程详解
May 18 Javascript
写一个Vue loading 插件
Nov 09 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
Python面向对象编程基础解析(一)
2017/10/26 Python
Python定时器实例代码
2017/11/01 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
关于python中的xpath解析定位
2020/03/06 Python
python中的django是做什么的
2020/07/31 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
硕士研究生自我鉴定
2013/11/08 职场文书
纪念建党演讲稿范文
2014/01/13 职场文书
学校万圣节活动方案
2014/02/13 职场文书
连带责任保证书
2014/04/29 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
高一军训口号
2015/12/25 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript