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 相关文章推荐
javascript中的注释使用与注意事项小结
Sep 20 Javascript
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
javascript中直接引用Microsoft的COM生成Word
Jan 20 Javascript
微信小程序 教程之wxapp视图容器 swiper
Oct 19 Javascript
实例解析jQuery工具函数
Dec 01 Javascript
微信小程序 图片上传实例详解
May 05 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
Jun 18 Javascript
js实现消灭星星(web简易版)
Mar 24 Javascript
Vue Object 的变化侦测实现代码
Apr 15 Javascript
JavaScript中reduce()的5个基本用法示例
Jul 19 Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
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 Google的translate API代码
2008/12/10 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
如何用php获取文件名后缀
2013/06/09 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
PHP getName()函数讲解
2019/02/03 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
原生javascript和jquery判断浏览器版本等信息
2013/07/04 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
2016/02/16 Javascript
js面向对象的写法
2016/02/19 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
Mac安装python3的方法步骤
2019/08/09 Python
Python xlwt模块使用代码实例
2020/06/10 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
中专生毕业自我鉴定
2013/11/01 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
家长给学校的建议书
2014/05/15 职场文书
本科生求职信
2014/06/17 职场文书
政府四风问题整改措施
2014/10/04 职场文书
2014年工程师工作总结
2014/11/25 职场文书
2016猴年春节问候语
2015/11/11 职场文书
导游词之西安骊山
2019/12/20 职场文书