亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

章節
問答
課簽
筆記
評論
占位
占位

動畫實現

在動畫算法與設計的小節中我都把動畫一些相關的東西單獨提出來分析了,其實 jQuery 的動畫的原理就是這樣的,這一節我們把設計與算法融合在一起來實現一個偽 jQuery 的動畫模塊。

在 jQuery 的設計中 ready、ajax、動畫都是支持 Promise 這個概念的,也就是通過 Deferred 提供了一個抽象的非阻塞的解決方案,它創建一個 promise 對象,其目的是在未來某個時間點返回一個響應,對應的也就是 done、fail、progress、complete、always等方法,所以在第一部分理解 Deferred 對象是非常重要的,這樣才能讀懂這類設計。

具體的代碼我們可以如右圖所示,這里我們開始解釋下其設計的目的。

book.animate({
    left: '500'
}, {
    duration: 2000
})

就這個動畫而言,我們要涉及幾個問題,left:500 其實是最終的坐標值。

那么完成這個 left 動畫我們至少需要:

  • 起點位置
  • 終點位置
  • 運動的時間
  • 每次定時器改變的坐標值
  • 單位的換算(px、em、%)

每一種屬性其實都是有各自的變換的一個算法,包括計算開始值、變化值、時間等等,所以我們必須給每一個變換的屬性都進行一個包裝,用來封裝各自的相關數據,那么我們其實可以用一個類來構造跟屬性變化相關的一些信息,如 Tween 類。

通過一個 Tween 類構造出來的緩動對象,其實就是針對每一個屬性的封裝對象,這樣我們只需要設計一個定時器,在指定的時間內調用 Tween 生成的這些對象就可以了,Tween 內部控制著各自屬性的狀態改變。


具體右邊的實現代碼涉及了如下幾個部分了:

  1. Animation 函數,入口函數用來做一些參數的初始化工作,整個動畫的開始調度
  2. animation 對象就是實際的動畫對象了,通過 Animation 函數創建,這個對象上實現了所有屬性與方法
  3. new Tween() 通過 Tween 創建每一個屬性對象相關的數據
  4. animation.tweens 保存了每一個屬性對象的容器
  5. Animation.fx 就是具體開始動畫執行的調用的一個調度對象了
  6. 定時器都是執行一個回調函數的,tick 就是定時器執行的回調,在 tick 函數中通過計算出變化數據,然后通過循環 animation.tweens 中的每一個動畫屬性對象,來實現改變

其實動畫的整個設計就是這么簡單的,代碼的復雜是因為還兼容了各種不同情況的處理,比如實現 deferred 機制,針對寬高變化的 overflow 處理,針對 display 為 inline 情況下的處理,那么這些都是一些預處理的機制,在對應的 defaultPrefilter 函數中就能找到,我們沒有必要是單獨實現了。

其實動畫的設計,我們可以學到一個很重要的一點: 封裝變化,把每一個屬性變化都獨立封裝一個對象,讓其自己管理與控制。

任務

?不會了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?