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

  tween.js封装了多种效果的计算方法,我们可以利用里面的公式或者自己重写方法。以下是源代码,可根据自己的需要增删使用。 

  1. 1 // Tween类
  2. 2 var Tween = {
  3. 3 Linear: function(t,b,c,d){ return c*t/d + b; },
  4. 4 Quad: {
  5. 5 easeIn: function(t,b,c,d){
  6. 6 return c*(t/=d)*t + b;
  7. 7 },
  8. 8 easeOut: function(t,b,c,d){
  9. 9 return -c *(t/=d)*(t-2) + b;
  10. 10 },
  11. 11 easeInOut: function(t,b,c,d){
  12. 12 if ((t/=d/2) < 1) return c/2*t*t + b;
  13. 13 return -c/2 * ((--t)*(t-2) - 1) + b;
  14. 14 }
  15. 15 },
  16. 16 Cubic: {
  17. 17 easeIn: function(t,b,c,d){
  18. 18 return c*(t/=d)*t*t + b;
  19. 19 },
  20. 20 easeOut: function(t,b,c,d){
  21. 21 return c*((t=t/d-1)*t*t + 1) + b;
  22. 22 },
  23. 23 easeInOut: function(t,b,c,d){
  24. 24 if ((t/=d/2) < 1) return c/2*t*t*t + b;
  25. 25 return c/2*((t-=2)*t*t + 2) + b;
  26. 26 }
  27. 27 },
  28. 28 Quart: {
  29. 29 easeIn: function(t,b,c,d){
  30. 30 return c*(t/=d)*t*t*t + b;
  31. 31 },
  32. 32 easeOut: function(t,b,c,d){
  33. 33 return -c * ((t=t/d-1)*t*t*t - 1) + b;
  34. 34 },
  35. 35 easeInOut: function(t,b,c,d){
  36. 36 if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
  37. 37 return -c/2 * ((t-=2)*t*t*t - 2) + b;
  38. 38 }
  39. 39 },
  40. 40 Quint: {
  41. 41 easeIn: function(t,b,c,d){
  42. 42 return c*(t/=d)*t*t*t*t + b;
  43. 43 },
  44. 44 easeOut: function(t,b,c,d){
  45. 45 return c*((t=t/d-1)*t*t*t*t + 1) + b;
  46. 46 },
  47. 47 easeInOut: function(t,b,c,d){
  48. 48 if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
  49. 49 return c/2*((t-=2)*t*t*t*t + 2) + b;
  50. 50 }
  51. 51 },
  52. 52 Sine: {
  53. 53 easeIn: function(t,b,c,d){
  54. 54 return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
  55. 55 },
  56. 56 easeOut: function(t,b,c,d){
  57. 57 return c * Math.sin(t/d * (Math.PI/2)) + b;
  58. 58 },
  59. 59 easeInOut: function(t,b,c,d){
  60. 60 return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
  61. 61 }
  62. 62 },
  63. 63 Expo: {
  64. 64 easeIn: function(t,b,c,d){
  65. 65 return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
  66. 66 },
  67. 67 easeOut: function(t,b,c,d){
  68. 68 return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
  69. 69 },
  70. 70 easeInOut: function(t,b,c,d){
  71. 71 if (t==0) return b;
  72. 72 if (t==d) return b+c;
  73. 73 if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
  74. 74 return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
  75. 75 }
  76. 76 },
  77. 77 Circ: {
  78. 78 easeIn: function(t,b,c,d){
  79. 79 return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
  80. 80 },
  81. 81 easeOut: function(t,b,c,d){
  82. 82 return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
  83. 83 },
  84. 84 easeInOut: function(t,b,c,d){
  85. 85 if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
  86. 86 return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
  87. 87 }
  88. 88 },
  89. 89 Elastic: {
  90. 90 easeIn: function(t,b,c,d,a,p){
  91. 91 if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
  92. 92 if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
  93. 93 else var s = p/(2*Math.PI) * Math.asin (c/a);
  94. 94 return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
  95. 95 },
  96. 96 easeOut: function(t,b,c,d,a,p){
  97. 97 if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
  98. 98 if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
  99. 99 else var s = p/(2*Math.PI) * Math.asin (c/a);
  100. 100 return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b);
  101. 101 },
  102. 102 easeInOut: function(t,b,c,d,a,p){
  103. 103 if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
  104. 104 if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
  105. 105 else var s = p/(2*Math.PI) * Math.asin (c/a);
  106. 106 if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
  107. 107 return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
  108. 108 }
  109. 109 },
  110. 110 Back: {
  111. 111 easeIn: function(t,b,c,d,s){
  112. 112 if (s == undefined) s = 1.70158;
  113. 113 return c*(t/=d)*t*((s+1)*t - s) + b;
  114. 114 },
  115. 115 easeOut: function(t,b,c,d,s){
  116. 116 if (s == undefined) s = 1.70158;
  117. 117 return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
  118. 118 },
  119. 119 easeInOut: function(t,b,c,d,s){
  120. 120 if (s == undefined) s = 1.70158;
  121. 121 if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
  122. 122 return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
  123. 123 }
  124. 124 },
  125. 125 Bounce: {
  126. 126 easeIn: function(t,b,c,d){
  127. 127 return c - Tween.Bounce.easeOut(d-t, 0, c, d) + b;
  128. 128 },
  129. 129 easeOut: function(t,b,c,d){
  130. 130 if ((t/=d) < (1/2.75)) {
  131. 131 return c*(7.5625*t*t) + b;
  132. 132 } else if (t < (2/2.75)) {
  133. 133 return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
  134. 134 } else if (t < (2.5/2.75)) {
  135. 135 return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
  136. 136 } else {
  137. 137 return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
  138. 138 }
  139. 139 },
  140. 140 easeInOut: function(t,b,c,d){
  141. 141 if (t < d/2) return Tween.Bounce.easeIn(t*2, 0, c, d) * .5 + b;
  142. 142 else return Tween.Bounce.easeOut(t*2-d, 0, c, d) * .5 + c*.5 + b;
  143. 143 }
  144. 144 }
  145. 145 };

  下载地址:http://pan.baidu.com/s/1sjQdWQx

  这个算法可以用在很多地方,如果滚动条的移动,物块的移动或各种渐变等等。今天我就用物块移动demo的例子来讲讲这个辅助计算类怎么用吧,首先我们得创建一个定时器或者函数,一下是我常用的方法。

  1. 1 //利用tween.js返回特殊值,生成不同效果
  2. 2 function tweenFn(obj,attr,value,endFn){
  3. 3 var timer = null;
  4. 4 var start = 0; //开始位置
  5. 5 // var value = value //改变值大小
  6. 6 var t = 0; //从0步开始
  7. 7 var endT = 30; //结束步数
  8. 8 clearInterval(timer);
  9. 9 timer = setInterval(function(){
  10. 10 t++;
  11. 11 if(t>endT){
  12. 12 clearInterval(timer);
  13. 13 endFn && endFn();//回调函数存在则返回
  14. 14 return;
  15. 15 };
  16. 16 obj.style[attr] = Tween.Cubic.easeInOut(t,start,value,endT)+"px";
  17. 17 },30);
  18. 18 }

  函数说明:obj,绑定执行的对象;

       attr,改变的属性值;

       value,改变值的大小;

       endFn,执行完毕的回调函数,没有可不写;

       start,属性初始值;

       t,endT,执行的步数,可理解为分多少次执行完。

      函数第十六行中Tween.Cubic.easeInOut(...)为调用tween.js中的方法,可根据实际需求修改Cubic或easeInOut的值。我把里面所有的方法列表如下:

Linear

线性匀速变化

Quad

easeIn

easeOut

easeInOut  

二次方缓动 Expo

easeIn

easeOut

easeInOut

指数曲线缓动
Cubic

easeIn

easeOut

easeInOut  

三次方缓动 Circ  easeIn

easeOut

easeInOut  

圆周曲线缓动
Quart  easeIn

easeOut

easeInOut  

四次方缓动 Elastic  easeIn

easeOut

easeInOut  

弹性伸缩缓动
Quint

easeIn

easeOut

easeInOut   

五次方缓动 Back  easeIn

easeOut

easeInOut  

返回缓动
Sine  easeIn

easeOut

easeInOut  

正弦曲线缓动 Bounce  easeIn

easeOut

easeInOut  

跳动缓动

tween 缓动动画的更多相关文章

  1. jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween

    在jQuery内部函数Animation中调用到了createTweens()来创建缓动动画组,创建完成后的结果为: 可以看到上面的缓动动画组有四个原子动画组成.每一个原子动画的信息都包含在里面了. ...

  2. 背水一战 Windows 10 (15) - 动画: 缓动动画

    [源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...

  3. WPF界面设计技巧(7)—模拟电梯升降的缓动动画

    原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...

  4. Windows Phone开发(42):缓动动画

    原文:Windows Phone开发(42):缓动动画 前面在讨论关键帧动画的时候,我有意把几个带缓动动画的关键帧动画忽略掉,如EasingColorKeyFrame.EasingDoubleKeyF ...

  5. 重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画

    原文:重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 [源码下载] 重新想象 Windows 8 Store Apps (19) - 动画 ...

  6. JS基础知识——缓动动画

    基于距离的缓动动画 原理:设定起始位置  start 和终止位置 end,变化会越来越慢. 公式:start=start+(end-start)/10;     这个10不是固定的,想分成多少份就分成 ...

  7. JS-特效 ~ 04. client对象、网页可视区域的宽高、client / offset / scroll 三大家族的区别、冒泡事件、事件委托、获取内嵌式和外链式属性getStyle(ele,attr) ;、缓动动画封装

    知识点: 模拟滚动条的解除事件问题 : event内置对象,包含 了大量事件: page兼容性: pageX || clientX + scool().top  : if (true === a)tr ...

  8. js简单动画:匀速动画、缓动动画、多物体动画以及透明度动画

    主要实现以下几种简单的动画效果(其实原理基本相同): 1.匀速动画:物体的速度固定 2.缓动动画:物体速度逐渐变慢 3.多物体动画 4.透明度动画 效果实现: 1.匀速动画(以物体左右匀速运动为例) ...

  9. js off 缓动动画

    动画也有很多种,一起来学习,缓动动画吧 缓动动画 1.缓动动画原理=盒子位置+(目标盒子位置-现在盒子位置)/10 2.步长越来越小 3.让步长越来越小的公式      步长=(目标位置-本身位置)/ ...

随机推荐

  1. flex 布局压缩问题

    在 flex 布局中,当有一个元素宽度过长时,另一个元素宽度会被压缩, 如下图: 解决办法:在不想被压缩的元素上加上样式 flex-shrink: 0; 效果图:

  2. tomcat的 tomcat-user.xml

    http://blog.csdn.net/asdeak/article/details/1879284 很多个tomcat因为在缺少 "  <role rolename="m ...

  3. 使用nrm工具高效地管理npm源

    在使用npm时,官方的源下载npm包会比较慢,国内我们基本使用淘宝的源,如果公司内部搭建了一套npm私有仓库,公司内部的源不可能把npm官方的npm包都同步,所以需要切换npm源.如果使用npm/cn ...

  4. linux git pull/push时提示输入账号密码之免除设置

    1.先cd到根目录,执行git config --global credential.helper store命令 [root@iZ25mi9h7ayZ ~]# git config --global ...

  5. Linux下安装MySQL----来自简书(挺好的)

    来自简书的: https://www.jianshu.com/p/f4a98a905011 注: 1. 下载方式: 可以使用命令下载: wget http://downloads.mysql.com/ ...

  6. 深度森林DeepForest

    级联森林(Cascade Forest) 级联森林结构的图示.级联的每个级别包括两个随机森林(蓝色字体标出)和两个完全随机树木森林(黑色). 假设有三个类要预测,因此,每个森林将输出三维类向量,然后将 ...

  7. 转: spring静态注入

    与其说是静态注入(IOC),不如讲是对JavaBean 的静态成员变量进行赋值. 一般我们在使用依赖注入的时候,如果当前对象(javaBean )创建(实例化)一次,那么非静态的成员变量也会实例化一次 ...

  8. [UGUI]Image源码分析

    unity版本5.3.5 一.属性 1.overrideSprite 脚本对精灵的访问均使用overrideSprite,如果m_OverrideSprite存在就使用m_OverrideSprite ...

  9. 格式化hdfs后,hadoop集群启动hdfs,namenode启动成功,datanode未启动

    集群格式化hdfs后,在主节点运行启动hdfs后,发现namenode启动了,而datanode没有启动,在其他节点上jps后没有datanode进程!原因: 当我们使用hdfs namenode - ...

  10. gdb 使用

    2018年7月27日21:05:16 —— 多进程调试 1.follow_fork_mode 作用:在fork之后跟随父进程还是子进程 可以使用 show follow_fork_mode查看再for ...