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 相关文章推荐
禁止你的左键复制实用技巧
Jan 04 Javascript
jQuery实现图片信息的浮动显示实例代码
Aug 28 Javascript
JS.elementGetStyle(element, style)应用示例
Sep 24 Javascript
javascript中的self和this用法小结
Feb 08 Javascript
js简单实现交换Li的值
May 22 Javascript
jQuery实现强制cookie过期方法汇总
May 22 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
Feb 15 Javascript
jQuery中slidedown与slideup方法用法示例
Sep 16 Javascript
详解Angular.js指令中scope类型的几种特殊情况
Feb 21 Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 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
模仿OSO的论坛(三)
2006/10/09 PHP
自己前几天写的无限分类类
2007/02/14 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
PHP解析RSS的方法
2015/03/05 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
smarty中常用方法实例总结
2015/08/07 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
PHP7 windows支持
2021/03/09 PHP
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
python中迭代器(iterator)用法实例分析
2015/04/29 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
Python实现结构体代码实例
2020/02/10 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
党在我心中演讲稿
2014/09/02 职场文书
党支部评议意见
2015/06/02 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
windows server2008 开启端口的实现方法
2022/06/25 Servers