孟回头 发表于 2012-12-22 21:24:25

再聊聊javascript的动画函数-Demo

<div id="cnblogs_post_body">动画原理:
最终是要设置elem的样式的,我们来看一下,下面一行代码:
elem.style = (alterStyle * e + startStyle).toFixed(3) + 'px';
简单一点,如果设置的是elem,的width那么是:
//alterStyle是变化量,由最后的值减去初始值得来
//startStyle是初始值
elem.style.width = alterStyle*e + startStyle + 'px';
上面的e是个比例值,是(curTime-startTime)/duration得来,
其中curTime是当前时间,startTime是开始时间,duration是动画持续的时间,所以范围e的范围是0.0~1.0。

以前研究过《JavaScript Tween算法及缓动效果》但是,浏览器的原因导致动画叠加,特别是切换浏览器选项卡的时候,浏览器频率下降,
过一段时间,再切换选项卡,动画乱了。
Easing算法就解决了这个问题。

具体实现如下:
<div class="cnblogs_code"> 1 /** 2 * 动画函数 3 * @paramDOMObject    elem   文档节点对象 4 * @paramObject       styles   动画后的最终状态 5 * @paramInt          duration 动画时间长度 6 * @paramFunction   callBack 动画结束的回调函数 7 * @return Function            动画的定时器函数 8*/ 9 function animate(elem, styles, duration, callBack) {10   var startTime = +new Date(), //记录当前时间,+new Date()为new Date().getTime()的简写11         endTime = startTime + duration, //结束时间12         curTime, //当前时间13         t, //当前时间,在总时间的比例,范围0.0~1.014         e, //动画算子15         timer, //setTimeout,的定时器16         startStyle = {}, //elem,动画前相关的样式17         alterStyle = {}, //elem,动话始末相关的样式差值18         //一个单位动画执行的函数19         run = function () {20             curTime = +new Date();21             //计算,当前时间,在总时间的比例,范围0.0~1.022             t = curTime > endTime ? 1 : (curTime - startTime) / duration;23             //动画算子24             e = easing(t);25             //设置样式26             for (var style in styles) {27               elem.style = (alterStyle * e + startStyle).toFixed(3) + 'px';28             }29             if (t < 1) {30               //t < 1.0表面动画未结束 ,每16毫秒递归一次run函数。31               timer = setTimeout(function () {32                   run()33               }, 16);34             } else {35               //如果回调函数存在,执行回调函数36               callBack && callBack();37             }38       };39 40   for (var style in styles) {41         //初始,动画前相关的样式42         startStyle = parseInt(elem.style);43         //初始,动话始末相关的样式差值44         alterStyle = styles - startStyle;45     }46 47     run();48 49   return function () {50         timer && clearTimeout(timer);51     };52 };53 54 function easing(t) {55   return t;56 };
页: [1]
查看完整版本: 再聊聊javascript的动画函数-Demo