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)

  // 磁性吸附部分
  if (x < RANGE) {x = 0}
  if (width - x < RANGE) {x = width}
  if (y < RANGE) {y = 0}
  if (height - y < RANGE) {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
 }
 }
})()

与限定范围拖拽的差异

添加磁性吸附部分

// 磁性吸附部分
if (x < RANGE) {x = 0}
if (width - x < RANGE) {x = width}
if (y < RANGE) {y = 0}
if (height - y < RANGE) {y = height}

下载源码链接

星辉的Github

以上就是js实现磁性吸附的示例的详细内容,更多关于js实现磁性吸附的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
用JQuery 实现的自定义对话框
Mar 24 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
Apr 13 Javascript
Javascript实现重力弹跳拖拽运动效果示例
Jun 28 Javascript
jQuery分别获取选中的复选框值的示例
Jun 17 Javascript
只需五句话搞定JavaScript作用域(经典)
Jul 26 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
Sep 07 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
Feb 02 Javascript
详解Node 定时器
Feb 26 Javascript
layui的table中显示图片方法
Aug 17 Javascript
vue-router之nuxt动态路由设置的两种方法小结
Sep 26 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
JS轮播图的实现方法2
Aug 25 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
原生js实现贪吃蛇游戏
Oct 26 #Javascript
You might like
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
php图片添加水印例子
2016/07/20 PHP
PHP 断点续传实例详解
2017/11/11 PHP
js Event对象的5种坐标
2011/09/12 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python随机生成彩票号码的方法
2015/03/05 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
python ---lambda匿名函数介绍
2019/03/13 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
为什么group by 和order by会使查询变慢
2014/05/16 面试题
现场施工员岗位职责
2015/04/11 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
Nginx的基本概念和原理
2022/03/21 Servers
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技