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 学习笔记 选择器之三
Jul 23 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
May 05 Javascript
利用js(jquery)操作Cookie的方法说明
Dec 19 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 Javascript
超级简单实现JavaScript MVC 样式框架
Mar 24 Javascript
javascript关于open.window子页面执行完成后刷新父页面的问题分析
Apr 27 Javascript
简介JavaScript中的italics()方法的使用
Jun 08 Javascript
深入探究使JavaScript动画流畅的一些方法
Jun 30 Javascript
angular.bind使用心得
Oct 26 Javascript
基于socket.io+express实现多房间聊天
Mar 17 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 Javascript
基于Cesium绘制抛物弧线
Nov 18 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
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
React快速入门教程
2017/01/17 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
js实现简单的秒表
2020/01/16 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
node.js基础知识汇总
2020/08/25 Javascript
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
使用python在本地电脑上快速处理数据
2017/06/22 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
Python读取指定日期邮件的实例
2019/02/01 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
浅析python函数式编程
2020/09/26 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
2014年小班元旦活动方案
2014/02/16 职场文书
优秀学生评语大全
2014/04/25 职场文书
机电一体化专业求职信
2014/07/22 职场文书
创业计划书之美甲店
2019/09/20 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android