Javascript動畫(一)
Javascript定時執行程式碼塊方式
number:setInterval(func, msec)
此方法是每隔一定的時間(msec引數值)呼叫一次傳給它的函式(func引數),若不主動呼叫clearInterval(number)取消定時器,則會一直執行下去。
function animate(){
// 需執行的程式碼
}
// 每秒60幀速率執行
let timerId = setInterval(animate, 1000 / 60);
// 取消定時器
clearInterval(timerId)
number:setTimeout(func, msec)
此方法是在一定時間(msec引數)後,呼叫一次傳給它的函式(func引數),若需重複執行,則需在重複呼叫setTimeout
function animate(){
let start = +new Date(), end;
// 需執行的程式碼
end = +new Date()
// 重複執行
setTimeout(animate, 1000 / 60 - (end - start)); // 做次時間上的補償,使之更接近1秒60幀的速率
}
animate()
提示: setInterval與setTimeout中的msec引數可不填寫或填寫不為正數的值,意思是使瀏覽器以它所允許的最小時間間隔來呼叫func函式。
HTML5 出的number:requestAnimationFrame(func)
setInterval與setTimeout都是開發者告訴瀏覽器,在某個大致的時間點上執行程式碼。若是在繪製動畫,我們其實並不清楚繪製下一幀的最佳時機,相反,瀏覽器肯定比我們更瞭解繪製下一幀動畫的最佳時機。
requestAnimationFrame為此而生!
瀏覽器會在最佳時機呼叫func函式,若需一直執行下去,則需在func內再次呼叫requestAnimationFrame(func)
,瀏覽器會給func傳遞一個從程式啟動(頁面載入)到呼叫func函式時的時間間隔(chrome瀏覽器)
let handleId = 0;
let lasttime = undefined;
// 瀏覽器會給函式傳遞一個從程式啟動(頁面載入)到呼叫animate函式時的時間間隔
function animate(time){
if (lasttime === undefined) { // 拋棄第一幀
lasttime = time;
} else {
let dt = time - lasttime; // 此幀距上一幀的時間間隔
lasttime = time;
// 需執行的程式碼
}
// 重複執行
handleId = requestAnimationFram(animate); // 做次時間上的補償,使之更接近1秒60幀的速率
}
// 使瀏覽在最佳時機執行第一幀動畫
handleId = requestAnimationFram(animate);
// ==== 取消 ====
cancelAnimationFrame(handleId);
提示: Chrome 瀏覽器呼叫動畫回撥函式的最大速率不超過每秒60次。
requestAnimationFrame的polyfill
(function (win) {
'use strict';
var startTime = +new Date(); //程式啟動時的時間點
win.requestAnimationFrame = (function () {
return win.requestAnimationFrame ||
win.webkitRequestAnimationFrame ||
win.mozRequestAnimationFrame ||
win.msRequestAnimationFrame ||
function (callback) {
var self = this,
start, finish;
return win.setTimeout(function () {
start = +new Date();
callback(start - startTime); //將程式執行的總時長返回給回撥函式
finish = +new Date();
self.timeout = 1000 / 60 - (finish - start);
}, self.timeout);
}
})();
win.cancelAnimationFrame = (function () {
return win.cancelAnimationFrame ||
win.webkitCancelAnimationFrame ||
win.mozCancelAnimationFrame ||
win.msCancelAnimationFrame ||
function (id) {
win.clearTimeout(id);
}
})();
})(window)
下一節:動起來了的小球
相關文章
- 大話 JavaScript 動畫JavaScript動畫
- JavaScript 簡單動畫效果JavaScript動畫
- JavaScript簡單的動畫效果JavaScript動畫
- 【Android 動畫】動畫詳解之補間動畫(一)Android動畫
- JavaScript 動畫方式彈出圓角框JavaScript動畫
- JavaScript教程全套影片合集:DOM動畫效果JavaScript動畫
- 【譯】用 JavaScript 和 Emoji 做位址列動畫JavaScript動畫
- 2021年五大JavaScript動畫庫 - DEVJavaScript動畫dev
- 安卓動畫(一)安卓動畫
- iOS 動畫技巧 (一)iOS動畫
- JavaScript 動畫效果緩慢二級下拉選單JavaScript動畫
- 2018年值得期待11個Javascript動畫庫JavaScript動畫
- setTimeout(fn, 0) // it works - JavaScript 事件迴圈 動畫演示JavaScript事件動畫
- javascript封裝動畫函式(勻速、變速)JavaScript封裝動畫函式
- JavaScript氣泡排序+Vue視覺化冒泡動畫JavaScript排序Vue視覺化動畫
- CSS 怎樣寫一個動畫(從基礎動畫到3d動畫)CSS動畫3D
- Flutter動畫:用Flutter來實現一個拍手動畫Flutter動畫
- 系統學習iOS動畫之一:檢視動畫iOS動畫
- Flutter 動畫詳解(一)Flutter動畫
- Flare動畫進階——建立可互動的一拳超人動畫動畫
- 2019年10個最受歡迎的JavaScript動畫庫!JavaScript動畫
- JavaScript與CSS3動畫方式改變元素尺寸JavaScriptCSSS3動畫
- 每週一個前端動畫之二:支援率展示動畫前端動畫
- Android 動畫詳解:屬性動畫、View 動畫和幀動畫Android動畫View
- View動畫、幀動畫View動畫
- 【JavaScript框架封裝】實現一個類似於JQuery的動畫框架的封裝JavaScript框架封裝jQuery動畫
- Android轉場動畫一說Android動畫
- css3 動畫(一) transitionCSSS3動畫
- 動畫的另外一種方式動畫
- 核心動畫程式設計(一)動畫程式設計
- JavaScript動畫方式控制div元素的隱藏和顯示JavaScript動畫
- iOS 動畫之Spring動畫、Block動畫、GIF圖iOS動畫SpringBloC
- 分享一個簡單的畫刷動畫效果:?️BrushEffect動畫
- 每週一個前端動畫之四:掘金頭像旋轉動畫前端動畫
- 【動畫消消樂 】仿ios、android中常見的一個loading動畫 074動畫iOSAndroid
- 【Android 動畫】動畫詳解之屬性動畫(三)Android動畫
- 【Android 動畫】動畫詳解之屬性動畫(五)Android動畫
- JavaScript介面畫柱狀圖JavaScript