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 相关文章推荐
IE Firefox 使用自定义标签的区别
Oct 15 Javascript
xml文档转换工具,附图表例子(hta)
Nov 17 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
js将字符串转成正则表达式的实现方法
Nov 13 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
Sep 04 Javascript
Bootstrap Modal遮罩弹出层(完整版)
Nov 21 Javascript
Javascript 实现放大镜效果实例详解
Dec 03 Javascript
微信小程序 基础组件与导航组件详细介绍
Feb 21 Javascript
vue中使用codemirror的实例详解
Nov 01 Javascript
vue+element UI实现树形表格带复选框的示例代码
Apr 16 Javascript
vue实现移动端省市区选择
Sep 27 Javascript
一分钟学会JavaScript中的try-catch
Dec 14 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 编写的日历
2006/10/09 PHP
php购物车实现代码
2011/10/10 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
javascript控制台详解
2015/06/25 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
Python数据结构之Array用法实例
2014/10/09 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python os用法总结
2018/06/08 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
文职个人求职信范文
2013/09/23 职场文书
会计系中文个人求职信
2013/12/24 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
孩子教育的心得体会
2014/09/01 职场文书
2014教师党员自我评议总结
2014/09/19 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
课改心得体会范文
2016/01/25 职场文书
资产移交协议书
2016/03/24 职场文书