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 相关文章推荐
自己开发Dojo的建议框架
Sep 24 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
Sep 14 Javascript
javascript中常用编程知识
Apr 08 Javascript
不使用浏览器运行javascript代码的方法
Jul 24 Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 Javascript
JavaScript是如何实现继承的(六种方式)
Mar 31 Javascript
js方法数据验证的简单实例
Sep 17 Javascript
Servlet实现文件上传,可多文件上传示例
Dec 05 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
小程序分页实践之编写可复用分页组件
Jul 18 Javascript
vue-cli3配置与跨域处理方法
Aug 17 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通用防注入程序 推荐
2011/02/26 PHP
php使用websocket示例详解
2014/03/12 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
smarty中js的调用方法示例
2014/10/27 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
JS 面向对象之神奇的prototype
2011/02/26 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python、Javascript中的闭包比较
2015/02/04 Python
python获取当前日期和时间的方法
2015/04/30 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Python中str.join()简单用法示例
2018/03/20 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
HTML5中的Scoped属性使用实例
2014/04/23 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
农业开发项目建议书
2014/05/16 职场文书
服务标语大全
2014/06/18 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
党员干部学习心得体会
2016/01/23 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android