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>

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

原文地址:https://www.cnblogs.com/zhensg123/p/8872210.html

时间: 2024-10-11 05:34:24

tweenjs缓动算法使用小实例的相关文章

分享一个即插即用的私藏缓动动画JS小算法

二.即插即用的缓动小算法 原理如下: 假设要从数值A变化到数值B,如果是线性运动,则每次移动距离是一样:如果是缓动,每次移动距离不一样.那如何才能不一样呢?很简单,按比例移动就可以. 例如:每次移动剩余距离的一半. 对吧,超容易理解的. 比方说:你和初恋之间距离是64,每秒移动一半,则,你们之间的距离下一秒就是32, 再下一秒就是16,然后8,然后4,然后2,然后1,然后--你们就在一起了.你们在一起的这个过程就是一个典型的先快后慢的缓动运动过程,如下示意图: 用一个简单的公式表示就是: A =

jQuery Tween缓动算法

参考:Javascript Tween算法及缓动效果 做了个简单的插件,以后慢慢重构: /** * * 描述:javascript缓动 * jQuery Tween算法:算法来源:http://www.robertpenner.com/easing/ * @author:xuzengqiang * @since :2015-1-23 11:17:51 * 两种比较复杂的没有收录进来 * Elastic:指数衰减的正弦曲线缓动: * Back:超过范围的三次方缓动((s+1)*t^3 - s*t^

window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果

window.requestAnimationFrame 概述 window.requestAnimationFrame()这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作动画的需求.这个方法接受一个函数为参,该函数会在重绘前调用. 注意: 如果想得到连贯的逐帧动画,函数中必须重新调用 requestAnimationFrame(). 如果你想做逐帧动画的时候,你应该用这个方法.这就要求你的动画函数执行会先于浏览器重绘动作.通常来说,被调用的频率是每秒60次,但是一般

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

在讲tween类之前,不得不提的是贝塞尔曲线了.首先,贝塞尔曲线是指依据四个位置任意的点坐标绘制出的一条光滑曲线.它在作图工具或动画中中运用得比较多,例如PS中的钢笔工具,firework中的画笔等等.无论运用在哪里,它们的原理都是一样的.同样,在用js实现运动效果时,我们也可以利用贝塞尔曲线来实现不同的特效,而tween.js就是一个封装好的计算辅助算法.你可以通过连续输入多个值,然后利用贝塞尔曲线公式输出不同的值,最终形成了一条光滑的曲线.因为一条曲线上的值的不一样的,所以我们可以利用曲线的

用缓动函数模拟物理动画

1.缓动函数简介      <1>缓动函数的动画效果是建立在CALayer层级的关键帧动画基础之上 也就是说用普通的UIView的Animation是无法直接实现缓动函数 <2>缓动函数是一系列模拟物理效果(如抛物线)方程式的统称,用以计算给定两点之间的插值 <3>两点之间插的值越多,效果越好,但是会耗费更多的性能 <4>只有理解了缓动函数的原理才有可能写出自己想要的效果 学习来自:<极客学院>之 "用缓动函数模拟物理动画"

网站建设中前端常用的jQuery+easing缓动的动画

网站建设中前端人员利用jQuery实现动画再简单不过了,只是要实现更酷的效果还需要插件来帮忙,easing就是一款帮助jQuery实现缓动动画的插件,经过试用,效果很不错! 下载该插件:jquery.easing.1.3.js jquery.easing.compatibility.js 该插件美化排版后是130行左右,压缩后更小.这个插件弥补了jquery里面的动画效果的不足,是其动画效果更加强悍. X轴表示时间,Y轴表示的是动画效果的变化.查看这些曲线变化,更利于掌握这个插件的效果. 插件支

caurina缓动类

一.简单的缓动 一个实例名为box的正方体,开始alpha为0.5,在两秒内移动到x:300 y:100的位置,alpha变为1.import caurina.transitions.Tweener;Tweener.addTween(box,{x:300, y:100, alpha:1, time:2, transition:"linear"});使用该类库,使用顺序缓动也很容易,你不需要使用事件同步你的缓动效果 下面代码实现的是在2秒内将一个物体从一个地方改变为x:300 y:100

【WPF学习】第五十一章 动画缓动

线性动画的一个缺点是,它通常让人觉得很机械且不能够自然.相比而言,高级的用户界面具有模拟真实世界系统的动画效果.例如,可能使用具有触觉的下压按钮,当单击时按钮快速弹回,但是当没有进行操作时它们会慢慢地停下来,创建真正移动的错觉.或者,可能使用类似Windows操作系统的最大化和最小化效果,当窗口解决最终尺寸时窗口扩展或收缩的速度会加速.这些细节十分细微,当它们的实现比较完美时可能不会注意到它们.然而,几乎总会注意到,粗糙的缺少这些更细微特征的动画会给人留下笨拙的印象. 改进动画并创建更趋自然的动

JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级、旋转轮播图、正则表达式、验证表单注册账号、

缓动函数中opcity  写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for-in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/兼容透明度/层级 function animate(ele,json,fn){ //先清定时器 clearInterval(ele.timer); ele.timer = setInterval(function () { //开闭原则 var bool = true; //遍历属性和值,分别单独处