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停止输出代码
Jul 20 Javascript
javascript一些不错的函数脚本代码
Sep 10 Javascript
IE6、IE7中获取Button元素的值的bug说明
Aug 28 Javascript
JS注释所产生的bug 即使注释也会执行
Nov 19 Javascript
JS中自定义定时器让它在某一时刻执行
Sep 02 Javascript
angular实现form验证实例代码
Jan 17 Javascript
Vuex之理解Store的用法
Apr 19 Javascript
微信小程序使用for循环动态渲染页面操作示例
Dec 25 Javascript
jQuery.parseJSON()函数详解
Feb 28 jQuery
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
微信小程序可滑动月日历组件使用详解
Oct 21 Javascript
微信小程序音乐播放器开发
Nov 20 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
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
YII框架http缓存操作示例
2019/04/29 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jquery图片切换插件
2015/03/16 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Python 闭包的使用方法
2017/09/07 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
python使用配置文件过程详解
2019/12/28 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
计算机应用专业自荐信
2014/07/05 职场文书
村道德模范事迹材料
2014/08/28 职场文书
生活小常识广播稿
2014/09/16 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
2015初中团委工作总结
2015/07/28 职场文书
班主任培训研修日志
2015/11/13 职场文书
比较node.js和Deno
2021/04/27 Javascript
Win11筛选键导致键盘失灵怎么解决? Win11关闭筛选键的技巧
2022/04/08 数码科技