多物体多值链式运动

这篇博客的内容本来是安排在上一篇博客的内容里面的,但是后来考虑篇幅的问题,就单独拿出来了,所以就不过多就多物体多值运动的原理解析了,如果对代码不是很理解的话可以回到前面的博客查看我的具体分析,整个运动系列的前面的博客连接我都放到了最上面。所以这么博客直接进入链式运动分析。

所谓的链式运动就是一次触发后,多个动画函数自动连续调用执行。聪明的你应该想到了解决方法,解决链式调用最直接的方法当然非回调函数莫属了,在这篇博客不讨论回调机制的负面问题,后面会有相关博客来解析回调机制的负面内容,这篇博客我们就用回调函数来实现链式运动,毕竟在绝大多是不是特别复杂的动画设计中还是使用回调函数比较方便。所以,回调函数也不是解决链式运动的唯一方案,写完这篇博客我就会基于仿写jQuery的队列来实现。

回调这种很简单的机制,也没有太多需要分析的,直接上示例代码,我再基于代码来做一些解释。

 //css
div{
width:100px;
height:100px;
background:red;
position: absolute;
left: 0px;
opacity: 1;
}
#top{
top: 100px;
}
#bottom{
top: 300px;
}
//html
<div id="top"></div>
<div id="bottom"></div>
//js
var oDivArray = document.getElementsByTagName('div');
var timer = null;
var targetObj = {
width:400,
height:400,
opacity:50,
left:300,
top:200
}
oDivArray[0].onclick = function(){
startMove(this,targetObj,function(){
startMove(oDivArray[1],targetObj);
});
}
function getStyle(obj,attr){
if(window.getComputedStyle){
return window.getComputedStyle(obj,false)[attr];
}else{
return obj.currentStyle[attr];
}
}
function startMove(obj,json,callback){
clearInterval(obj.timer);
var iSpeed,iCur;
obj.timer = setInterval(function(){
var bStop = true;
for(var attr in json){
if(attr == 'opacity'){
iCur = Math.round(parseFloat(getStyle(obj,attr))*100);
}else{
iCur = parseInt(getStyle(obj,attr));
}
iSpeed = (json[attr]-iCur)/7;
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed); if(attr == 'opacity'){
obj.style.opacity=(iCur+iSpeed)/100;
}else{
obj.style[attr]=iCur+iSpeed+'px';
}
if(iCur != json[attr]){
bStop= false;
}
}
if(bStop){
clearInterval(obj.timer);
typeof callback == 'function' ? callback() : '';
}
},30);
}

相对于上一篇博客的多值运动代码只多了66行这一行代码,方法多出一个callback回调函数的形参(因数divisor这个参数等下再讲),在触发动画函数时传入一个回调函数来触发以下动画就Ok了,简单的我都不知道怎么说了。所以下面来凑内容,前面我提取动画函数时,第三个参数提取的是divisor(因数)来改变动画速度的参数,其实这个参数实质上没有多大意义(就改变速度而言),如果你使用jQuery的animate这个动画方法,这个方法的第三个形参是“easing”,用来设置不同运动点的速度,甚至还可以基于插件来实现改变运动轨迹,而第二个参数用来规定动画执行时间,这是我在前面提取方法是有意的将因数提取出来的原因,就是为了后面来实现更jQuery一样的功能,但这是后话了,这个设计比较复杂,需要一些时间来完成。

所以,在运动系列博客的第一部分,也就是实现轮播图插件这个过程,暂时不会提取divisor这个参数了。运动系列的博客第二部分会基于我自己的仿写jQuery来实现这些功能,这是我对这个系列博客的规划。希望大家多多支持啦。

原生JavaScript运动功能系列(四):多物体多值链式运动的更多相关文章

  1. 原生JavaScript运动功能系列(五):定时定点运动

    原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 原生JavaS ...

  2. js动画--链式运动

    前面几节我们只是讲述了一种运动,这节课我将讲述链式运动:就以一个动作接着一个动作完成. 对于这个实现,我们只需要改变一下就可以实现了,设置一个回调函数. var timer; window.onloa ...

  3. 原生JavaScript运动功能系列(三):多物体多值运动

    多物体同时出发运动函数实现 多属性同步运动变化实现 一.多物同时触发运动函数实现 前面两个动画示例基本理解了动画的核心:位置变化和速度变化,操作的核心就是定时器分段叠加属性值.但是动画还是基于单个元素 ...

  4. 原生JavaScript运动功能系列(二):缓冲运动

    匀速运动实现回顾 缓冲运动剖析 示例实现 方法提取 匀速运动实现回顾及缓冲运动剖析: 在这个系列的上一篇博客中原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现就运动的核心功能组成 ...

  5. javascript学习-原生javascript的小特效(原生javascript实现链式运动)

    以下代码就不详细解析了,在我之前的多个运动效果中已经解析好多次了,重复的地方这里就不说明了,有兴趣的童鞋可以去看看之前的文章<原生javascript的小特效> <!DOCTYPE ...

  6. Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理

    所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...

  7. javascript链式运动框架案例

    javascript链式运动框架 任务描述: 当鼠标移入红色矩形时,该矩形宽度逐渐增加至400px,之后高度逐渐增加至400px; 当鼠标移出红色矩形时,该矩形高度逐渐减小至200px,之后宽度逐渐减 ...

  8. HTML+JavaScript实现链式运动特效

    在学习js的过程中,发现这家伙做特效真是不错,尽管说眼下水平还不够,只是也能写点简单的效果. 今天分享一个简单的运动框架.然后利用这个框架实现简单的链式运动特效. 1.move.js 在运动框架中.主 ...

  9. JavaScript运动_封装模板(支持链式运动、完美运动)

    最近自学到了JS运动部分,自己整理了一些js模板,望采纳. 1.支持链式运动的模板: 先解释一下函数中的几个参数含义: 1)obj: 要操作的对象 2)target: 属性要到达的目标值 3)attr ...

随机推荐

  1. [SDOI2013] 直径

    传送门:>HERE< 题意:给出一颗树,求出被所有的直径都经过的边的数量 解题思路: 先求出任意一条直径并记录节点. 然后依次枚举直径上的每一个节点,判断从当前节点延伸出去的非直径的一条路 ...

  2. linux 开放80端口

    必须确保两块都开放 1.云服务器-->安全组开放 比如百度云服务器: 2.linux内置防火墙开放 注意:此处如果不设置开放,即时云端开放了也没用,如果同时存在  80 (拒绝) 80(允许)  ...

  3. MT【285】含参数函数绝对值的最大值

    (浙江2013高考压轴题)已知$a\in R$,函数$f(x)=x^3-3x^2+3ax-3a+3$(2)当$x\in[0,2]$时,求$|f(x)|$的最大值. 分析:由题意$f^{'}(x)=3x ...

  4. 设置服务器的MySQL允许远程访问/外网访问

    我需要在C++中连接服务器上的MySQL数据库.但是直接连接失败了,原来服务器上还要修改一下MySQL的配置. 一.服务器上的配置mysql数据库 进入mysql: mysql -uroot -p 输 ...

  5. Windows server 安装 OpenSSH

    文件自己网上下载或百度云盘提取即可 执行setupssh.exe,一直 next 下去 把安装目录下的 sshd_config 文件 copy 到  C:\Program Files (x86)\Op ...

  6. NOIP2018联赛总结

    NOIP2018联赛总结 Day 0 打了几个模板,看了一下别人的博客,背了一下vimrc Day 1 到了考场,先把vimrc配好 打开题目一先把三道题瞄了一眼,\(T1\)似乎是NOIP原题,\( ...

  7. WC2019 tree

    WC2019唯一一道正常的题,考场上没什么想法,也只拿到了暴力分.搞了一天终于做完了. 前置知识:purfer序,多项式exp或分治FTT. 对于\(type=0\)的,随便维护下,算下联通块即可. ...

  8. JQ动态生成的元素,原事件绑定失效

    Old Code: $('code').click(function () { console.log($(this).text()); }); New Code:(.container 是<c ...

  9. SFTP多文件上传,删除

    公司项目中需要把项目的相关文件上传到服务器的tomcat中,需要在项目中进行以下几步操作: 1.添加项目信息,包括名称,描述,服务器ip,sftp的用户名,密码,端口号等,存在配置,部署,删除等操作 ...

  10. Java 接口篇

    为什么使用接口? 问题 要求实现防盗门的功能 分析 门有开和关的功能,锁有上锁和开锁的功能 将门和锁分别定义为抽奖类 那么问题就是防盗门即继承了门的同时又继承了锁,而Java的继承是单继承,接口可多继 ...