摘要:大家可以嘗試使用的,配置一個(gè)合適的勁度系數(shù)和空氣阻力。所做的事,只不過自己實(shí)現(xiàn)了一套緩動(dòng)函數(shù)。
根據(jù)經(jīng)典力學(xué)的觀點(diǎn),世界上所有的原子每時(shí)每刻仿佛都會(huì)根據(jù)當(dāng)前速度、受力和位置計(jì)算出下一刻的速度、受力和位置。上帝有一臺(tái)超級計(jì)算機(jī)嗎?非也,反而計(jì)算機(jī)是我們利用原子的這些特性拼裝出來的。現(xiàn)在,我們卻要用計(jì)算機(jī),像上帝那樣,再造一個(gè)世界。
我不知道這個(gè)世界上有沒有“仿世學(xué)”,但是既然動(dòng)畫是要模仿現(xiàn)實(shí)世界,那么實(shí)現(xiàn)動(dòng)畫的根本方法就是借鑒上帝的辦法——模擬自然規(guī)律。本文以 React Motion 實(shí)現(xiàn)原理為背景,介紹一種通用的模擬物理規(guī)律的方法,以及如何使用這種方法實(shí)現(xiàn) React Motion 的緩動(dòng)函數(shù)。讓我們來當(dāng)一回上帝吧。
什么是緩動(dòng)函數(shù)動(dòng)畫的原理看似復(fù)雜,其實(shí)就是每幀不停得渲染。一張靜態(tài)頁面的渲染就是在一幀中渲染。如何渲染每一幀呢?我們可以用最簡單,同時(shí)也是最繁瑣的方法,就像最原始的動(dòng)畫片那樣,寫 n 張靜態(tài)頁面,然后每隔一幀切換一張。
假如我們已經(jīng)勤奮地寫好了 P_1, P_2, ... P_n 這 n 張頁面,我們用它來實(shí)現(xiàn)一個(gè)簡單的動(dòng)畫:
// pages: [P1, P2, P3 ... Pn]; const pageCount = pages.length; const startAnimation = (currPageIndex) => { if (currIndex === pageCount) { return ; } document.body.innerHTML = (pages[currPageIndex++]); setTimeout(startAnimation.bind(null, currPageIndex), frameTime) } startAnimation(0);
用這種方法有著顯而易見的問題:
寫 n 張頁面頁面渲染效率十分低下。
每次重新設(shè)置 body.innerHTML,性能太低了。
我們來逐個(gè)解決上述問題。
每一幀的界面都遵循一定的規(guī)律,相似性很高,中間必然有很多重復(fù)勞動(dòng)。既然是重復(fù)勞動(dòng),我們可以放心的交給計(jì)算機(jī)去完成。寫一個(gè)渲染函數(shù),只需要向這個(gè)函數(shù)描述一下當(dāng)前頁面的信息,這個(gè)函數(shù)就能把頁面給渲染出來。
可以用局部更新的方式來取代塊更新,其中 React 的 Virtual DOM 更新方便地解決了這個(gè)問題。
我們再以一個(gè)左右切換的 toggle 動(dòng)畫為例,寫一個(gè)渲染函數(shù):
const render = x => `相關(guān)文章
React Web 動(dòng)畫的 5 種創(chuàng)建方式,每一種都不簡單
摘要:以前一直投入在中,寫動(dòng)畫的時(shí)候不是用中的,就是依賴像這樣的庫,最近轉(zhuǎn)向,在得到很多大佬關(guān)于動(dòng)畫的回應(yīng),于是決定分享給大家,如有其他見解,非常歡迎在下面評論中交流以下便是本文要分享的創(chuàng)建動(dòng)畫的幾種方式下面,勒次個(gè)特斯大特一特給元素添加是最簡單 以前一直投入在 React Native 中,寫動(dòng)畫的時(shí)候不是用 CSS 中的 transitions / animations,就是依賴像 Gr...
react進(jìn)階漫談
摘要:父組件向子組件之間非常常見,通過機(jī)制傳遞即可。我們應(yīng)該聽說過高階函數(shù),這種函數(shù)接受函數(shù)作為輸入,或者是輸出一個(gè)函數(shù),比如以及等函數(shù)。在傳遞數(shù)據(jù)的時(shí)候,我們可以用進(jìn)一步提高性能。 本文主要談自己在react學(xué)習(xí)的過程中總結(jié)出來的一些經(jīng)驗(yàn)和資源,內(nèi)容邏輯參考了深入react技術(shù)棧一書以及網(wǎng)上的諸多資源,但也并非完全照抄,代碼基本都是自己實(shí)踐,主要為平時(shí)個(gè)人學(xué)習(xí)做一個(gè)總結(jié)和參考。 本文的關(guān)鍵...
react進(jìn)階漫談
摘要:父組件向子組件之間非常常見,通過機(jī)制傳遞即可。我們應(yīng)該聽說過高階函數(shù),這種函數(shù)接受函數(shù)作為輸入,或者是輸出一個(gè)函數(shù),比如以及等函數(shù)。在傳遞數(shù)據(jù)的時(shí)候,我們可以用進(jìn)一步提高性能。 本文主要談自己在react學(xué)習(xí)的過程中總結(jié)出來的一些經(jīng)驗(yàn)和資源,內(nèi)容邏輯參考了深入react技術(shù)棧一書以及網(wǎng)上的諸多資源,但也并非完全照抄,代碼基本都是自己實(shí)踐,主要為平時(shí)個(gè)人學(xué)習(xí)做一個(gè)總結(jié)和參考。 本文的關(guān)鍵...
react進(jìn)階漫談
摘要:父組件向子組件之間非常常見,通過機(jī)制傳遞即可。我們應(yīng)該聽說過高階函數(shù),這種函數(shù)接受函數(shù)作為輸入,或者是輸出一個(gè)函數(shù),比如以及等函數(shù)。在傳遞數(shù)據(jù)的時(shí)候,我們可以用進(jìn)一步提高性能。 本文主要談自己在react學(xué)習(xí)的過程中總結(jié)出來的一些經(jīng)驗(yàn)和資源,內(nèi)容邏輯參考了深入react技術(shù)棧一書以及網(wǎng)上的諸多資源,但也并非完全照抄,代碼基本都是自己實(shí)踐,主要為平時(shí)個(gè)人學(xué)習(xí)做一個(gè)總結(jié)和參考。 本文的關(guān)鍵...
發(fā)表評論
0條評論
閱讀 3677·2021-09-22 15:34
閱讀 1186·2019-08-29 17:25
閱讀 3399·2019-08-29 11:18
閱讀 1371·2019-08-26 17:15
閱讀 1740·2019-08-23 17:19
閱讀 1228·2019-08-23 16:15
閱讀 718·2019-08-23 16:02
閱讀 1335·2019-08-23 15:19