zoukankan      html  css  js  c++  java
  • animate动画方法封装:原生JS实现

      1 /**
      2  * Created by guoyongfeng on 2014/7/7.
      3  * @Author      guoyongfeng
      4  * @Date        2014-07-07
      5  * @Version     1.0.0
      6  * @update        2014-07-07
      7  * @described    tween动画库函数封装
      8  *
      9  */
     10 define('animate/0.0.1', function(){
     11     /**
     12      *
     13      */
     14     return function(ele, json, duration, effect, fnCallBack){
     15         //对传参effect进行判断,并将获得的方法统一赋值给action方法
     16         //对传参的判断可以实现js的重载功能。
     17         var action=null;
     18         if(typeof effect =="number"){
     19             //1 buffer,2 flex,3 bounce 4 linear
     20             switch(effect){
     21                 case 1:
     22                     action=moveEffect.Exponential.easeOut;
     23                     break;
     24                 case 2:
     25                     action=moveEffect.Elastic.easeOut;
     26                     break;
     27                 case 3:
     28                     action=moveEffect.Bounce.easeOut;
     29                     break;
     30                 case 4:
     31                     action=moveEffect.Linear;
     32                     break;
     33                 default:
     34                     break;
     35             }
     36         }else if(typeof effect == 'string'){
     37             switch(effect){
     38                 case 'Exponential':
     39                     action=moveEffect.Exponential.easeOut;
     40                     break;
     41                 case 'Elastic':
     42                     action=moveEffect.Elastic.easeOut;
     43                     break;
     44                 case 'Bounce':
     45                     action=moveEffect.Bounce.easeOut;
     46                     break;
     47                 case 'Linear':
     48                     action=moveEffect.Linear;
     49                     break;
     50                 default:
     51                     break;
     52             }
     53 
     54         }else if(typeof effect == "function"){
     55             //参数effect是个函数,则默认为这是回调函数,并采用默认的运动效果
     56             fnCallback=effect;
     57         }else if(effect instanceof Array){
     58             //输入格式:['Expo','easeOut']
     59             if(effect.length===2){
     60                 action=moveEffect[effect[0]][effect[1]];
     61             }else if(effect.length==1){
     62                 action=moveEffect.Linear;
     63             }
     64         }else{
     65             action=moveEffect.Exponential.easeOut;
     66         }
     67 
     68         //获取初试值
     69         var oBegin={};
     70         var oChange={};
     71         for(var attr in json){
     72             var begin=0, change=0, count=0;
     73             if(attr == 'opacity'){
     74                 begin=Math.random((parseFloat(getStyle(ele, attr)))*100);
     75                 change=json[attr]-begin;
     76                 if(begin == 'undefined'){
     77                     ele.style[attr]='alpha(opacity:100)';
     78                     ele.style.opacity=1;
     79                 }
     80             }else{
     81                 begin=parseInt(getStyle(ele, attr));
     82                 change=json[attr]-begin;
     83             }
     84             //保存
     85             if(change){
     86                 count++;
     87                 oBegin[attr]=begin;
     88                 oChange[attr]=change;
     89             }
     90         }
     91         //判断所有变量是否到齐
     92         if(count == 0){
     93             if(typeof fnCallBack == 'function'){
     94                 fnCallBack.call(ele);
     95             }else{
     96                 return ;
     97             }
     98         }
     99 
    100         //封装运动函数
    101         var times=0;
    102         var interval=30;
    103         move();
    104 
    105         function move(){
    106             clearInterval(ele.timer);
    107             times+=interval;
    108 
    109             if(times<=duration){
    110                 for(var attr in json){
    111                     //var val=times*oChange[attr]/duration+oBegin[attr];
    112                     var val=action(times, oBegin[attr], oChange[attr], duration);
    113                     if(attr == 'opacity'){
    114                         ele.style[attr]=val/100;
    115                         ele.style.filter="alpha(opacity="+val+")";
    116                     }else{
    117                         ele.style[attr]=val+'px';
    118                     }
    119                 }
    120                 ele.timer=window.setInterval(move, interval);
    121             }else{
    122                 if(attr == 'opacity'){
    123                     ele.style[attr]=json[attr]/100;
    124                     ele.style.filter="alpha(opacity="+json[attr]+")";
    125                 }else{
    126                     ele.style[attr]=json[attr]+'px';
    127                 }
    128                 //回调函数
    129                 if(typeof fnCallBack == 'function'){
    130                     fnCallBack.call(ele);
    131                 }
    132 
    133                 ele.timer=null;
    134             }
    135         }
    136 
    137         //获取css样式的兼容性写法
    138         function getStyle(obj, attr){
    139             if(obj.currentStyle){
    140                 return obj.currentStyle[attr];
    141             }else{
    142                 return getComputedStyle(obj, null)[attr];
    143             }
    144         }
    145 
    146     }
    147 
    148     //思路:当前时间*变化量/持续时间+初始值
    149     var moveEffect = {
    150         //1.线性运动
    151         Linear: function(t,b,c,d){
    152             return c*t/d + b;
    153         },
    154         //2.二次方的缓动(t^2);
    155         Quadratic: {
    156             easeIn: function(t,b,c,d){
    157                 return c*(t/=d)*t + b;
    158             },
    159             easeOut: function(t,b,c,d){
    160                 return -c *(t/=d)*(t-2) + b;
    161             },
    162             easeInOut: function(t,b,c,d){
    163                 if ((t/=d/2) < 1) return c/2*t*t + b;
    164                 return -c/2 * ((--t)*(t-2) - 1) + b;
    165             }
    166         },
    167         //3.三次方的缓动(t^3)
    168         Cubic: {
    169             easeIn: function(t,b,c,d){
    170                 return c*(t/=d)*t*t + b;
    171             },
    172             easeOut: function(t,b,c,d){
    173                 return c*((t=t/d-1)*t*t + 1) + b;
    174             },
    175             easeInOut: function(t,b,c,d){
    176                 if ((t/=d/2) < 1) return c/2*t*t*t + b;
    177                 return c/2*((t-=2)*t*t + 2) + b;
    178             }
    179         },
    180         //4.四次方的缓动(t^4);
    181         Quartic: {
    182             easeIn: function(t,b,c,d){
    183                 return c*(t/=d)*t*t*t + b;
    184             },
    185             easeOut: function(t,b,c,d){
    186                 return -c * ((t=t/d-1)*t*t*t - 1) + b;
    187             },
    188             easeInOut: function(t,b,c,d){
    189                 if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
    190                 return -c/2 * ((t-=2)*t*t*t - 2) + b;
    191             }
    192         },
    193         //5.五次方的缓动(t^5);
    194         Quintic: {
    195             easeIn: function(t,b,c,d){
    196                 return c*(t/=d)*t*t*t*t + b;
    197             },
    198             easeOut: function(t,b,c,d){
    199                 return c*((t=t/d-1)*t*t*t*t + 1) + b;
    200             },
    201             easeInOut: function(t,b,c,d){
    202                 if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
    203                 return c/2*((t-=2)*t*t*t*t + 2) + b;
    204             }
    205         },
    206         //6.正弦曲线的缓动sin(t)
    207         Sinusoidal: {
    208             easeIn: function(t,b,c,d){
    209                 return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
    210             },
    211             easeOut: function(t,b,c,d){
    212                 return c * Math.sin(t/d * (Math.PI/2)) + b;
    213             },
    214             easeInOut: function(t,b,c,d){
    215                 return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
    216             }
    217         },
    218         //7.指数曲线的缓动(2^t);
    219         Exponential: {
    220             easeIn: function(t,b,c,d){
    221                 return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
    222             },
    223             easeOut: function(t,b,c,d){
    224                 return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
    225             },
    226             easeInOut: function(t,b,c,d){
    227                 if (t==0) return b;
    228                 if (t==d) return b+c;
    229                 if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
    230                 return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
    231             }
    232         },
    233         //8.圆形曲线的缓动(sqrt(1-t^2));
    234         Circular: {
    235             easeIn: function(t,b,c,d){
    236                 return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
    237             },
    238             easeOut: function(t,b,c,d){
    239                 return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
    240             },
    241             easeInOut: function(t,b,c,d){
    242                 if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
    243                 return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
    244             }
    245         },
    246         //9.指数衰减的正弦曲线缓动;
    247         Elastic: {
    248             easeIn: function(t,b,c,d,a,p){
    249                 if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
    250                 if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
    251                 else var s = p/(2*Math.PI) * Math.asin (c/a);
    252                 return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    253             },
    254             easeOut: function(t,b,c,d,a,p){
    255                 if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
    256                 if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
    257                 else var s = p/(2*Math.PI) * Math.asin (c/a);
    258                 return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b);
    259             },
    260             easeInOut: function(t,b,c,d,a,p){
    261                 if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
    262                 if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
    263                 else var s = p/(2*Math.PI) * Math.asin (c/a);
    264                 if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    265                 return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
    266             }
    267         },
    268         //10.超过范围的三次方缓动((s+1)*t^3 - s*t^2);
    269         Back: {
    270             easeIn: function(t,b,c,d,s){
    271                 if (s == undefined) s = 1.70158;
    272                 return c*(t/=d)*t*((s+1)*t - s) + b;
    273             },
    274             easeOut: function(t,b,c,d,s){
    275                 if (s == undefined) s = 1.70158;
    276                 return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
    277             },
    278             easeInOut: function(t,b,c,d,s){
    279                 if (s == undefined) s = 1.70158;
    280                 if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
    281                 return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
    282             }
    283         },
    284         //11.指数衰减的反弹缓动。
    285         Bounce: {
    286             easeIn: function(t,b,c,d){
    287                 return c - moveEffect.Bounce.easeOut(d-t, 0, c, d) + b;
    288             },
    289             easeOut: function(t,b,c,d){
    290                 if ((t/=d) < (1/2.75)) {
    291                     return c*(7.5625*t*t) + b;
    292                 } else if (t < (2/2.75)) {
    293                     return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    294                 } else if (t < (2.5/2.75)) {
    295                     return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    296                 } else {
    297                     return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    298                 }
    299             },
    300             easeInOut: function(t,b,c,d){
    301                 if (t < d/2) return moveEffect.Bounce.easeIn(t*2, 0, c, d) * .5 + b;
    302                 else return moveEffect.Bounce.easeOut(t*2-d, 0, c, d) * .5 + c*.5 + b;
    303             }
    304         }
    305     };
    306 });
  • 相关阅读:
    (转)Ogre终于开始改进其对地形渲染的支持
    (转)让VS2005编辑器支持着色器语法高亮
    (转)天龙粒子系统改进
    (转)【行业专题】计算机世界《狗日的腾讯》报道
    (转)Ogre天龙八部2及鹿鼎记天空顶(Skydome)镜头眩光(Lens Flare)等效果的实现
    (转)“你的代码写的很烂”
    程序员能力矩阵
    Oracle操作表空间
    TCP/IP、HTTP、WEBSERVICE、SOAP、ICE都使用后才有感慨
    oracleserviceSID 在系统服务里丢失
  • 原文地址:https://www.cnblogs.com/guoyongfeng/p/3911510.html
Copyright © 2011-2022 走看看