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 相关文章推荐
20个最新的jQuery插件
Jan 13 Javascript
jquery 触发a链接点击事件解决方案
May 02 Javascript
node.js中的fs.read方法使用说明
Dec 17 Javascript
jQuery UI Bootstrap是什么?
Jun 17 Javascript
纯JS前端实现分页代码
Jun 21 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
Sep 17 Javascript
JS Select下拉框(支持输入模糊查询)
Feb 04 Javascript
JS实现百度搜索接口及链接功能实例代码
Feb 02 Javascript
Vue.js 中的 v-cloak 指令及使用详解
Nov 19 Javascript
vue中的面包屑导航组件实例代码
Jul 01 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
Aug 28 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 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
使用PHP制作新闻系统的思路
2006/10/09 PHP
PHP strtr() 函数使用说明
2008/11/21 PHP
Symfony控制层深入详解
2016/03/17 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
javascript实现yield的方法
2013/11/06 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
python 命令行传入参数实现解析
2019/08/30 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
Python telnet登陆功能实现代码
2020/04/16 Python
python如何查看安装了的模块
2020/06/23 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
建筑总经理岗位职责
2014/02/02 职场文书
《画家乡》教学反思
2014/04/22 职场文书
英语分层教学实施方案
2014/06/15 职场文书
会计试用期自我评价
2015/03/10 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python
Python如何将list中的string转换为int
2022/07/15 Ruby