js实现回放拖拽轨迹从过程上进行分析


Posted in Javascript onJune 26, 2014

今天有点小高兴,csdn博客浏览量过万了,在过去还从来没有过这么高的浏览量呢,不得不说,太多时候还是有些矫情,可看到这些鼓励还是忍不住高兴啊,至少,这样让我有一种行内人员的感觉,吾道不孤啊。

闲话不多说,继续今天的记录,记录回放拖拽痕迹,先从过程上进行分析:

1、要实现回放拖拽痕迹,则必须先有记录;

2、要记录拖拽痕迹,则必须要实现拖拽;

这个问题前几天曾经做到过,当时实现的也略有瑕疵,但大致的实现方法已经了然于胸,所以今天在实现这个问题的时候速度快了不少,着实高兴了一番,今天再实现了一遍之后理解上又深了一点,那就今天再来记录下;

至于记录拖拽痕迹,这个分析就来长话短说,毕竟做过一次了:

1、确定现在div的位置和状态,保证absolute才能实现拖动;

2、监听鼠标拖动事件(昨天总结的几种鼠标事件);

3、根据相应的鼠标事件,做出相应的响应,在onmousemove拖拽中记录div存在过的点;

4、监听鼠标弹起事件,来结束拖拽事件和点的记录

任然是先来实现下代码(这里将所有代码同时列出,后面逐一分析):

html语言:

<div style="width: 50px;height: 50px;background-color: cyan;display: block;position: absolute;" id="showZone"></div>//这个还是那么熟悉啊 
<a href="#" style="position: absolute;margin-top: 100px;color: yellow;background-color: red;">reback</a>//这个是来回放的

javascript部分:

window.onload=function(){ 
var obj=document.getElementById("showZone"); 
var disX=disY=0; 
var dragIf=false; 
var position=[{x:obj.offsetLeft,y:obj.offsetTop}];//这个是实现记录和回放的关键,其它都是基本元素的获取 
var oa=document.getElementsByTagName("a")[0]; 

obj.onmousedown=function(event){ 
var event=event||window.event; 
disX=event.clientX-obj.offsetLeft;//鼠标相对于div边框的距离 
disY=event.clientY-obj.offsetTop; 
dragIf=true;//可以进行拖拽的标志 

position.push({x:obj.offsetLeft,y:obj.offsetTop});//记录从这时候就开始了 
return false; 
}; 
document.onmousemove=function(event){ 

if(!dragIf)return;//这个判断极为重要,只有按下的移动才有效 
var event=event||window.event; 
var nowX=event.clientX-disX;//根据上面记录的鼠标相对div的距离就知道div相对网页的距离了吧 
var nowY=event.clientY-disY; 
var maxX=document.documentElement.clientWidth-obj.offsetWidth;//这里是offsetWidth,是div的宽度,不是offsetLeft 
var maxY=document.documentElement.clientHeight-obj.offsetHeight; 
nowX=nowX<0?0:nowX;//这些判定,只是判断不要出了边界 
nowY=nowY<0?0:nowY; 
nowX=nowX>maxX?maxX:nowX; 
nowY=nowY>maxY?maxY:nowY; 

obj.style.marginTop=obj.style.marginLeft=0; 
obj.style.left=nowX+"px";//不要忘记+“px”,只有style.left/top是有“px”的 
obj.style.top=nowY+"px"; 
position.push({x:nowX,y:nowY});//不停记录啊 
obj.innerHTML="X:"+nowX+"Y:"+nowY;//直观的看到变化 
return false; 
}; 
document.onmouseup=function(){ 
dragIf=false;//不允许再进行拖拽和记录了 
obj.innerHTML="X:"+obj.offsetLeft+"Y:"+obj.offsetTop; 
}; 
oa.onclick = function (){ 
if (position.length == 1) return;//只有一个的时候,说明并未移动 
var timer = setInterval(function (){ 
var oPos = position.pop(); 
oPos ? (obj.style.left = oPos.x + "px", obj.style.top = oPos.y + "px") : clearInterval(timer);//又被这个写法惊艳到 
}, 30); 
return false; 
}; 
};

需要注意的关键点,简要说几个:

1、var position数组,点的集合:这个点,是以div的左上角的移动点,也就是说我们记录的移动轨迹实际上就是div左上角的点的集合,offsetLeft为x坐标,offsetTop为y坐标,这个坐标轴你知道怎么画不;

2、程序中出现的几个长度或距离:offsetLeft、clientX、offsetWidth、style.left和document.documentElement.clientWidth等等;

3、push()方法:向数组末尾添加元素,改变数组长度,末尾哦;

4、pop()方法:删除并返回数组的最后一个元素,关键点有两个,其一:返回最后一个元素;其二:删除元素,数组长度变小;

这样我们实现了倒着回放,实现原理就不用多说了吧,如果要是正着回放,我们是不是就要获取并删除数组的第一个值了,哈,试着动手写写看吧。

不得不说还是用鼠标拖起来舒服,键盘移动太不方便了,用鼠标可以肆无忌惮的拖拽啊.....天已入伏,要热,今天倒还好....

Javascript 相关文章推荐
巧用jQuery选择器提高写表单效率的方法
Aug 19 Javascript
js制作可以延时消失的菜单
Jan 13 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
Vue3.0中的monorepo管理模式的实现
Oct 14 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
Dec 04 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 Javascript
JavaScript ES6 Class类实现原理详解
May 08 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 Javascript
详解React 元素渲染
Jul 07 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
JS前端可扩展的低代码UI框架Sunmao使用详解
Jul 23 Javascript
JS的事件绑定深入认识
Jun 26 #Javascript
jquery 页眉单行信息滚动显示实现思路及代码
Jun 26 #Javascript
jquery的clone方法应用于textarea和select的bug修复
Jun 26 #Javascript
document.forms用法示例介绍
Jun 26 #Javascript
JS获取当前日期时间并定时刷新示例
Mar 04 #Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 #Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
Jun 26 #Javascript
You might like
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
php中目录,文件操作详谈
2007/03/19 PHP
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
Javascript 获取LI里的内容
2008/12/17 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
Python中的类与对象之描述符详解
2015/03/27 Python
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
tensorflow识别自己手写数字
2018/03/14 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
python批量下载抖音视频
2019/06/17 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
django实现用户注册实例讲解
2019/10/30 Python
Python argparse模块使用方法解析
2020/02/20 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
python time()的实例用法
2020/11/03 Python
职专应届生求职信
2013/11/16 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
采购主管岗位职责
2014/02/01 职场文书
医学类个人求职信范文
2014/02/05 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
2014年行政部工作总结
2014/11/19 职场文书
慰问信模板
2015/02/14 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
Elasticsearch 批量操作
2022/04/19 Python