JS里面的两种运动函数

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

第一种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只要到达运动次数就可以了。

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

时间: 2024-12-10 09:30:47

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

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

一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function() { alert("i am B"); } 区别:code 前者会在代码执行之前提前加载到作用域中,后者则是在代码执行到那一行的时候才会有定义 二:js两种继承方式及区别 对象冒充 临时属性 call() apply() 原型链 code 继承应选哪种 code 三:实例 js两种定义

可拖动弹窗的JS和jQuery两种写法

最近在慕课网上学习了一个网页可拖动对话框js实现的演示视频,这个demo中的例子是百度首页登录按钮的弹窗,如下图: 当点击左上角的登录按钮时,弹窗出现并自动居中,同时窗口可拖动的范围被限制在了可视区域内,即浏览器视窗的上下左右边界,弹窗无法移出移动出四个边界,也不会出现滚动条. 另一个效果就是,当改变窗口大小时,对话框自动居中. 这个视频中用了原生js,jQuery两种写法实现案例,但本质上,对话框居中,限制拖动范围的的计算思路是一致的. 为了简化页面,总结核心思路,我重新写了一个小demo,界

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

声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME = function() { /* FUNCTION_BODY */}; /*方式二*/ function FUNCTION_NAME () { /* FUNCTION_BODY */}; 区别一 方式一的声明方式是先声明后使用 方式二的声明方式可以先调用,后声明 /*方式一: *先声明后使用 *

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

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

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

1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现,现在所有支持JavaScript 的浏览器都会使用这个策略. 所谓同源,就是指两个页面具有相同的协议,主机(也常说域名),端口,三个要素缺一不可. 所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问

javascript中两种定义函数方式的差别以及函数的预编译效果

我们知道在javascript中定义函数的方式有以下两种: function mm(){ } 这种形式是声明一个函数,跟 var 声明一个变量机制一样,脚本在解释执行之前会做预编译处理. var mm = function(){ } 这种形式是对一个变量赋值,虽然也做预编译,但仅仅只是给 mm 事先变量分配一个内存空间,而没有做初始化. 代码1: alert(a);//打印函数a的内存 alert(b);//undefined alert(c);//JS报错:"c"未定义 functi

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

原文:http://www.cnblogs.com/landeanfen/p/5013452.html 前言:今天继续来看看bootstrap的另一个组件:multiselect.记得在项目开始之前,博主项目组几个同事就使用哪些js组件展开过讨论,其中就说到了select组件,由于项目的整体风格使用的bootstrap风格,所以在选用select组件的时候优先考虑和bootstrap结合使用的.其中就找到了两个这种组件,大体样式和功能基本相同,经过一番讨论,项目组决定使用davidstutz的b

两种open()函数

C语言中文件操作函数中,open()有两种形式: 一种形式是有两个参数open2: 另一种形式是有三个参数open3: 共有的参数有两个,第一个是"被打开文件的路径",第二个是"文件打开的方式": 在使用中,如果文件打开的方式中使用了O_CREAT,则使用带有三个参数的open(),第三个参数是"被打开文件的存取权限":

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

请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 接着上次的文章,今天研究<深入理解Nginx模块开发与架构解析>一书中给出的mytest的例子,发现和 /tengine.taobao.org/book/一书中的例子不甚相同,尤其是在handler函数的挂在方面. 函数的挂载分为两种方式: 一种方式就是按处理阶段挂载;另外一种挂载方式就是按需挂载.tengine.taobao.org 中使用的挂载方式是按处理阶段挂载,而深入理解一书中的挂载方式是按需求挂载. 首先看/tengin