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 相关文章推荐
解析Javascript中大括号“{}”的多义性
Dec 02 Javascript
angularjs中的单元测试实例
Dec 06 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
Dec 17 Javascript
webapp框架AngularUI的demo改造之路
Dec 21 Javascript
JavaScript操作URL的相关内容集锦
Oct 29 Javascript
JS实现图片高亮展示效果实例
Nov 24 Javascript
原生JS获取元素集合的子元素宽度实例
Dec 14 Javascript
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
让axios发送表单请求形式的键值对post数据的实例
Aug 11 Javascript
angularJs中$scope数据序列化的实例
Sep 30 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
Oct 09 Javascript
vue实现搜索过滤效果
May 28 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网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
Vue2路由动画效果的实现代码
2017/07/10 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
Element Badge标记的使用方法
2020/07/27 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
js实现抽奖功能
2020/11/24 Javascript
python ansible服务及剧本编写
2017/12/29 Python
pytorch 修改预训练model实例
2020/01/18 Python
python的sys.path模块路径添加方式
2020/03/09 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
自动化专业个人求职信范文
2013/11/29 职场文书
自立自强的名人事例
2014/02/10 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
毕业生求职信范文
2014/06/29 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
vue 给数组添加新对象并赋值
2022/04/20 Vue.js