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 相关文章推荐
js中几种去掉字串左右空格的方法
Dec 25 Javascript
Jquery从头学起第四讲 jquery入门教程
Aug 01 Javascript
onbeforeunload与onunload事件异同点总结
Jun 24 Javascript
jquery实现弹出窗口效果的实例代码
Nov 28 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
express文件上传中间件Multer详解
Oct 24 Javascript
jquery css实现邮箱自动补全
Nov 14 Javascript
bootstrap datetimepicker2.3.11时间插件使用
Nov 19 Javascript
js中setTimeout的妙用--防止循环超时
Mar 06 Javascript
es6 字符串String的扩展(实例讲解)
Aug 03 Javascript
Jquery动态列功能完整实例
Aug 30 jQuery
vue实现图片上传功能
May 28 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
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
xmlHTTP实例
2006/10/24 Javascript
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
浅析Jquery操作select
2016/12/13 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
使用Python对MySQL数据操作
2017/04/06 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
法律七进实施方案
2014/03/15 职场文书
水知道答案观后感
2015/06/08 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
详细聊聊浏览器是如何看闭包的
2021/11/11 Javascript
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers