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 相关文章推荐
Prototype String对象 学习
Jul 19 Javascript
浅析jQuery中常用的元素查找方法总结
Jul 04 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
jQuery检测某个元素是否存在代码分享
Jul 09 Javascript
js表单验证实例讲解
Mar 31 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
小程序开发之模态框组件封装
Apr 23 Javascript
layui实现显示数据表格、搜索和修改功能示例
Jun 03 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 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
通过文字传递创建的图形按钮
2006/10/09 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
jQuery操作select的实例代码
2012/06/14 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
Python实现Const详解
2015/01/27 Python
浅析Python中的join()方法的使用
2015/05/19 Python
Python运算符重载用法实例分析
2015/06/01 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
Python单向链表和双向链表原理与用法实例详解
2018/08/31 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
python面向对象法实现图书管理系统
2019/04/19 Python
Django的Modelforms用法简介
2019/07/27 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
大学新生军训个人的自我评价
2013/10/03 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
设备管理实施方案
2014/05/31 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
毕业论文致谢信
2015/05/14 职场文书