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 脚本将当地时间转换成其它时区
Mar 19 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 Javascript
jquery+json实现动态商品内容展示的方法
Jan 14 Javascript
带有定位当前位置的百度地图前端web api实例代码
Jun 21 Javascript
JS传值出现中文参数乱码的解决方法
Jun 30 Javascript
Summernote实现图片上传功能的简单方法
Jul 11 Javascript
只需五句话搞定JavaScript作用域(经典)
Jul 26 Javascript
jquery中有哪些api jQuery主要API
Nov 20 jQuery
JS设计模式之访问者模式定义与用法分析
Feb 05 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
Feb 10 Javascript
vue实现数据控制视图的原理解析
Jan 07 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
Feb 27 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
计数器详细设计
2006/10/09 PHP
聊天室php&amp;mysql(四)
2006/10/09 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
js实现点击左右按钮轮播图片效果实例
2015/01/29 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
Python文件操作类操作实例详解
2014/07/11 Python
Python中List.index()方法的使用教程
2015/05/20 Python
python中format()函数的简单使用教程
2018/03/14 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
Python 如何批量更新已安装的库
2020/05/26 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
一道SQL面试题
2012/12/31 面试题
个人借款担保书
2014/04/02 职场文书
工作鉴定评语
2014/05/04 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
Go语言基础知识点介绍
2021/07/04 Golang
如何利用golang运用mysql数据库
2022/03/13 Golang
java版 联机五子棋游戏
2022/05/04 Java/Android