js实现回放拖拽轨迹-------Day48
今天有点小高兴,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()方法:删除并返回数组的最后一个元素。关键点有两个,其一:返回最后一个元素;其二:删除元素,数组长度变小。
这样我们实现了倒着回放,实现原理就不用多说了吧,假设要是正着回放,我们是不是就要获取并删除数组的第一个值了,哈,试着动手写写看吧。
不得不说还是用鼠标拖起来舒服。键盘移动太不方便了,用鼠标能够肆无忌惮的拖拽啊.....天已入伏。要热,今天倒还好....
js实现回放拖拽轨迹-------Day48的更多相关文章
- php和js实现文件拖拽上传
Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- Dropzone.js实现文件拖拽上传
dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...
- js实现可拖拽的div
前言 下午忙里偷闲想写一个可拖拽的例子,留在脑海里一直都是三个事件mouseDown,mouseUp,mouseMove, 但从没有动手实践过,今天想起了自己实践了并学习了张鑫旭的demo实现. 学习 ...
- 纯JS实现可拖拽表单
转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 因为要用到可拖拽表单,个人要比较喜欢自己动手,不怎么喜欢在不懂实现或者原理的情况下用插件,所以查找资料实现了一个. 思路:放入:用mouse ...
- 纯js实现DIV拖拽
写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章<JavaScript实现最简单的拖拽效果>,便直接拿来使用(膜拜大神).但 ...
- angular-dragon-drop.js 双向数据绑定拖拽的功能
在做公司后台物流的时候,涉及到34个省市分为两个部分,一部分为配送区域,另一部分为非配送区域,想利用拖拽的功能来实现,最好两部分的数组能自动更新. 刚好找到angular-dragon-drop.js ...
- js制作可拖拽可点击的悬浮球
兼容mouse事件和touch事件,支持IE9及其以上 效果展示:https://jsfiddle.net/shifeng/7xebf3u0/ // index.html <!DOCTYPE h ...
- vuejs2.0使用Sortable.js实现的拖拽功能
简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...
随机推荐
- 使用Nginx的配置对cc攻击进行简单防御
ddos攻击:分布式拒绝服务攻击,就是利用大量肉鸡或伪造IP,发起大量的服务器请求,最后导致服务器瘫痪的攻击. cc攻击:类似于ddos攻击,不过它的特点是主要是发起大量页面请求,所以流量不大,但是却 ...
- 【JAVA】在线程里使用线程外的变量为什么一定要是final类型
这个情况真的碰到很多,开始的时候也很难理解,但是既然IDE提示要final那我就final咯,跑通就行管那么多呢.然而这并不是科学的学习方法,万一面试问你呢那不是倒了大霉. OK,看了一些
- AspNet5 Changes to [Activate] in beta-5
最近在看AspNet Core相关的文章,其中有个TagHelper,看上善若水的博客“关于TagHelper的那些事”,其中有一句 下面来自上善若水的博客原文: 我们知道ASP.NET 5实现了依赖 ...
- mvc4 to mvc5 orEF5 to EF6 ,(升级EF6)
把后台MVC4 自动生成的网站从EF5.0 升级为 EF6.1.3 (6.0以上) 报错 找不到方法:“System.Data.Objects.ObjectContext System.Data.En ...
- Number Sequence HDU - 5014
There is a special number sequence which has n+1 integers. For each number in sequence, we have two ...
- 【BZOJ 1052】 1052: [HAOI2007]覆盖问题 (乱搞)
1052: [HAOI2007]覆盖问题 Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的 ...
- run()和start()的区别
run没有启新的线程,start方法才会调用Thread的native的start0方法,start0会调用run方法,开启新的线程,博主这么做,不是多线程顺序执行,而是把业务阻塞在主线程里.请打印: ...
- 【BZOJ 4650】【UOJ #219】【NOI 2016】优秀的拆分
http://www.lydsy.com/JudgeOnline/problem.php?id=4650 http://uoj.ac/problem/219 这里有非常好的题解qwq 接着道题复习一下 ...
- POJ 1830 开关问题(Gauss 消元)
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7726 Accepted: 3032 Description ...
- 【二分】Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market
傻逼二分 #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll ...