JS—動畫緩動—tween.js

requestAnimFrame兼容

window.requestAnimFrame = (function (callback,time) {
    return window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.oRequestAnimationFrame ||
        window.msRequestAnimaitonFrame ||
        function (callback) {
            window.setTimeout(callback, time);
        };
})();

tween.js

參數

/*
 * t: current time(當前時間,小於持續時間,tween返回當前時間目標的狀態);
 * b: beginning value(初始值);
 * c: change in value(變化量);
 * d: duration(持續時間)。
*/

動畫運動算法

  1. Linear:線性勻速運動效果;
  2. Quadratic:二次方的緩動(t^2);
  3. Cubic:三次方的緩動(t^3);
  4. Quartic:四次方的緩動(t^4);
  5. Quintic:五次方的緩動(t^5);
  6. Sinusoidal:正弦曲線的緩動(sin(t));
  7. Exponential:指數曲線的緩動(2^t);
  8. Circular:圓形曲線的緩動(sqrt(1-t^2));
  9. Elastic:指數衰減的正弦曲線緩動;
  10. Back:超過範圍的三次方緩動((s+1)t^3 – st^2);
  11. Bounce:指數衰減的反彈緩動。

每一個效果都分三個緩動方式,分別是:javascript

  • easeIn:從0開始加速的緩動,也就是先慢後快;
  • easeOut:減速到0的緩動,也就是先快後慢;
  • easeInOut:前半段從0開始加速,後半段減速到0的緩動。

Tween.js動畫算法使用示意實例頁面html

例子

1.java

var t = 0, b = 0, c = 100, d = 10;
var step = function () {
    // value就是當前的位置值
    // 例如咱們能夠設置DOM.style.left = value + 'px'實現定位
    var value = Tween.Linear(t, b, c, d);
    t++;
    if (t <= d) {
         // 繼續運動
         requestAnimationFrame(step);
    } else {
        // 動畫結束
    }
};

2.返回頂部/setIntervalweb

backTop(){
        var Tween = {
          Linear: function(t, b, c, d) { //勻速運動
            return c * t / d + b; 
          }
        }
        Math.tween = Tween;
        var t = 0;
        const b = document.documentElement.scrollTop;
        const c = 100;
        const d = 5;
        const setInt = setInterval(()=>{
          t--;
          //console.log(t)
          if(document.documentElement.scrollTop == 0){clearInterval(setInt)}
          //console.log(t);
          const backTop = Tween.Linear(t,b,c,d);
          //console.log(backTop);
          document.documentElement.scrollTop = backTop;
        },5)
},

xuequ
學趣樂園,backLeft算法

Tweenjs

安裝

npm install @tweenjs/tween.js

例子

var box = document.createElement('div');
box.style.setProperty('background-color', '#008800');
box.style.setProperty('width', '100px');
box.style.setProperty('height', '100px');
document.body.appendChild(box);
 
// 動畫循環
function animate(time) {
    requestAnimationFrame(animate);
    TWEEN.update(time);
}
requestAnimationFrame(animate);
 
var coords = { x: 0, y: 0 }; // 開始位置
var tween = new TWEEN.Tween(coords) // 建立一個更改目標的tween

.to({ x: 300, y: 200 }, 1000) // 目的位置,1s
.easing(TWEEN.Easing.Quadratic.Out) // 平滑動畫
.onUpdate(function() { // 目標更新後調用
    // CSS translation
    box.style.setProperty('transform', 'translate(' + coords.x + 'px, ' + coords.y + 'px)');
})
.start();

Tween.js各種原生動畫運動緩動算法
Projects using tween.jsnpm

相關文章
相關標籤/搜索