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

第一种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. 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别

    C#初学者经常被问的几道辨析题,值类型与引用类型,装箱与拆箱,堆栈,这几个概念组合之间区别,看完此篇应该可以解惑. 俗话说,用思想编程的是文艺程序猿,用经验编程的是普通程序猿,用复制粘贴编程的是2B程 ...

  2. 浅谈Android中layout_weight

    引言 在开发android过程中,我们经常需要对界面进行按比例进行布局,我们一般都会使用layout_属性来进行设置.今天这篇文章我们就来简单介绍下layout_weight的使用和布局原理.随着做项 ...

  3. 6Hibernate进阶----青软S2SH(笔记)

    关于关联关系的配置,用注解配置如下(这里引用的jar包是javax.persistence) // @ManyToOne(fetch=FetchType.LAZY) @ManyToOne(fetch= ...

  4. 数据导入导出Oracle数据库

    临近春节,接到了一个导入数据的任务,在Linux客户端中的数据有50G,大约3亿3千万行: 刚开始很天真,把原始的txt/csv文件用sh脚本转化成了oralce 的insert into 语句,然后 ...

  5. ASP.NET AJAX调用 WebService

    同事的代码,帮忙修改的,为了实现页面跳转回来后,状态的保持,Service 使用了Session. 主要的JS $.ajax({ url: "/ws/StaffInfo.asmx/Note& ...

  6. SQLite的时候判断语句是否纯在:出现RuntimeException

    写SQLite的时候判断语句是否纯在: public boolean exist(long id) { String filter = FRIEND_KEY_ID + "=" + ...

  7. D3.js学习记录

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. shell--4.echo和printf

    1. echo (1) echo ,显示普通字符串 echo "HelloWorld" 打印:HelloWorld (2) \ ,显示转义字符串 echo "\" ...

  9. Maven No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题

    maven编译项目时出错,提示信息如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3 ...

  10. js 连续赋值。。理解不了,先占坑

    http://www.cnblogs.com/xxcanghai/p/4998076.html