最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js中requestAnimationFrame()解讀與使用示例

 更新時間:2024年09月12日 09:33:18   作者:OEC小胖胖  
requestAnimationFrame()是JavaScript中用于創(chuàng)建高效、流暢動畫的核心方法,它與瀏覽器的重繪過程同步,確保每次動畫更新都與顯示器刷新率同步,下面就來一起了解一下

requestAnimationFrame() 是 JavaScript 中用于實現(xiàn)動畫效果的一個重要方法。它告訴瀏覽器你想執(zhí)行動畫,并要求瀏覽器在下次重繪之前調(diào)用指定的回調(diào)函數(shù)來更新動畫。相比傳統(tǒng)的 setTimeout 和 setInterval,requestAnimationFrame() 更加高效且能夠提供更流暢的動畫。

基本概念

1. 瀏覽器的重繪和回流

瀏覽器通過一個叫做“幀”的機制來渲染頁面內(nèi)容。一般來說,瀏覽器每秒會嘗試?yán)L制 60 幀(60FPS),每一幀都需要瀏覽器計算布局、樣式,并把內(nèi)容繪制到屏幕上。requestAnimationFrame() 是專門為此設(shè)計的,它會讓你的動畫代碼在瀏覽器的重繪過程中執(zhí)行,確保每次動畫更新都與瀏覽器的刷新頻率同步。

2. 效率和節(jié)能

requestAnimationFrame() 會根據(jù)顯示器的刷新率來自動調(diào)節(jié)幀率,常見的刷新率是 60FPS。如果你的顯示器是 60Hz,requestAnimationFrame() 每秒會回調(diào)約 60 次。如果瀏覽器窗口被最小化,或者切換到另一個標(biāo)簽頁,requestAnimationFrame() 會暫停執(zhí)行,減少CPU和GPU的負(fù)載。這和 setTimeout、setInterval 不同,它們會一直執(zhí)行,即使頁面不可見。

使用方法

let start = null;

function step(timestamp) {
  if (!start) start = timestamp;
  const progress = timestamp - start;

  // 更新動畫的位置,這里是簡單的例子,假設(shè)移動一個物體
  const element = document.getElementById('box');
  element.style.transform = `translateX(${Math.min(progress / 10, 200)}px)`;

  if (progress < 2000) { // 繼續(xù)動畫,直到經(jīng)過2秒
    requestAnimationFrame(step);
  }
}

requestAnimationFrame(step);

示例詳解

1. 回調(diào)函數(shù)

requestAnimationFrame() 需要一個回調(diào)函數(shù)作為參數(shù),這個回調(diào)函數(shù)會在瀏覽器準(zhǔn)備好繪制下一幀時被調(diào)用。在上面的示例中,step 函數(shù)就是這個回調(diào)函數(shù)。

2. timestamp 參數(shù)

瀏覽器會為回調(diào)函數(shù)傳遞一個 timestamp 參數(shù),表示當(dāng)前被請求的動畫幀開始時的時間戳。這個 timestamp 是以毫秒為單位的高精度時間,可以用來計算動畫進行的時間差。

3. 遞歸調(diào)用

在 step 函數(shù)內(nèi)部,我們通過 requestAnimationFrame() 自己調(diào)用自己,形成一個動畫的遞歸循環(huán)。每一次調(diào)用 requestAnimationFrame(step),瀏覽器都會在下一幀時再次執(zhí)行 step 函數(shù)。

4. 條件控制

為了停止動畫,我們可以在遞歸調(diào)用時通過條件判斷,比如在上面的例子中,我們通過 progress < 2000 來控制動畫持續(xù) 2 秒。如果不加這個條件,動畫會一直進行下去。

與 setTimeout 和 setInterval 的比較

function moveBoxWithSetTimeout() {
  let position = 0;
  const element = document.getElementById('box');

  function update() {
    position += 5;
    element.style.transform = `translateX(${position}px)`;
    
    if (position < 200) {
      setTimeout(update, 1000 / 60); // 每秒60次更新
    }
  }

  update();
}

function moveBoxWithRequestAnimationFrame() {
  let position = 0;
  const element = document.getElementById('box');

  function update() {
    position += 5;
    element.style.transform = `translateX(${position}px)`;

    if (position < 200) {
      requestAnimationFrame(update);
    }
  }

  requestAnimationFrame(update);
}

區(qū)別:

  • 時間控制

    • setTimeout(update, 1000 / 60) 人為指定每秒60幀,但實際性能可能受限于瀏覽器、CPU 等,不一定精準(zhǔn)。
    • requestAnimationFrame() 由瀏覽器根據(jù)系統(tǒng)的負(fù)載來決定最佳幀率,并與顯示器的刷新同步。
  • 后臺標(biāo)簽頁處理

    • setTimeout 和 setInterval 在后臺標(biāo)簽頁或最小化時仍然運行,浪費資源。
    • requestAnimationFrame() 會在頁面不可見時暫停,節(jié)省資源。
  • 流暢度

    • setTimeout 和 setInterval 由于無法和瀏覽器的重繪同步,容易導(dǎo)致卡頓、抖動。
    • requestAnimationFrame() 能提供更加平滑的動畫效果。

多個動畫場景

你可以通過 requestAnimationFrame() 同時控制多個動畫。只需要確保每個動畫邏輯在回調(diào)函數(shù)中被正確處理。

let box1 = document.getElementById('box1');
let box2 = document.getElementById('box2');
let start = null;

function animate(timestamp) {
  if (!start) start = timestamp;
  const progress = timestamp - start;

  box1.style.transform = `translateX(${Math.min(progress / 10, 200)}px)`;
  box2.style.transform = `translateY(${Math.min(progress / 20, 300)}px)`;

  if (progress < 2000) {
    requestAnimationFrame(animate);
  }
}

requestAnimationFrame(animate);

上面的代碼演示了:

  • box1 向右移動,每 10 毫秒移動一個像素,直到移動 200 像素。
  • box2 向下移動,每 20 毫秒移動一個像素,直到移動 300 像素。

多個元素的動畫可以在同一個 requestAnimationFrame 回調(diào)中進行,這樣它們會同步進行,保證幀率的一致性。

動畫的取消

requestAnimationFrame() 返回一個唯一的整數(shù) ID,代表該動畫幀請求??梢允褂?nbsp;cancelAnimationFrame() 取消這個動畫。

let animationId;

function step(timestamp) {
  // 動畫邏輯
  if (progress &lt; 2000) {
    animationId = requestAnimationFrame(step);
  }
}

// 開始動畫
animationId = requestAnimationFrame(step);

// 取消動畫
cancelAnimationFrame(animationId);

總結(jié)

  • 同步與瀏覽器刷新頻率requestAnimationFrame() 是與顯示器的刷新率同步的動畫方法,通常會以 60FPS 執(zhí)行。
  • 高效與節(jié)能:在頁面不可見時,requestAnimationFrame() 會暫停執(zhí)行,避免不必要的計算。
  • 流暢的動畫體驗:由于它與瀏覽器的重繪同步,能帶來更加流暢的動畫效果。

通過掌握 requestAnimationFrame(),你可以更輕松地創(chuàng)建流暢且高效的動畫效果,它是現(xiàn)代 Web 動畫開發(fā)的核心工具之一。

到此這篇關(guān)于js中requestAnimationFrame()解讀與使用示例的文章就介紹到這了,更多相關(guān)js requestAnimationFrame()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于JS中match() 和 exec() 返回值和屬性的測試

    關(guān)于JS中match() 和 exec() 返回值和屬性的測試

    這篇文章主要介紹了關(guān)于JS中match() 和 exec() 返回值和屬性的測試 的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 解決火狐瀏覽器下JS setTimeout函數(shù)不兼容失效不執(zhí)行的方法

    解決火狐瀏覽器下JS setTimeout函數(shù)不兼容失效不執(zhí)行的方法

    今天檢查自己用JQuery+AJAX+PHP做的網(wǎng)站后臺登錄檢測,愛其他瀏覽器中兼容性還不錯 結(jié)果到了火狐(FireFox)瀏覽器下setTimeout這個JS內(nèi)置函數(shù)不執(zhí)行了,本文將提供詳細(xì)的解決方法
    2012-11-11
  • JS實現(xiàn)的DIV塊來回滾動效果示例

    JS實現(xiàn)的DIV塊來回滾動效果示例

    這篇文章主要介紹了JS實現(xiàn)的DIV塊來回滾動效果,結(jié)合實例形式分析了JS通過時間函數(shù)定時觸發(fā)動態(tài)改變頁面元素樣式的相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • JavaScript實現(xiàn)excel文件導(dǎo)入導(dǎo)出

    JavaScript實現(xiàn)excel文件導(dǎo)入導(dǎo)出

    這篇文章主要介紹了JavaScript實現(xiàn)excel文件導(dǎo)入導(dǎo)出,文件的導(dǎo)入導(dǎo)出是非常常見的需求功能,excel文件的導(dǎo)入導(dǎo)出更為常見,實踐中許多時候,是調(diào)用接口實現(xiàn)導(dǎo)入導(dǎo)出的,具體實現(xiàn)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06
  • 微信小程序scroll-view實現(xiàn)自定義滾動條

    微信小程序scroll-view實現(xiàn)自定義滾動條

    這篇文章主要為大家詳細(xì)介紹了微信小程序scroll-view實現(xiàn)自定義滾動條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 無constructor的class類還能new嗎問題解析

    無constructor的class類還能new嗎問題解析

    這篇文章主要為大家介紹了無constructor的class類是否還能new的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 詳解JavaScript常量定義

    詳解JavaScript常量定義

    本文主要對JavaScript常量定義進行詳細(xì)介紹,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 詳解JavaScript中8 種不同的繼承實現(xiàn)方式

    詳解JavaScript中8 種不同的繼承實現(xiàn)方式

    在 JavaScript 中,繼承是實現(xiàn)代碼復(fù)用和構(gòu)建復(fù)雜對象關(guān)系的重要機制,雖然 JavaScript 是一門基于原型的語言,不像傳統(tǒng)面向?qū)ο笳Z言那樣有類的概念,但它提供了多種實現(xiàn)繼承的方式,本文將詳細(xì)介紹 JavaScript 中 8 種不同的繼承實現(xiàn)方式,需要的朋友可以參考下
    2025-05-05
  • 詳解BootStrap表單驗證中重置BootStrap-select驗證提示不清除的坑

    詳解BootStrap表單驗證中重置BootStrap-select驗證提示不清除的坑

    這篇文章主要介紹了詳解BootStrap表單驗證中重置BootStrap-select驗證提示不清除的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • JAVASCRIPT HashTable

    JAVASCRIPT HashTable

    JAVASCRIPT HashTable...
    2007-01-01

最新評論

同江市| 宜阳县| 双柏县| 瓮安县| 忻城县| 宝坻区| 林西县| 启东市| 息烽县| 扎囊县| 乡宁县| 长海县| 平度市| 万载县| 青岛市| 洛宁县| 婺源县| 长垣县| 牡丹江市| 通海县| 寿阳县| 调兵山市| 普兰店市| 丽水市| 塘沽区| 革吉县| 达州市| 神木县| 新乡市| 长治市| 错那县| 平和县| 宁海县| 宜兰市| 措美县| 绥江县| 杨浦区| 西乡县| 潢川县| 浙江省| 宜兰市|