js实现限定范围拖拽的示例


Posted in Javascript onOctober 26, 2020

限定范围拖拽

目录

  • 代码实例
  • 与简易拖拽的差异
  • 下载源码链接 

代码实例

* {
 padding: 0;
 margin: 0;
}
#box1 {
 width: 500px;
 height: 500px;
 background: #999;
 position: relative;
 left: 100px;
 top: 100px;
}
#box {
 width: 100px;
 height: 100px;
 background: #334;
 position: absolute;
 cursor: move;
}

<div id="box1">
<div id="box"></div>
</div>

(function () {
 var dragging = false
 var boxX, boxY, mouseX, mouseY, offsetX, offsetY
 var box = document.getElementById('box')
 var box1 = document.getElementById('box1')

 // 鼠标按下的动作
 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 = box1.clientWidth - box.offsetWidth
   var height = box1.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
  }
 }
})()

与简易拖拽的差异

可移动位置的改变

// 此处就是父元素的宽度减去子元素宽度
var width = box1.clientWidth - box.offsetWidth
var height = box1.clientHeight - box.offsetHeight

下载源码链接

星辉的Github

以上就是js实现限定范围拖拽的示例的详细内容,更多关于js实现限定范围拖拽的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
Jun 17 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
Sep 02 Javascript
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
Jun 23 Javascript
使用AngularJS实现表单向导的方法
Jun 19 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
Nov 25 Javascript
原生JS实现左右箭头选择日期实例代码
Mar 14 Javascript
深入理解Puppeteer的入门教程和实践
Mar 05 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
Apr 15 Javascript
create-react-app中添加less支持的实现
Nov 15 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
Jan 18 Javascript
小程序开发之模态框组件封装
Apr 23 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
基于elementUI竖向表格、和并列的案例
Oct 26 #Javascript
You might like
yii框架中的Url生产问题小结
2012/01/16 PHP
解析php入库和出库
2013/06/25 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php简单获取目录列表的方法
2015/03/24 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
ext实现完整的登录代码
2008/08/08 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
Python通过future处理并发问题
2017/10/17 Python
python中itertools模块zip_longest函数详解
2018/06/12 Python
使用Tkinter制作信息提示框
2020/02/18 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
办公室助理岗位职责
2013/12/25 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
经营场所使用证明
2015/06/19 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
dubbo服务整合zipkin详解
2021/07/26 Java/Android