原生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 ...
随机推荐
- miller——rabin判断素数
我们首先看这样一个很简单的问题:判定正整数\(n\)是否为素数 最简单的做法就是枚举\(2\)到\(n\)的所有数,看是否有数是\(n\)的因数,时间复杂度\(O(n)\) 稍微优化一下发现只要枚举\ ...
- Codeforces Round #530 (Div. 2) F (树形dp+线段树)
F. Cookies 链接:http://codeforces.com/contest/1099/problem/F 题意: 给你一棵树,树上有n个节点,每个节点上有ai块饼干,在这个节点上的每块饼干 ...
- python_getpass 模块的使用
可以实现输入用户密码的时候隐藏输入显示.更加安全. 默认自带Password: 的提示 如果自己指定提示内容就用自己的替换默认 import getpass passwd = getpass.getp ...
- Install KVM Hypervisor on arrch64 Linux Server
Install KVM Hypervisor on arrch64 Linux Server 参考链接: https://wiki.ubuntu.com/ARM64/QEMU https://wiki ...
- phpcms 手机门户配置注意事项
设置域名解析后,服务器apache,iis,nginx等,设置虚拟服务器时, 如下,只设置index.php为默认入口文件: 默认pc站为index.html为默认访问文件! pc与wap站,绑定目录 ...
- vim 高级编辑技巧
建议参考IBM官方文档https://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/ 重新输入以前输入过的某条命令Ctrl + r 全局替换格式:& ...
- 基数排序模板(基数排序,C++模板)
算法的理论学习可右转Creeper_LKF大佬的洛谷日报 一个优化算法理论时间复杂度的实例点这里 另一个实例点这里 时间复杂度\(O(n)\),算常数的话要乘位长. 蒟蒻参考了Creeper_LKF大 ...
- Hdoj 1421.搬寝室 题解
Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆, ...
- zabbix3.4.6之源码安装
LAMP部署环境搭建: Linux+apache(httpd)+mysql(mariadb)+php: 版本要求:apache-1.3.12,mysql-5.0.3,php-5.4.0<http ...
- Centos7下源码编译安装python3.6
测试环境: 操作步骤: 1. 下载Python源码包(python3.6.0) 官网下载地址:https://www.python.org/downloads/ 搜狐下载地址:http://mirro ...