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.ajax)
Nov 19 Javascript
Ext 表单布局实例代码
Apr 30 Javascript
Javascript倒计时代码
Aug 12 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
bootstrap实现每隔5秒自动轮播效果
Dec 20 Javascript
CodeMirror js代码加亮使用总结
Mar 25 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
Nov 28 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
Aug 20 Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 Javascript
详细分析Node.js 多进程
Jun 22 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 str_pad 函数用法简介
2009/07/11 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
详解node.js 事件循环
2020/07/22 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
Python利用IPython提高开发效率
2016/08/10 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
合作意向书
2014/07/30 职场文书
2014年国庆节演讲稿精选范文1500字
2014/09/25 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
预备党员入党感想
2015/08/10 职场文书
《月光曲》教学反思
2016/02/16 职场文书
创业计划书之酒吧
2019/12/02 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技