1. 程式人生 > >移動端滑屏全應用【三】requestAnimationFrame的兼容與使用

移動端滑屏全應用【三】requestAnimationFrame的兼容與使用

畫的 function callback inter tint 發布 條件 win 兼容性

首先,傳統做動畫的方式有以下幾種:

1. css的transition過度動畫

2. css的animation動畫

3. 使用setTimeout或setInterval模擬動畫貞(js執行機制決定了並非嚴格意義上的動畫貞)

定時器模擬動畫又分為 :(1)速度版運動 (2)時間版運動

4.使用requestAnimationFrame

本文主要講的就是requestAnimationFrame,requestAnimationFrame:即在瀏覽器的幀頻下,每隔16.7ms(官方),執行一次動畫,基本不會掉幀,可以保證動畫的流暢性。

但是,requestAnimationFrame是存在兼容性問題的,截止到本文發布時間,其兼容性如下圖:

技術分享圖片

所以東西雖好,但還是要考慮兼容性,兼容性寫法如下:

    window.requestAnimationFrame = window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;
    window.cancelAnimationFrame = window.cancelAnimationFrame|| window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame||window.cancelRequestAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame; 
    
if(!window.requestAnimationFrame){ var lastTime = Date.now();//時間戳 window.requestAnimationFrame = function(callback){ var id; var nowTime = Date.now(); var delay = Math.max(16.7-(nowTime-lastTime),0); //如果上一次的時間 和 本次時間 執行的間隔大於 16.7,那就不再延遲直接執行
id = setTimeout(callback,delay); lastTime = nowTime + delay;//上一次動畫執行的時間 return id; }; } if(!window.cancelAnimationFrame){ window.cancelAnimationFrame = function(index){ clearTimeout(index); }; }
requestAnimationFrame(fn)方法需要傳入回調,就是在幀頻時執行的回調,但是調用後此方法只會執行一次,因此在寫動畫的時候就需要遞歸調用。然後在滿足條件後調用cancelAnimationFram來取消即可。

移動端滑屏全應用【三】requestAnimationFrame的兼容與使用