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 });

 

posted @ 2014-08-14 00:14  郭永峰  阅读(1413)  评论(0编辑  收藏  举报