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 事件绑定问题
Jan 01 Javascript
Javascript处理DOM元素事件实现代码
May 23 Javascript
jQuery实现折线图的方法
Feb 28 Javascript
PHP结合jQuery实现红蓝投票功能特效
Jul 22 Javascript
Bootstrap页面布局基础知识全面解析
Jun 13 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
Jul 15 Javascript
Javascript中this关键字指向问题的测试与详解
Aug 11 Javascript
基于vue2实现左滑删除功能
Nov 28 Javascript
vue-router传递参数的几种方式实例详解
Nov 13 Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 Javascript
javascript中正则表达式语法详解
Aug 07 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 cookie的操作实现代码(登录)
2010/12/29 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
laravel自定义分页效果
2017/07/23 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
详解python UDP 编程
2020/08/24 Python
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
战略合作意向书范本
2014/04/01 职场文书
龙门石窟导游词
2015/02/02 职场文书
义卖募捐活动总结
2015/05/09 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP