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 相关文章推荐
Js之软键盘实现(js源码)
Jan 30 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
JavaScript中的Web worker多线程API研究
Dec 06 Javascript
JavaScript实现列出数组中最长的连续数
Dec 29 Javascript
jQuery插件实现静态HTML验证码校验
Nov 06 Javascript
AngularJS基础 ng-model 指令详解及示例代码
Aug 02 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
Oct 27 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
May 26 Javascript
apicloud拉起小程序并传递参数的方法示例
Nov 21 Javascript
JavaScript中this的学习笔记及用法整理
Feb 17 Javascript
js+css3实现炫酷时钟
Aug 18 Javascript
浏览器JavaScript调试功能无法使用解决方案
Sep 18 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
PHP+ajax 无刷新删除数据
2010/02/20 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
php实现单链表的实例代码
2013/03/22 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
2018/08/27 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
Django学习笔记之Class-Based-View
2017/02/15 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
vscode调试django项目的方法
2020/08/06 Python
总裁岗位职责
2013/12/04 职场文书
小学语文业务学习材料
2014/06/02 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
门面房租房协议书
2014/08/20 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android