JavaScript实现拖拽元素对齐到网格(每次移动固定距离)


Posted in Javascript onNovember 30, 2016

这几天在做一个拖拽元素的附加功能,就是对齐到网格,实际上就是确定好元素的初始位置,然后拖拽元素时,每次移动固定的距离。让元素都可以在网格内对齐。先上效果图,然后在详细说明一下细节问题

JavaScript实现拖拽元素对齐到网格(每次移动固定距离)

做了一个gif图,可以看到,每次元素的移动都是按照最小单位距离移动的。且每次元素都是对齐到网格的。

先根据demo说明一下思路和细节,后面会给出demo代码。

1. 确定元素的每次移动的最小单位(demo中为10px和10px),也就是每次水平或垂直的位移量都是10px。铺上一层网格背景是为了帮助我们更好的看到效果(demo中的每个网格也是10px * 10px)。

2. 为了可以更加明显的看到效果,初始化了元素的宽高(均为10px的倍数)和默认位置(同样为10px的倍数)。举例说明:元素宽高 50px * 50px,元素的初始位置为0xp * 0px。这样做的好处是一开始加载时就可以保证元素覆盖整数个的小网格(也就是 5 * 5 个小网格),不会出现覆盖不完整的网格。这一条其实为了让用户或者有强迫症的人不用这么纠结,实际上只是一个美化规置位置的操作。懂的朋友可以不用这么刻意,明白就好。

3. 最重要就是要如何确定什么时候移动固定的距离。这个demo效果要明白一件事:鼠标移动和元素移动是对应的,但不是实时对等的(当然,如果不考虑最小单位,只是纯拖拽元素,然后将元素的位置设置为鼠标的位置,这时可以理解为鼠标移动和元素移动是实时对等的)。回到demo说明,鼠标在网页上移动时,是一个像素一个像素移动的(可以通过console.log(e.pageX) 观察鼠标移动的位置 )。而元素是每10px移动一次。这一点就是我们要理解的关键,也是整个demo的关键。

了解了上面的思路,结合代码和注释,再说明一下:

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
body{
margin:0px;
padding:0px;
}
div{
margin:0px;
padding:0px;
}
</style>
<script src="js/jquery-1.11.2.js"></script>
</head>
<body>
<div style="height: 600px;background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPiAgICA8ZGVmcz4gICAgICAgIDxwYXR0ZXJuIGlkPSJncmlkIiB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPiAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMTAgMCBMIDAgMCAwIDEwIiBmaWxsPSJub25lIiBzdHJva2U9IiNkZGRkZGQiIHN0cm9rZS13aWR0aD0iMSIgb3BhY2l0eT0iMSIgLz4gICAgICAgIDwvcGF0dGVybj4gICAgPC9kZWZzPiAgICA8cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyaWQpIiAvPjwvc3ZnPg==)">
<div id="bk" style="width:50px;height:50px;background: red;position: absolute"></div>
</div>
</body>
<script>
$(function(){
var orgX,orgY,eleX,eleY,hasMove=false;
$("#bk").on("mousedown",function(e){
orgX= e.pageX; //记录鼠标的水平位置
orgY= e.pageY; //记录鼠标的垂直位置
eleX=$(this).offset().left; //记录元素的水平位置
eleY=$(this).offset().top; //记录元素的垂直位置
hasMove=true; //鼠标按下时标明当前元素可以拖拽标识
});
$(document).on("mousemove",function(e){
if(hasMove){ //当元素可以拖拽时执行操作
//新位置计算方法为元素的上次位置加上新的位移量
var left=eleX+Math.round( ( e.pageX - orgX ) / 10 ) * 10;
var top= eleY+Math.round( ( e.pageY - orgY) / 10 ) * 10;
//更新位置信息
$("#bk").css({
top:top,
left:left
});
}
}).on("mouseup",function(e){
hasMove=false; //鼠标松开时设置元素不可拖拽
});
})
</script>
</html>

面的代码给出的较详细的注释,其中,最为关键的代码就是

Math.round( ( e.pageX - orgX ) / 10 ) * 10;

该代码是计算元素新的位移量,用鼠标的最新位置减去在元素按下时的鼠标位置,除以最小单位10,进行四舍五入后获得整数值,然后在乘以最小单位10。就可以获得元素应该需要移动的单位距离了。这条如果不明白可以运行代码自己思考体会一下。(当然使用Mach的ceil和floor方法也可以)。

okay,以上就是javascript实现拖拽元素对齐到网格的实现方法。实质上是在初始化好元素的位置后(按照最小单位倍数初始化),每次移动固定距离(最小单位距离)即可。

Javascript 相关文章推荐
jQuery Ajax文件上传(php)
Jun 16 Javascript
JSON 入门指南 想了解json的朋友可以看下
Aug 26 Javascript
javascript中的undefined 与 null 的区别  补充篇
Mar 17 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
jquery插件jTimer(jquery定时器)使用方法
Dec 23 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
Jan 13 Javascript
在JS数组特定索引处指定位置插入元素
Jul 27 Javascript
js游戏人物上下左右跑步效果代码分享
Aug 28 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
Sep 14 Javascript
chrome浏览器如何断点调试异步加载的JS
Sep 05 Javascript
基于javascript实现的购物商城商品倒计时实例
Dec 11 Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 Javascript
jquery.Callbacks的实现详解
Nov 30 #Javascript
javascript中活灵活现的Array对象详解
Nov 30 #Javascript
如何处理JSON中的特殊字符
Nov 30 #Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 #Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
Nov 30 #Javascript
浅析JavaScript中break、continue和return的区别
Nov 30 #Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 #Javascript
You might like
php横向重复区域显示二法
2008/09/25 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
Python中表示字符串的三种方法
2017/09/06 Python
python中logging包的使用总结
2018/02/28 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Python操作Jira库常用方法解析
2020/04/10 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
编写strcpy函数
2014/06/24 面试题
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
外企财务年会演讲稿
2014/01/03 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
李强为自己工作观后感
2015/06/11 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书