在動(dòng)畫算法與設(shè)計(jì)的小節(jié)中我都把動(dòng)畫一些相關(guān)的東西單獨(dú)提出來(lái)分析了,其實(shí) jQuery 的動(dòng)畫的原理就是這樣的,這一節(jié)我們把設(shè)計(jì)與算法融合在一起來(lái)實(shí)現(xiàn)一個(gè)偽 jQuery 的動(dòng)畫模塊。
在 jQuery 的設(shè)計(jì)中 ready、ajax、動(dòng)畫都是支持 Promise 這個(gè)概念的,也就是通過(guò) Deferred 提供了一個(gè)抽象的非阻塞的解決方案,它創(chuàng)建一個(gè) promise 對(duì)象,其目的是在未來(lái)某個(gè)時(shí)間點(diǎn)返回一個(gè)響應(yīng),對(duì)應(yīng)的也就是 done、fail、progress、complete、always等方法,所以在第一部分理解 Deferred 對(duì)象是非常重要的,這樣才能讀懂這類設(shè)計(jì)。
具體的代碼我們可以如右圖所示,這里我們開(kāi)始解釋下其設(shè)計(jì)的目的。
book.animate({ left: '500' }, { duration: 2000 })
就這個(gè)動(dòng)畫而言,我們要涉及幾個(gè)問(wèn)題,left:500 其實(shí)是最終的坐標(biāo)值。
那么完成這個(gè) left 動(dòng)畫我們至少需要:
每一種屬性其實(shí)都是有各自的變換的一個(gè)算法,包括計(jì)算開(kāi)始值、變化值、時(shí)間等等,所以我們必須給每一個(gè)變換的屬性都進(jìn)行一個(gè)包裝,用來(lái)封裝各自的相關(guān)數(shù)據(jù),那么我們其實(shí)可以用一個(gè)類來(lái)構(gòu)造跟屬性變化相關(guān)的一些信息,如 Tween 類。
通過(guò)一個(gè) Tween 類構(gòu)造出來(lái)的緩動(dòng)對(duì)象,其實(shí)就是針對(duì)每一個(gè)屬性的封裝對(duì)象,這樣我們只需要設(shè)計(jì)一個(gè)定時(shí)器,在指定的時(shí)間內(nèi)調(diào)用 Tween 生成的這些對(duì)象就可以了,Tween 內(nèi)部控制著各自屬性的狀態(tài)改變。
具體右邊的實(shí)現(xiàn)代碼涉及了如下幾個(gè)部分了:
其實(shí)動(dòng)畫的整個(gè)設(shè)計(jì)就是這么簡(jiǎn)單的,代碼的復(fù)雜是因?yàn)檫€兼容了各種不同情況的處理,比如實(shí)現(xiàn) deferred 機(jī)制,針對(duì)寬高變化的 overflow 處理,針對(duì) display 為 inline 情況下的處理,那么這些都是一些預(yù)處理的機(jī)制,在對(duì)應(yīng)的 defaultPrefilter 函數(shù)中就能找到,我們沒(méi)有必要是單獨(dú)實(shí)現(xiàn)了。
其實(shí)動(dòng)畫的設(shè)計(jì),我們可以學(xué)到一個(gè)很重要的一點(diǎn): 封裝變化,把每一個(gè)屬性變化都獨(dú)立封裝一個(gè)對(duì)象,讓其自己管理與控制。
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)