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 相关文章推荐
javascript 动态生成私有变量访问器
Dec 06 Javascript
让textarea自动调整大小的js代码
Apr 12 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
Dec 21 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
Jan 17 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
Jun 26 Javascript
javascript实现倒计时N秒后网页自动跳转代码
Dec 11 Javascript
详细解读JavaScript编程中的Promise使用
Jul 27 Javascript
angularjs实现多张图片上传并预览功能
Feb 24 Javascript
vue-cli如何快速构建vue项目
Apr 26 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
Jun 29 Javascript
layui异步加载table表中某一列数据的例子
Sep 16 Javascript
js实现点击上传图片并设为模糊背景
Aug 02 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 大数据量及海量数据处理算法总结
2011/05/07 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
php fread读取文件注意事项
2016/09/24 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
Javascript 刷新全集常用代码
2009/11/22 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
python输出指定月份日历的方法
2015/04/23 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
django Serializer序列化使用方法详解
2018/10/16 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
心理健康课教学反思
2014/02/13 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
考察现实表现材料
2014/05/19 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
win10搭建配置ftp服务器的方法
2022/08/05 Servers