亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
小程式購物車動(dòng)畫優(yōu)化
首頁 微信小程式 小程式開發(fā) 記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化

記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化

Dec 28, 2021 am 10:21 AM
動(dòng)畫優(yōu)化 小程式

這篇文章跟大家分享一次小程式動(dòng)畫優(yōu)化實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化,希望對大家有幫助!

記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化

小程式購物車動(dòng)畫優(yōu)化

公司小程式點(diǎn)擊加購時(shí),會繪製一個(gè)拋物線動(dòng)畫,這個(gè)拋物線動(dòng)畫是計(jì)算出來的貝塞爾曲線上各點(diǎn)的座標(biāo),再由js遍歷點(diǎn)座標(biāo),然後動(dòng)態(tài)設(shè)定點(diǎn)的樣式,進(jìn)而實(shí)現(xiàn)動(dòng)畫。但這會帶來卡頓掉幀問題

this.goodBoxTimer = setInterval(() => {
  index--
  this.setData({
    'movingBallInfo.posX': linePos[index][0],
    'movingBallInfo.posY': linePos[index][1],
  })
  if (index < 1) {
    this.resetGoodBoxStatus()
  }
}, 30)

前置知識:Event Loop, Task, micro Task, UI Rendering

javascript是單線程語言,這意味著所有任務(wù)都要排隊(duì)。任務(wù)分為兩種:一種是同步任務(wù)(synchronous),另一種是非同步任務(wù)(asynchronous)。同步任務(wù)指的是,在主執(zhí)行緒上排隊(duì)執(zhí)行的任務(wù),只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行後一個(gè)任務(wù);非同步任務(wù)指的是,不進(jìn)入主執(zhí)行緒、而進(jìn)入"任務(wù)佇列"(task queue)的任務(wù),只有"任務(wù)隊(duì)列"通知主線程,某個(gè)非同步任務(wù)可以執(zhí)行了,該任務(wù)才會進(jìn)入主執(zhí)行緒執(zhí)行。

而非同步任務(wù)又分為巨集任務(wù)(Task)和微任務(wù)(micro Task),同理任務(wù)佇列也分成巨集任務(wù)佇列和微任務(wù)佇列。

事件循環(huán)(Event Loop) 大致步驟:

  • 所有同步任務(wù)都在主執(zhí)行緒上執(zhí)行,形成一個(gè)執(zhí)行端(execution context stack)。

  • 只要非同步任務(wù)有了運(yùn)行結(jié)果,就在任務(wù)佇列之中放置一個(gè)事件。

  • 執(zhí)行堆疊中的巨集任務(wù)執(zhí)行完畢,引擎會先讀取微任務(wù),並推入執(zhí)行堆疊。執(zhí)行完成之後,繼續(xù)讀取下一個(gè)微任務(wù)。如果執(zhí)行過中產(chǎn)生新的微任務(wù),就會把這個(gè)微任務(wù)推入微任務(wù)佇列。如果主執(zhí)行緒執(zhí)行完所有微任務(wù)佇列中的任務(wù)中時(shí),就會去讀取巨集任務(wù)佇列,推入執(zhí)行堆疊。

  • 主執(zhí)行緒不斷重複上面的第三步。

常見的巨集任務(wù):

  • setTimeout
  • setInterval
  • postMessage
  • ##...
常見的微任務(wù):

    Promise
  • #MutationObserver
而Event Loop和UI渲染的關(guān)係呢?其實(shí)是執(zhí)行完微任務(wù)佇列裡所有微任務(wù)的之後,由瀏覽器決定是否要進(jìn)行渲染更新。

// demo1
// 渲染發(fā)生在微任務(wù)之后
const con = document.getElementById(&#39;con&#39;);
con.onclick = function () {
  Promise.resolve().then(function Promise1 () {
    con.textContext = 0;
  })
};

記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化

// demo2
// 兩次EventLoop中間沒有渲染
const con = document.getElementById(&#39;con&#39;);
con.onclick = function () {
  setTimeout(function setTimeout1() {
      con.textContent = 0;
      Promise.resolve().then(function Promise1 () {
          console.log(&#39;Promise1&#39;)
    })
  }, 0)
  setTimeout(function setTimeout2() {
    con.textContent = 1;
    Promise.resolve().then(function Promise2 () {
        console.log(&#39;Promise2&#39;)
    })
  }, 0)
};

記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化

我們知道瀏覽器正常情況下的幀率是60fps,即一幀的時(shí)間大約是16.66ms。如果在一幀裡對Dom進(jìn)行了兩次修改,那麼瀏覽器只會取最後一次的修改值去渲染。

// demo3
// 兩次eventloop中有渲染
const con = document.getElementById(&#39;con&#39;);
con.onclick = function () {
  setTimeout(function  setTimeout1() {
    con.textContent = 0;
  }, 0);
  setTimeout(function  setTimeout2() {
    con.textContent = 1;
  }, 16.7);
};

記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化

#盡量不要使用setInterval

由上文可知setInterval是巨集任務(wù),setInterval每隔定義的時(shí)間間隔就會往巨集任務(wù)佇列推入回呼函數(shù),然後主執(zhí)行緒會讀取巨集任務(wù)佇列裡的setInterval回呼函數(shù)並執(zhí)行。但如果主執(zhí)行緒有長任務(wù)(long task)執(zhí)行時(shí),會阻塞讀取,直到主執(zhí)行緒裡的任務(wù)執(zhí)行完才會繼續(xù)讀取,但setInterval往宏任務(wù)佇列新增回調(diào)函數(shù)的操作是不會停止的,這種情況就會造成:函數(shù)執(zhí)行的時(shí)間間隔遠(yuǎn)大於我們定義的時(shí)間間隔。

下面是一個(gè)例子,每次setInterval回呼都需要進(jìn)行大量的計(jì)算,這樣阻塞主執(zhí)行緒

// demo4
const btn = document.getElementById(&#39;btn&#39;)
btn.addEventListener(&#39;click&#39;, setIntervalFn)
let sum = 0
function setIntervalFn() {
  let last
  let countIdx = 0
  const timer = setInterval(function timeFn() {
    countIdx++
    const newTime = new Date().getTime()
    const gap = newTime - last
    last = newTime
    console.log(&#39;setInterval&#39;, gap, countIdx)
    if (countIdx > 5) clearInterval(timer)
    // 10000000
    // 100000
    for (let i = 0; i < 100000; i++) {
      sum+= i
    }
  }, 100)
  last = new Date().getTime()
}

記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化

setInterval的缺點(diǎn):

    當(dāng)主執(zhí)行緒有程式碼執(zhí)行時(shí),巨集任務(wù)佇列會一直按照一定的時(shí)間間隔推入事件回呼函數(shù)。只有當(dāng)主執(zhí)行緒空閒時(shí),才會執(zhí)行回呼函數(shù),但是這些回呼函數(shù)大多都是過時(shí)的。
  • 如果setInterval的回呼間隔比瀏覽器渲染一幀的時(shí)間要短,那麼回呼函數(shù)執(zhí)行了多次,但只會用到最後一次的結(jié)果,這樣也會造成浪費(fèi),甚至有可能會阻塞主線程。
所以盡量用setTimeout去代替setInterval

#使用requestAnimationFrame##如果用js去繪製動(dòng)畫,還是用官方推薦的requestAnimationFrame,而不是setTimeout。

window.requestAnimationFrame()

告訴瀏覽器-你希望執(zhí)行一個(gè)動(dòng)畫,並且要求瀏覽器在下次重繪之前呼叫指定的回呼函數(shù)更新動(dòng)畫</blockquote><p>由上面的例子可知,兩個(gè)宏任務(wù)之間不一定會觸發(fā)瀏覽器渲染,這個(gè)由瀏覽器自己決定,并且瀏覽器的幀率并會一直是60fps,有時(shí)可能會下降到30fps,而setTimeout的回調(diào)時(shí)間是寫死的,就有可能導(dǎo)致修改了多次Dom,而只觸發(fā)了一次ui更新,造成掉幀。</p><pre class='brush:php;toolbar:false;'>// demo5 const con = document.getElementById(&amp;#39;con&amp;#39;); let i = 0; function rAF(){ requestAnimationFrame(function aaaa() { con.textContent = i; Promise.resolve().then(function bbbb(){ if(i &lt; 5) {rAF(); i++;} }); }); } con.onclick = function () { rAF(); };</pre><p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/image/412/705/313/1640657854778507.png" class="lazy" title="1640657854778507.png" alt="記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化"/></p><p>可以看到渲染了5次(五條豎直虛線)</p><p><span style="max-width:90%"><strong>小程序上的動(dòng)畫優(yōu)化</strong></span></p><p>小程序是雙線程架構(gòu)</p><p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/image/416/262/830/164065785853058記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化" class="lazy" title="164065785853058記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化" alt="記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化"/></p><p>好處是:ui渲染和js主線程是分開的,我們知道在瀏覽器中這兩者是互斥的,所以當(dāng)主線程有阻塞時(shí),頁面交互就會失去響應(yīng),而小程序中不會出現(xiàn)這樣的情況。</p><p>壞處是:邏輯層、渲染層有通信延時(shí),大量的通信也會造成性能瓶頸。</p><p>小程序提供了wxs用來處理渲染層的邏輯。</p><p><span style="max-width:90%"><strong>購物車拋物線動(dòng)畫優(yōu)化</strong></span></p><p>所以我們不應(yīng)該用setInterval去執(zhí)行動(dòng)畫,我們修改成,當(dāng)點(diǎn)擊加購時(shí),把點(diǎn)擊坐標(biāo)與目標(biāo)坐標(biāo)傳入<code>wxs,然后計(jì)算運(yùn)行軌跡點(diǎn)的坐標(biāo)計(jì)算,接著用requestAnimationFrame執(zhí)行動(dòng)畫幀

// wxs
function executeCartAnimation () {
  curCoordIdx = coordArr.length - 1
  ins.requestAnimationFrame(setStyleByFrame)
}

function setStyleByFrame() {
  if (curCoordIdx >= 0) {
    ins.selectComponent(&#39;.cart-animation&#39;).setStyle({
      display: &#39;block&#39;,
      left: coordArr[curCoordIdx].x + &#39;px&#39;, 
      top: coordArr[curCoordIdx].y + &#39;px&#39;
    })
    curCoordIdx -= 1
    ins.requestAnimationFrame(setStyleByFrame)
  } else {
    ins.selectComponent(&#39;.cart-animation&#39;).setStyle({
      display: &#39;none&#39;
    })
  }
}

在真機(jī)上效果非常明顯,低端安卓機(jī)上的動(dòng)畫也非常絲滑。但是錄屏效果不好,這里就不放了。

【相關(guān)學(xué)習(xí)推薦:小程序開發(fā)教程

以上是記錄一次實(shí)踐,看看小程式購物車動(dòng)畫怎麼優(yōu)化的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
使用Python開發(fā)微信小程式 使用Python開發(fā)微信小程式 Jun 17, 2023 pm 06:34 PM

隨著行動(dòng)互聯(lián)網(wǎng)技術(shù)和智慧型手機(jī)的普及,微信成為了人們生活中不可或缺的一個(gè)應(yīng)用。而微信小程式則讓人們可以在不需要下載安裝應(yīng)用程式的情況下,直接使用小程式來解決一些簡單的需求。本文將介紹如何使用Python來開發(fā)微信小程式。一、準(zhǔn)備工作在使用Python開發(fā)微信小程式之前,需要先安裝相關(guān)的Python函式庫。這裡推薦使用wxpy和itchat這兩個(gè)函式庫。 wxpy是一個(gè)微信機(jī)器

實(shí)作微信小程式中的卡片翻轉(zhuǎn)特效 實(shí)作微信小程式中的卡片翻轉(zhuǎn)特效 Nov 21, 2023 am 10:55 AM

實(shí)作微信小程式中的卡片翻轉(zhuǎn)特效在微信小程式中,實(shí)現(xiàn)卡片翻轉(zhuǎn)特效是一種常見的動(dòng)畫效果,可以提升使用者體驗(yàn)和介面互動(dòng)的吸引力。以下將具體介紹如何在微信小程式中實(shí)現(xiàn)卡片翻轉(zhuǎn)的特效,並提供相關(guān)程式碼範(fàn)例。首先,需要在小程式的頁面佈局檔案中定義兩個(gè)卡片元素,一個(gè)用於顯示正面內(nèi)容,一個(gè)用於顯示背面內(nèi)容,具體範(fàn)例程式碼如下:&lt;!--index.wxml--&gt;&l

支付寶上線「漢字拾光-生僻字」小程序,用於徵集、補(bǔ)充生僻字庫 支付寶上線「漢字拾光-生僻字」小程序,用於徵集、補(bǔ)充生僻字庫 Oct 31, 2023 pm 09:25 PM

本站10月31日消息,今年5月27日,螞蟻集團(tuán)宣布啟動(dòng)“漢字拾光計(jì)劃”,最近又迎來新進(jìn)展:支付寶上線“漢字拾光-生僻字”小程序,用於向社會徵集生僻字,補(bǔ)充生僻字庫,同時(shí)提供不同的生僻字輸入體驗(yàn),以幫助完善支付寶內(nèi)的生僻字輸入方法。目前,用戶搜尋「漢字拾光」、「生僻字」等關(guān)鍵字就可以進(jìn)入「生僻字」小程式。在小程式裡,使用者可以提交尚未被系統(tǒng)辨識輸入的生僻字圖片,支付寶工程師確認(rèn)後,將會對字庫進(jìn)行補(bǔ)錄入。本站注意到,使用者也可以在小程式體驗(yàn)最新的拆字輸入法,這項(xiàng)輸入法針對讀音不明確的生僻字設(shè)計(jì)。用戶拆

小程式能用react嗎 小程式能用react嗎 Dec 29, 2022 am 11:06 AM

小程式能用react,其使用方法:1、基於「react-reconciler」實(shí)作一個(gè)渲染器,產(chǎn)生一個(gè)DSL;2、建立一個(gè)小程式元件,去解析和渲染DSL;3、安裝npm,並執(zhí)行開發(fā)者工具中的建構(gòu)npm;4、在自己的頁面中引入包,再利用api即可完成開發(fā)。

uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換 uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換 Oct 20, 2023 pm 02:12 PM

uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換,需要具體程式碼範(fàn)例近年來,隨著行動(dòng)網(wǎng)路的發(fā)展和智慧型手機(jī)的普及,小程式和H5成為了不可或缺的應(yīng)用形式。而uniapp作為一個(gè)跨平臺的開發(fā)框架,可以在一套程式碼的基礎(chǔ)上,快速實(shí)現(xiàn)小程式和H5的轉(zhuǎn)換,大大提高了開發(fā)效率。本文將介紹uniapp如何實(shí)現(xiàn)小程式和H5的快速轉(zhuǎn)換,並給出具體的程式碼範(fàn)例。一、uniapp簡介unia

教你如何在小程式中用公眾號範(fàn)本訊息(附詳細(xì)想法) 教你如何在小程式中用公眾號範(fàn)本訊息(附詳細(xì)想法) Nov 04, 2022 pm 04:53 PM

這篇文章給大家?guī)砹岁P(guān)於微信小程式的相關(guān)問題,其中主要介紹瞭如何在小程式中用公眾號範(fàn)本訊息,下面一起來看一下,希望對大家有幫助。

用Python編寫簡單的聊天程式教程 用Python編寫簡單的聊天程式教程 May 08, 2023 pm 06:37 PM

實(shí)現(xiàn)思路x01服務(wù)端的建立首先,在服務(wù)端,使用socket進(jìn)行訊息的接受,每接受一個(gè)socket的請求,就開啟一個(gè)新的線程來管理訊息的分發(fā)與接受,同時(shí),又存在一個(gè)handler來管理所有的線程,從而實(shí)現(xiàn)對聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務(wù)端簡單多了,客戶端的作用只是對消息的發(fā)送以及接受,以及按照特定的規(guī)則去輸入特定的字符從而實(shí)現(xiàn)不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個(gè)線程,一個(gè)是專門用於接受消息,一個(gè)是專門用於發(fā)送消息的至於為什麼不用一個(gè)呢,那是因?yàn)?只

PHP與小程式的地理位置定位與地圖顯示 PHP與小程式的地理位置定位與地圖顯示 Jul 04, 2023 pm 04:01 PM

PHP與小程式的地理位置定位與地圖顯示地理位置定位與地圖顯示在現(xiàn)代科技中已經(jīng)成為了必備的功能之一。隨著行動(dòng)裝置的普及,人們對於定位和地圖顯示的需求也越來越高。在開發(fā)過程中,PHP和小程式是常見的兩種技術(shù)選擇。本文將為大家介紹PHP與小程式中的地理位置定位與地圖顯示的實(shí)作方法,並附上對應(yīng)的程式碼範(fàn)例。一、PHP中的地理位置定位在PHP中,我們可以使用第三方地理位

See all articles