原生JavaScript运动功能系列(四):多物体多值链式运动
多物体多值链式运动
这篇博客的内容本来是安排在上一篇博客的内容里面的,但是后来考虑篇幅的问题,就单独拿出来了,所以就不过多就多物体多值运动的原理解析了,如果对代码不是很理解的话可以回到前面的博客查看我的具体分析,整个运动系列的前面的博客连接我都放到了最上面。所以这么博客直接进入链式运动分析。
所谓的链式运动就是一次触发后,多个动画函数自动连续调用执行。聪明的你应该想到了解决方法,解决链式调用最直接的方法当然非回调函数莫属了,在这篇博客不讨论回调机制的负面问题,后面会有相关博客来解析回调机制的负面内容,这篇博客我们就用回调函数来实现链式运动,毕竟在绝大多是不是特别复杂的动画设计中还是使用回调函数比较方便。所以,回调函数也不是解决链式运动的唯一方案,写完这篇博客我就会基于仿写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运动功能系列(四):多物体多值链式运动的更多相关文章
- 原生JavaScript运动功能系列(五):定时定点运动
原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现 原生JavaScript运动功能系列(二):缓冲运动 原生JavaScript运动功能系列(三):多物体多值运动 原生JavaS ...
- js动画--链式运动
前面几节我们只是讲述了一种运动,这节课我将讲述链式运动:就以一个动作接着一个动作完成. 对于这个实现,我们只需要改变一下就可以实现了,设置一个回调函数. var timer; window.onloa ...
- 原生JavaScript运动功能系列(三):多物体多值运动
多物体同时出发运动函数实现 多属性同步运动变化实现 一.多物同时触发运动函数实现 前面两个动画示例基本理解了动画的核心:位置变化和速度变化,操作的核心就是定时器分段叠加属性值.但是动画还是基于单个元素 ...
- 原生JavaScript运动功能系列(二):缓冲运动
匀速运动实现回顾 缓冲运动剖析 示例实现 方法提取 匀速运动实现回顾及缓冲运动剖析: 在这个系列的上一篇博客中原生JavaScript运动功能系列(一):运动功能剖析与匀速运动实现就运动的核心功能组成 ...
- javascript学习-原生javascript的小特效(原生javascript实现链式运动)
以下代码就不详细解析了,在我之前的多个运动效果中已经解析好多次了,重复的地方这里就不说明了,有兴趣的童鞋可以去看看之前的文章<原生javascript的小特效> <!DOCTYPE ...
- Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理
所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...
- javascript链式运动框架案例
javascript链式运动框架 任务描述: 当鼠标移入红色矩形时,该矩形宽度逐渐增加至400px,之后高度逐渐增加至400px; 当鼠标移出红色矩形时,该矩形高度逐渐减小至200px,之后宽度逐渐减 ...
- HTML+JavaScript实现链式运动特效
在学习js的过程中,发现这家伙做特效真是不错,尽管说眼下水平还不够,只是也能写点简单的效果. 今天分享一个简单的运动框架.然后利用这个框架实现简单的链式运动特效. 1.move.js 在运动框架中.主 ...
- JavaScript运动_封装模板(支持链式运动、完美运动)
最近自学到了JS运动部分,自己整理了一些js模板,望采纳. 1.支持链式运动的模板: 先解释一下函数中的几个参数含义: 1)obj: 要操作的对象 2)target: 属性要到达的目标值 3)attr ...
随机推荐
- 对Redis的理解
1.redis使用的场景 热点数据(经常会被查询,但是不经常被修改或者删除的数据)
- Java 异常处理流程
Java 异常处理流程 ============== End
- 【HDU 6171】Admiral(搜索+剪枝)
多校10 1001 HDU 6171 Admiral 题意 目标状态是第i行有i+1个i数字(i=0-5)共6行.给你初始状态,数字0可以交换上一行最近的两个和下一行最近的两个.求20步以内到目标状态 ...
- 「洛谷5283」「LOJ3048」「十二省联考2019」异或粽子【可持久化01trie+优先队列】
题目链接 [洛谷传送门] [LOJ传送门] 题目大意 让你求区间异或和前\(k\)大的异或和的和. 正解 这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队) 我们做过某一些题 ...
- [SPOJ913]QTREE2 - Query on a tree II【倍增LCA】
题目描述 [传送门] 题目大意 给一棵树,有两种操作: 求(u,v)路径的距离. 求以u为起点,v为终点的第k的节点. 分析 比较简单的倍增LCA模板题. 首先对于第一问,我们只需要预处理出根节点到各 ...
- Fiddler 安装配置及使用技巧
下载最新版即可: https://www.telerik.com/fiddler pc配置: pc端上的配置较为简单,主要是记录一下遇到的一些bug以及解决方法. options>HTTPS ...
- Linux的wget命令详解【转载】
Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...
- poj 1733 Parity game(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...
- Typescript学习笔记(五) 模块机制
javascript从es5之前都缺少一种模块机制,无法通过js引入文件,于是requirejs等等的加载器应运而生.这些加载器的使用也并不统一,产生了amd,commonjs,umd等等的规范,各有 ...
- Spring Boot实战
Spring在java EE开发中是实际意义上的标准,但我们在开发Spring的时候可能会遇到以下令人头疼的问题: 1.大量配置文件的定义.2.与第三方软件整合的技术问题. Spring每个版本的退出 ...