tweenjs缓动算法使用小实例

Posted 造轮子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tweenjs缓动算法使用小实例相关的知识,希望对你有一定的参考价值。

这里的tweenjs不是依托于createjs的tewwnjs,而是一系列缓动算法集合。因为本身是算法,可以用在各个业务场景中,这也正是总结学习它的价值所在。tweenjs代码详情:

  1 /*
  2  * Tween.js
  3  * t: current time(当前时间);
  4  * b: beginning value(初始值);
  5  * c: change in value(变化量);
  6  * d: duration(持续时间)。
  7  * you can visit ‘http://easings.net/zh-cn‘ to get effect
  8 */
  9 var Tween = {
 10     Linear: function(t, b, c, d) { 
 11         return c * t / d + b; 
 12     },
 13     Quad: {
 14         easeIn: function(t, b, c, d) {
 15             return c * (t /= d) * t + b;
 16         },
 17         easeOut: function(t, b, c, d) {
 18             return -c *(t /= d)*(t-2) + b;
 19         },
 20         easeInOut: function(t, b, c, d) {
 21             if ((t /= d / 2) < 1) return c / 2 * t * t + b;
 22             return -c / 2 * ((--t) * (t-2) - 1) + b;
 23         }
 24     },
 25     Cubic: {
 26         easeIn: function(t, b, c, d) {
 27             return c * (t /= d) * t * t + b;
 28         },
 29         easeOut: function(t, b, c, d) {
 30             return c * ((t = t/d - 1) * t * t + 1) + b;
 31         },
 32         easeInOut: function(t, b, c, d) {
 33             if ((t /= d / 2) < 1) return c / 2 * t * t*t + b;
 34             return c / 2*((t -= 2) * t * t + 2) + b;
 35         }
 36     },
 37     Quart: {
 38         easeIn: function(t, b, c, d) {
 39             return c * (t /= d) * t * t*t + b;
 40         },
 41         easeOut: function(t, b, c, d) {
 42             return -c * ((t = t/d - 1) * t * t*t - 1) + b;
 43         },
 44         easeInOut: function(t, b, c, d) {
 45             if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;
 46             return -c / 2 * ((t -= 2) * t * t*t - 2) + b;
 47         }
 48     },
 49     Quint: {
 50         easeIn: function(t, b, c, d) {
 51             return c * (t /= d) * t * t * t * t + b;
 52         },
 53         easeOut: function(t, b, c, d) {
 54             return c * ((t = t/d - 1) * t * t * t * t + 1) + b;
 55         },
 56         easeInOut: function(t, b, c, d) {
 57             if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
 58             return c / 2*((t -= 2) * t * t * t * t + 2) + b;
 59         }
 60     },
 61     Sine: {
 62         easeIn: function(t, b, c, d) {
 63             return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
 64         },
 65         easeOut: function(t, b, c, d) {
 66             return c * Math.sin(t/d * (Math.PI/2)) + b;
 67         },
 68         easeInOut: function(t, b, c, d) {
 69             return -c / 2 * (Math.cos(Math.PI * t/d) - 1) + b;
 70         }
 71     },
 72     Expo: {
 73         easeIn: function(t, b, c, d) {
 74             return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
 75         },
 76         easeOut: function(t, b, c, d) {
 77             return (t==d) ? b + c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
 78         },
 79         easeInOut: function(t, b, c, d) {
 80             if (t==0) return b;
 81             if (t==d) return b+c;
 82             if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
 83             return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
 84         }
 85     },
 86     Circ: {
 87         easeIn: function(t, b, c, d) {
 88             return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
 89         },
 90         easeOut: function(t, b, c, d) {
 91             return c * Math.sqrt(1 - (t = t/d - 1) * t) + b;
 92         },
 93         easeInOut: function(t, b, c, d) {
 94             if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
 95             return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
 96         }
 97     },
 98     Elastic: {
 99         easeIn: function(t, b, c, d, a, p) {
100             var s;
101             if (t==0) return b;
102             if ((t /= d) == 1) return b + c;
103             if (typeof p == "undefined") p = d * .3;
104             if (!a || a < Math.abs(c)) {
105                 s = p / 4;
106                 a = c;
107             } else {
108                 s = p / (2 * Math.PI) * Math.asin(c / a);
109             }
110             return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
111         },
112         easeOut: function(t, b, c, d, a, p) {
113             var s;
114             if (t==0) return b;
115             if ((t /= d) == 1) return b + c;
116             if (typeof p == "undefined") p = d * .3;
117             if (!a || a < Math.abs(c)) {
118                 a = c; 
119                 s = p / 4;
120             } else {
121                 s = p/(2*Math.PI) * Math.asin(c/a);
122             }
123             return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b);
124         },
125         easeInOut: function(t, b, c, d, a, p) {
126             var s;
127             if (t==0) return b;
128             if ((t /= d / 2) == 2) return b+c;
129             if (typeof p == "undefined") p = d * (.3 * 1.5);
130             if (!a || a < Math.abs(c)) {
131                 a = c; 
132                 s = p / 4;
133             } else {
134                 s = p / (2  *Math.PI) * Math.asin(c / a);
135             }
136             if (t < 1) return -.5 * (a * Math.pow(2, 10* (t -=1 )) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
137             return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p ) * .5 + c + b;
138         }
139     },
140     Back: {
141         easeIn: function(t, b, c, d, s) {
142             if (typeof s == "undefined") s = 1.70158;
143             return c * (t /= d) * t * ((s + 1) * t - s) + b;
144         },
145         easeOut: function(t, b, c, d, s) {
146             if (typeof s == "undefined") s = 1.70158;
147             return c * ((t = t/d - 1) * t * ((s + 1) * t + s) + 1) + b;
148         },
149         easeInOut: function(t, b, c, d, s) {
150             if (typeof s == "undefined") s = 1.70158; 
151             if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
152             return c / 2*((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
153         }
154     },
155     Bounce: {
156         easeIn: function(t, b, c, d) {
157             return c - Tween.Bounce.easeOut(d-t, 0, c, d) + b;
158         },
159         easeOut: function(t, b, c, d) {
160             if ((t /= d) < (1 / 2.75)) {
161                 return c * (7.5625 * t * t) + b;
162             } else if (t < (2 / 2.75)) {
163                 return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
164             } else if (t < (2.5 / 2.75)) {
165                 return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
166             } else {
167                 return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
168             }
169         },
170         easeInOut: function(t, b, c, d) {
171             if (t < d / 2) {
172                 return Tween.Bounce.easeIn(t * 2, 0, c, d) * .5 + b;
173             } else {
174                 return Tween.Bounce.easeOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;
175             }
176         }
177     }
178 }
179 Math.tween = Tween;

具体每种算法的操作实例,可以看大神张鑫旭的博客实例:http://www.zhangxinxu.com/study/201612/how-to-use-tween-js.html

当然,以上这些算法仅仅是一个状态,需要配合时间上的变化,才能实现缓动,这里使用的是requestAnimationFrame,具体代码好吧,也是拿来主义

 1 (function() {
 2     var lastTime = 0;
 3     var vendors = [ms, moz, webkit, o];
 4     for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
 5         window.requestAnimationFrame = window[vendors[x]+RequestAnimationFrame];
 6         window.cancelAnimationFrame = window[vendors[x]+CancelAnimationFrame] 
 7                                    || window[vendors[x]+CancelRequestAnimationFrame];
 8     }
 9  
10     if (!window.requestAnimationFrame)
11         window.requestAnimationFrame = function(callback, element) {
12             var currTime = new Date().getTime();
13             var timeToCall = Math.max(0, 16 - (currTime - lastTime));
14             var id = window.setTimeout(function() { callback(currTime + timeToCall); }, 
15               timeToCall);
16             lastTime = currTime + timeToCall;
17             return id;
18         };
19  
20     if (!window.cancelAnimationFrame)
21         window.cancelAnimationFrame = function(id) {
22             clearTimeout(id);
23         };
24 }());

最后是简单的实例应用,很简单,

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>使用tweenjs</title>
 7     <style type="text/css">
 8     div {
 9         width: 100px;
10         height: 100px;
11         border: 1px solid red;
12         text-align: center;
13         line-height: 100px;
14         position: absolute;
15     }
16     </style>
17 </head>
18 
19 <body>
20     <div id="test">
21         这是测试
22     </div>
23     <script type="text/javascript" src="RequestAnimationFrame.js"></script>
24     <script type="text/javascript" src="tween.js"></script>
25     <script type="text/javascript">
26         var DOM=document.getElementById("test");
27     var t = 0,//开始时间
28         b = 0,//开始位置
29         c = 1000,//变化值
30         d = 100;//持续时间
31     var step = function() {
32         var value = Tween.Bounce.easeOut(t, b, c, d);
33         DOM.style.left = value + px;
34        
35         t++;
36         if (t <= d) {
37             // 继续运动
38             requestAnimationFrame(step);
39         } else {
40             // 动画结束
41         }
42     };
43     step();
44     </script>
45 </body>
46 
47 </html>

具体使用中,需要参数以及控制好结束条件即可。

以上是关于tweenjs缓动算法使用小实例的主要内容,如果未能解决你的问题,请参考以下文章

Threejs基础代码段Tweenjs补间动画

js缓动算法以及应用场景(vue)

caurina缓动类

缓动动画

web前端开发JQuery常用实例代码片段(50个)

利用tween.js算法生成缓动效果