最新学了一个新的运动函数,与最初学习的有所不同,第一个运动是根据运动速度完成运动 ,第二个则是根据运动的时间来完成运动,而且把之前的函数都进行了一些兼容处理,在这里列出了看一下:

第一种animate1

 1 function animate1(obj,data,rate,fn){//运动对象,运动数据,[运动速度],[回调函数]
2 //遍历获取样式属性
3 for(var key in data){
4 //通过闭包将key私有化
5 (function(k){
6 /*
7 获得样式宽高等会带有单位px需要处理掉,
8 如果使用parseInt,当传入opacity为小数时会变为0,所以使用parseFloat
9 */
10 var cur = parseFloat( (obj.currentStyle || getComputedStyle(obj,null) )[k]);
11
12 //对特殊值进行处理
13 if(k == "opacity"){
14 //透明度当前值和目标值放大100倍,防止小数被舍去
15 cur *= 100;
16 data[k] *= 100;
17 }
18
19 //当前值和目标值相等,直接返回
20 if(cur == data[k]){ return; }
21
22 //通过自身名字定义定时器,解决每个运动共用一个定时器,造成清除其他运动定时器的问题
23 clearInterval(obj[k +'timer']);
24
25 obj[k+'timer'] = setInterval(function(){
26
27 //当前 += (目标-当前)*比率 比率不传则默认0.2
28 cur += (data[k] - cur) * (rate || 0.2);
29
30 if(Math.round(cur) == data[k]){
31 //如果到达目标值清除定时器,同步数据
32 clearInterval(obj[k+'timer']);
33 cur=data[k];
34
35 //回调,将定时器赋值为0,遍历每个定时器的值相加,如果所有定时器相加都为0,说明运动已经全部完成,执行回调函数
36 obj[k + "timer"] = 0;
37 var bl = 0;
38 for(var key in data){
39 bl += obj[key + "timer"];
40 }
41 if(bl == 0){
42 //判断是否传入回调函数
43 fn && fn.call(obj);
44 }
45 }
46
47 //使用数据时判断特殊值
48 if(k == "opacity"){
49 //opacity具有兼容问题,ie8以下使用filter:alpha(opacity:100)
50 obj.style.opacity = cur / 100;
51 obj.style.filter = "alpha(opacity="+ cur +")";
52 }else{
53 obj.style[k] = cur + "px";
54 }
55 },30)
56 })(key);
57 }
58 }

第二种animate2

function animate2(obj,data,time,fn){//运动对象,运动数据,[运动时间],[回调函数]
//保存初始值和变化值
var start = {};
var dis = {}; for(var name in data){
//获取样式,根据属性名保存在json中,{width:200,height:200}
start[name] = parseFloat( (obj.currentStyle || getComputedStyle(obj,null) )[name]);
//变化值 = 目标值 - 初始值 ----> {width:500,height:300}
dis[name] = json[name] - start[name];
} //根据完成的时间获得运动次数,30为定时器频率
var count = Math.round((time || 700)/30); //记录已经运动次数
var n = 0;
//将定时器绑定在对象身上,如果不同对象调用不会清除之前的运动
clearInterval(obj.timer);
obj.timer = setInterval(function(){ n++;
for(var name in data){
//位置:起点 + 距离/次数*n
var cur = start[name] + dis[name] / count * n; //对特殊属性进行判断
if(name == "opacity"){
obj.style.opacity = cur;
obj.style.filter = "alpha(opacity:"+cur*100+")";
} else {
obj.style[name] = cur + "px";
}
} //如果已经运动次数和总次数相等,则完成运动,清除定时器,执行回调函数
if(n == count){
clearInterval(obj.timer);
fn && fn.call(obj);
} },30);
}

总结:

  animate1中各种运动完成的时间是不一致的,而animate2都是在同一时间内完成,

  因此,在调用回调函数的时候animate1需要判断对象中的所有的运动都已经完成,而animate2只要到达运动次数就可以了。

  两个运动函数都能解决正常的动画效果,并不能说哪个就一定比较好,而且都还有改善的地方,以后学到再继续完善

JS里面的两种运动函数的更多相关文章

  1. js两种定义函数、继承方式及区别

    一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...

  2. javascript两种声明函数的方式的一次深入解析

    声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME ...

  3. 两种const函数

    有两种const函数,声明如下:1.const T func();2.T func() const;第一种表示返回的是const的类型,也即返回的值不能作为左值,楼主懂的.第二种表示该成员函数不能修改 ...

  4. JS两种声明函数的方法以及调用顺序

    两种声明方法: 1. var a = function () {...}; 2. function a() {...}; 第一种方式必须先声明后调用,而第二种方式函数调用在声明之前之后都可以. //第 ...

  5. 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

    1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...

  6. JS组件系列——两种bootstrap multiselect组件大比拼

    前言:今天继续来看看bootstrap的另一个组件:multiselect.记得在项目开始之前,博主项目组几个同事就使用哪些js组件展开过讨论,其中就说到了select组件,由于项目的整体风格使用的b ...

  7. 两种open()函数

    C语言中文件操作函数中,open()有两种形式: 一种形式是有两个参数open2: 另一种形式是有三个参数open3: 共有的参数有两个,第一个是"被打开文件的路径",第二个是&q ...

  8. Nginx入门之两种handler函数的挂载方式

    请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 接着上次的文章,今天研究<深入理解Nginx模块开发与架构解析>一书中给出的mytest的例子,发现和 /tengine.t ...

  9. JS中的两种刷新方法以及区别和适用范围

    在项目中有一个人信息修改的页面,但是修改后显示的却是修改之前的内容,分析问题后发现查询语句写在了修改语句之前,有些某些需要又必须这么写,但是修改信息后先却显示之前的信息也太不科学了. 所以我就想用js ...

随机推荐

  1. entity-model-first

  2. Solr学习总结(七)Solr搜索引擎的整体架构

    经过前面一段时间的努力,终于把我所知道的关于solr 的内容都总结完了.前面讲到了solr 的安装配置,web管理后台的使用,solr 的查询参数和查询语法,还说到了solr的客户端 solrnet  ...

  3. [Head First设计模式]山西面馆中的设计模式——建造者模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 引言 将学习融入生活中,是件很happy的事情,不会感 ...

  4. golang笔记——map

    通过 new 创建的引用类型对象是不完整创建,比如 map,它仅分配了字典类型本身所需的内存(指针包装),而没有分配键值存储内存,也没有初始化散列桶等内部属性,因此无法工作,如下代码就是错误的: p ...

  5. tyvj1014 乘法游戏

    描述 乘法游戏是在一行牌上进行的.每一张牌包括了一个正整数.在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌.最后一次移动后,这里只剩下两张牌.   ...

  6. Silicon C8051F340之GPIO口配置与使用

    一.背景: 很久前用过C8051,现在有相关需求需要重新使用C8051,然后发现一年前开发的相关经验都忘得 基本上差不多了.连最基本的GPIO口配置还得重新来看手册,所以有此文,做个记录,以备下次快速 ...

  7. http_build_query 的一个问题

    当我们使用CURL来post数据的时候,需要设置post的数据 curl_setopt($c, CURLOPT_POSTFIELDS, $post_data); 假如这里的$data是 $data = ...

  8. Linux 架构

    (转)作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! http://www.cnblogs.com/vamei/archive/2 ...

  9. hadoop 2.6 centos 7.1 下的一些操作

    开启hdfs: start-dfs.sh 开启yarn: start-yarn.sh 查看hdfs:http://ip:50070/ 查看RM:http://ip:8088/

  10. make menuconfig error 解决方法记录

    新建的一个虚拟机,发现make menuconfig 后会出错,查了一下是缺少一些库. 这个错误已经错了两次了,我不希望第三次出现了还想不起来,所以特此记录. # 错误信息: make[2]: *** ...