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

作者:星辉 时间:2024-04-29 13:38:55 

限定范围拖拽

目录

  • 代码实例

  • 与简易拖拽的差异

  • 下载源码链接 

代码实例


* {
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

来源:https://cloud.tencent.com/developer/article/1383245

标签:js,限定,范围拖拽
0
投稿

猜你喜欢

  • Python实现简单的列表冒泡排序和反转列表操作示例

    2022-10-18 08:46:04
  • Python编程根据字典列表相同键的值进行合并

    2023-09-29 20:10:54
  • Python 自动补全(vim)

    2021-11-06 16:54:42
  • 给展示性图片增加提示工具条(黑白效果)

    2007-10-20 14:21:00
  • 写给JavaScript库开发者们的规则

    2008-10-26 12:30:00
  • Vue循环组件加validate多表单验证的实例

    2024-05-05 09:23:39
  • JavaScript初级教程(第五课续)第1/3页

    2024-04-17 10:10:07
  • 浅谈如何提高PHP代码的质量

    2024-06-05 09:47:05
  • vue之封装多个组件调用同一接口的案例

    2024-04-09 10:47:32
  • matplotlib部件之矩形选区(RectangleSelector)的实现

    2023-02-27 04:07:59
  • Go语言的反射机制详解

    2024-05-09 14:58:51
  • 一文带你深入探索Golang操作mongodb的方法

    2024-05-09 09:46:14
  • 一篇文章弄懂MySQL查询语句的执行过程

    2024-01-23 20:26:05
  • Django ForeignKey与数据库的FOREIGN KEY约束详解

    2024-01-18 15:17:40
  • 人性化网页设计技巧

    2007-10-15 13:02:00
  • asp如何用数据库制作一个多用户版的计数器?

    2010-06-16 09:51:00
  • python关于变量名的基础知识点

    2023-07-27 14:21:43
  • 处理及遍历XML文档DOM元素属性及方法整理

    2024-05-13 10:39:38
  • PHP图片库imagemagick安装方法

    2023-11-16 18:54:38
  • ASP中使用存储过程介绍

    2008-10-10 12:10:00
  • asp之家 网络编程 m.aspxhome.com