緩動動畫js小算法

后宮請翻Tween.js

1. 先快后慢的緩動動畫

用一個簡單的公式表示就是:

A = A + (B - A) / 2;

用人話講就是:

我下一秒的位置 = 現在位置 + 現在和初戀之間距離的一半

先來介紹下requestAnimationFrame,對于不支持的瀏覽器,采用下面的兼容寫法:

if (!window.requestAnimationFrame) {
  requestAnimationFrame = function(fn) {
    setTimeout(fn, 17);  
  }
}

下面來看一個??子:

var back_to_top = function(rate) {
  var doc = document.body.scrollTop ? document.body : document.documentElement,
  scrollTop = doc.scrollTop;
  var top = function() {
    scrollTop += (0 - scrollTop) / (rate || 2);
    // 臨界判斷,終止動畫
    if (scrollTop < 1) {
      doc.scrollTop = 0;
      return;
    }
    doc.scrollTop = scrollTop;
    requestAnimationFrame(top);
  };
  top();
}

2. 小算法變身

Math.easeOut = function(A, B, rate, callback) {
  if (A == B || typeof A != 'number') {
    return;
  }
  B = B || 0;
  rate = rate || 2;
  var step = function() {
    A = A + (B - A) / rate;
    if (A < 1) {
      callback(B, true);
      return;
    }
    callback(A, false);
    requestAnimationFrame();
  };
  step();
}

于是,我們的返回頂部效果可以這么使用:

var doc = document.body.scrollTop? document.body : document.documentElement;
Math.easeout(doc.scrollTop, 0, 4, function (value) {
    doc.scrollTop = value;
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 看了很多視頻、文章,最后卻通通忘記了,別人的知識依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印象,因...
    DCbryant閱讀 734評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,820評論 25 708
  • 一:canvas簡介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,707評論 2 32
  • React Native 進階(二)--動畫 動畫 流暢、有意義的動畫對于移動應用用戶體驗來說是非常必要的。我們可...
    呼呼哥閱讀 2,823評論 2 5
  • 不喜歡成功學,卻聽了好多的成功學。后來發現所有成功學的書講到最后,道理都是差不多的,夢想,目標,欲望,行動,信念,...
    聽雨廖哥閱讀 107評論 0 0