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自动完成插件(autocomplete)应用之PHP版
Dec 15 Javascript
基于JQuery.timer插件实现一个计时器
Apr 25 Javascript
js简单实现用户注册信息的校验代码
Nov 15 Javascript
编写自己的jQuery提示框(Tip)插件
Feb 05 Javascript
JavaScript获取并更改input标签name属性的方法
Jul 02 Javascript
jQuery ajax时间差导致的变量赋值问题分析
Jan 22 Javascript
Jquery zTree 树控件异步加载操作
Feb 25 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
Aug 06 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
Feb 22 Javascript
详解vue组件开发脚手架
Jun 15 Javascript
vue el-table实现行内编辑功能
Dec 11 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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
PHP生成唯一订单号
2015/07/05 PHP
PHP实现微信发红包程序
2015/08/24 PHP
php连接mysql数据库
2017/03/21 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
python生成excel的实例代码
2017/11/08 Python
Python递归函数实例讲解
2019/02/27 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
django如何自己创建一个中间件
2019/07/24 Python
python web框架 django wsgi原理解析
2019/08/20 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
惠普新加坡官方商店:HP Singapore
2020/04/17 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
有个性的自我评价范文
2013/11/15 职场文书
预备党员综合考察材料
2014/05/31 职场文书
社会发展项目建议书
2014/08/25 职场文书
幼师个人总结范文
2015/02/28 职场文书
反邪教观后感
2015/06/11 职场文书
学校少先队工作总结
2015/08/12 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
python 制作一个gui界面的翻译工具
2021/05/14 Python
利用Java连接Hadoop进行编程
2022/06/28 Java/Android