js实现简易拖拽的示例


Posted in Javascript onOctober 26, 2020

简易拖拽

目录

  • 代码实例
  • 代码解析
  • scrollWidth,clientWidth,offsetWidth的区别
  • offsetX,clientX,pageX的辨析
  • 下载源码链接 

代码实例

<div id="box" style="background: #334;width: 100px;height: 100px;position: absolute;cursor: move;"></div>

(function () {
 var dragging = false
 var boxX, boxY, mouseX, mouseY, offsetX, offsetY
 var box = document.getElementById('box')

 // 鼠标按下的动作
 box.onmousedown = down
 // 鼠标的移动动作
 document.onmousemove = move
 // 释放鼠标的动作
 document.onmouseup = up

 // 鼠标按下后的函数,e为事件对象
 function down(e) {
  dragging = true

  // 获取元素所在的坐标
  boxX = box.offsetLeft
  boxY = box.offsetTop

  // 获取鼠标所在的坐标
  mouseX = parseInt(getMouseXY(e).x)
  mouseY = parseInt(getMouseXY(e).y)

  // 鼠标相对元素左和上边缘的坐标
  offsetX = mouseX - boxX
  offsetY = mouseY - boxY
 }

 // 鼠标移动调用的函数
 function move(e){
  if (dragging) {
   // 获取移动后的元素的坐标
   var x = getMouseXY(e).x - offsetX
   var y = getMouseXY(e).y - offsetY

   // 计算可移动位置的大小, 保证元素不会超过可移动范围
   var width = document.documentElement.clientWidth - box.offsetWidth
   var height = document.documentElement.clientHeight - box.offsetHeight

   // min方法保证不会超过右边界,max保证不会超过左边界
   x = Math.min(Math.max(0, x), width)
   y = Math.min(Math.max(0, y), height)

   // 给元素及时定位
   box.style.left = x + 'px'
   box.style.top = y + 'px'
  }
 }

 // 释放鼠标的函数
 function up(e){
  dragging = false
 }

 // 函数用于获取鼠标的位置
 function getMouseXY(e){
  var x = 0, y = 0
  e = e || window.event

  if (e.pageX) {
   x = e.pageX
   y = e.pageY
  } else {
   x = e.clientX + document.body.scrollLeft - document.body.clientLeft
   y = e.clientY + document.body.scrollTop - document.body.clientTop
  }

  return {
   x: x,
   y: y
  }
 }
})()

代码解析

在 document 对象上绑定 mousemove 和 mouseup 事件,不在拖拽的元素上绑定是因为当鼠标移动太快而超出元素的范围时会停止拖拽,而绑定在 document 上则可以避免这样的事情发生。拖拽再快都不会超出 document 的范围。

// 鼠标按下的动作
box.onmousedown = down
// 鼠标的移动动作
document.onmousemove = move
// 释放鼠标的动作
document.onmouseup = up

HTMLElement.offsetLeft是一个只读属性,返回当前元素左上角相对于HTMLElement.offsetParent 节点的左边界偏移的像素值。

// 获取元素所在的坐标
boxX = box.offsetLeft
boxY = box.offsetTop

一般鼠标的位置使用 pageX / pageY 获取,但是 IE 不支持这两个属性。所以在 IE 中使用 event.clientX + document.body.scrollLeft - document.body.clientLeft; 获取鼠标的位置

if (e.pageX) {
 x = e.pageX
 y = e.pageY
} else {
 x = e.clientX + document.body.scrollLeft - document.body.clientLeft
 y = e.clientY + document.body.scrollTop - document.body.clientTop
}

scrollWidth,clientWidth,offsetWidth的区别

定义

  • scrollWidth:对象的实际内容的宽度,不包括边线宽度 
  • clientWidth:对象内容的可视区的宽度,不包括边线宽度 
  • offsetWidth:对象整体的实际宽度,包括滚动条等边线

情况一

元素内无内容或者内容不超过可视区,滚动不出现或不可用 
scrollWidth = clientWidth 
offsetWidth为元素的实际宽度

情况二

元素的内容超过可视区,滚动条出现和可用 
scrollWidth > clientWidth 
offsetWidth为元素的实际宽度

offsetX,clientX,pageX的辨析

offsetX,offsetY

指鼠标指针相对于触发事件元素的左上角的偏移,在Chrome,Opera,Safari中指外边缘,即将该元素边框的宽度计算在内,firefox则不包含边框值

pageX,pageY

指相对文档窗口左上角的距离,不会随滚动条移动

clientX,clientY

指相对于浏览器可视窗口左上角的距离,参照点会随滚动条滚动而移动 

下载源码链接

星辉的Github

以上就是js实现简易拖拽的示例的详细内容,更多关于js实现简易拖拽的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jquery中通过过滤器获取表单元素的实现代码
Jul 05 Javascript
js的表单操作 简单计算器
Dec 29 Javascript
原生javascript实现图片按钮切换
Jan 12 Javascript
举例讲解AngularJS中的模块
Jun 17 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
深入理解jQuery3.0的domManip函数
Sep 01 Javascript
详解使用VueJS开发项目中的兼容问题
Aug 02 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
Mar 19 jQuery
Layui实现带查询条件的分页
Jul 27 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
Aug 01 Javascript
ES6 Promise对象概念及用法实例详解
Oct 15 Javascript
js实现限定范围拖拽的示例
Oct 26 #Javascript
js实现磁性吸附的示例
Oct 26 #Javascript
如何构建一个Vue插件并生成npm包
Oct 26 #Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 #Javascript
vue实现前端列表多条件筛选
Oct 26 #Javascript
vue实现单一筛选、删除筛选条件
Oct 26 #Javascript
vue通过接口直接下载java生成好的Excel表格案例
Oct 26 #Javascript
You might like
Discuz! Passport 通行证整合
2008/03/27 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
Python手机号码归属地查询代码
2016/05/04 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
通过cmd进入python的实例操作
2019/06/26 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
房地产开发计划书
2014/01/10 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Golang并发工具Singleflight
2022/05/06 Golang