首页 > 代码库 > animate动画方法封装:原生JS实现
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 });
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。