摘要:發(fā)現(xiàn)倉庫被了很多次,因此下定決心要好好的把代碼整理一下,方便大家查看代碼以及更加愉快的。雖然這個簡介有點短,但是該篇的目的并不在于讓大家了解這個矩陣動畫,而是想讓大家一起來豐富這個倉庫。
前段時間,發(fā)布了一篇文章:學(xué)不動了,來點有趣的吧。發(fā)現(xiàn) github 倉庫被 frok 了很多次,因此下定決心要好好的把代碼整理一下,方便大家查看代碼以及更加愉快的 Pull Request。
簡介該項目名叫 matrixchange ,編寫的目的在于方便開發(fā)者實現(xiàn)矩陣動畫,當(dāng)然該項目已經(jīng)發(fā)布到 npm ,使用 npm/yarn 安裝即可。
該庫為開發(fā)者提供了一個數(shù)組和一個函數(shù),具體的文檔可以查看上一篇文章,或是在 github 上查看更為詳細(xì)的內(nèi)容。
ok 簡介到此完畢。雖然這個簡介有點短,但是該篇的目的并不在于讓大家了解這個矩陣動畫,而是想讓大家一起來豐富這個倉庫。
接下來進(jìn)入正題。
動畫形式 何為矩陣動畫?簡單來說就是有一個矩陣,然后讓它動起來,效果如下:
這就是一個簡單的矩陣動畫,動畫形式如何?
從右上到左下按照斜線進(jìn)行運(yùn)動
那么動畫效果呢?
翻轉(zhuǎn)消失,然后翻轉(zhuǎn)呈現(xiàn)
animite.css 可以解決絕大多數(shù)的動畫效果,而且 animite.css 中的動畫也大致可以分為入場動畫好出場動畫兩個大類,既然如此,那么我們實現(xiàn)矩陣動畫中需要的動畫效果迎刃而解,我們僅需要豐富動畫形式即可。
抽象既然我們準(zhǔn)備批量實現(xiàn)我們的動畫形式,那么抽象是必要的,按照之前給的效果圖,這個是我抽象出來的對象:
{ interval: 140, duration: 1000, init(row, col) { this.row = row; this.col = col; this.count = col; }, check(i, j) { return j - i === this.count; }, next() { this.count--; }, end() { return this.count === -this.row; } }
字段名 | 類型 | 代表的含義 |
---|---|---|
interval | number | 每次(獲取需要運(yùn)動的點)的時間間隔 |
duration | number | transition 動畫專用,用于設(shè)置 transition 的持續(xù)時間,animate 動畫不需要 |
init | Function | 每次動畫開始前會調(diào)用,用于初始化對象信息 |
check | Function | 用于確定每次需要運(yùn)動的點 |
next | Function | 每次(獲取需要運(yùn)動的點)后都會調(diào)用該函數(shù),用于重置判斷條件 |
end | Function | 判斷該動畫是否結(jié)束 |
動畫具體的執(zhí)行流程為
將矩陣的行列傳入 init 函數(shù)
設(shè)置以 interval 為時間間隔的定時器
遍歷矩陣中所有的點,傳入 check 函數(shù),確定該點是否需要運(yùn)動
執(zhí)行 next 函數(shù)
執(zhí)行 end 函數(shù),若函數(shù)返回 true 則取消定時器,動畫結(jié)束
結(jié)合上面的內(nèi)容,不難想象出,剛剛的對象觸發(fā)矩陣中的點如下(以 row = 7; col = 9 為例)
定時器第一次觸發(fā)時,運(yùn)動的塊為 [0, 8]
定時器第二次觸發(fā)時,運(yùn)動的塊為 [0, 7],[1, 8]
定時器第三次觸發(fā)時,運(yùn)動的塊為 [0, 6],[1, 7],[2, 8]
...
也就是從右上到左下,每一次動一條斜線。也是實現(xiàn) gif 圖中的動畫形式,配合 animate.css 就能完成效果圖展示的效果。
注意點init/check/next/end 函數(shù)中的 this 代表本對象,也就是擁有該方法的對象
this 下也可設(shè)置任意值,這是 js 的特性,js 的對象非固定字段,所有設(shè)置任意值都 ok
最好不要將值設(shè)置到對象外部,避免互相影響,所以為了方便調(diào)用,最好都設(shè)置在 this 對象下,如上述的 row/col/count
由于動畫效果會被調(diào)用 n 次,所以要記得在 init 方法內(nèi)將自定義設(shè)置在 this 下的值進(jìn)行初始化。避免由于上次動畫修改了某值,但沒有初始化導(dǎo)致動畫效果在第 2 次時有變化。
定義既然我們是用 typescript 進(jìn)行開發(fā),該對象的完整定義如下:
export type modeType = { interval: number; duration?: number; [propName: string]: any; init(row: number, col: number): void; check(i: number, j: number): boolean; next(): void; end(): boolean; }
只要符合該定義的對象,就可以認(rèn)為是一個符合要求的動畫形式,但是動畫的執(zhí)行是否完整(動畫執(zhí)行是否將所有矩陣中的點都觸發(fā)了一遍),不在庫的考慮范圍內(nèi),這點需要你,也就是該動畫形式的編寫者確定。
開發(fā)環(huán)境ok 看到這里是否已經(jīng)有些騷氣的一批的動畫在你的腦海中呈現(xiàn),很想實現(xiàn)它吧~
那么如何來驗證你的動畫是否完整呢?
方式一安裝好 matrixchange 后,按照 github 上提供的文檔,先將矩陣初始化好,然后調(diào)用 movePoint 將你寫好的對象傳入即可。
什么?麻煩?對!
確實挺麻煩的,還要自己寫個 html 可能還要配置 webpack 開發(fā)環(huán)境等一系列雜七雜八的東西,寫個動畫形式為什么還要配置這么多無關(guān)緊要的步驟呢?其實我都已經(jīng)給你配置好啦~
方式二按照以下步驟
git clone https://github.com/acccco/matrixChange.git
先將項目克隆到本地,當(dāng)然可以先 fork 然后克隆你自己的項目,推薦先 fork。
npm i # or yarn
安裝項目依賴。
npm run dev
運(yùn)行程序,然后瀏覽器打開 http://localhost:8080/ 即可。
對了,那該在哪里編寫你的運(yùn)動形式呢?
項目下有 dev 文件夾,在文件夾內(nèi),我已經(jīng)寫好了布局,寫好了初始化方法,你所要做的就是找到 movePoint 這個方法,然后將該方法的第一次參數(shù)改成你所寫好的對象即可。
什么?我原來文件中 movePoint 的第一個參數(shù) line.rt2lb 是什么鬼?
說明一下,我將已經(jīng)實現(xiàn)的效果按照分類放在了 src/mode 文件夾,四個方向分別使用縮寫代替。
l - 左 r - 右 t - 上 b - 下 i - 內(nèi)部 o - 外部 R - 代表前面所表示運(yùn)動的反向 Anti - 逆時針
如 line.rt2lb 所代表的運(yùn)動形式為:從右上到左下的線性運(yùn)動。
src/mode 文件夾中已經(jīng)實現(xiàn)的有 6 大類,32 種動畫形式。大概說明一下
文件名 | 代表意思 | 例子 | 說明 |
---|---|---|---|
line.js | 線性運(yùn)動 | line.r2l line.rt2lb | 每次運(yùn)動一條直線 |
L.js | L 形運(yùn)動 | L.lt2rb L.lt2rbR | 每次運(yùn)動一個 L 形狀的區(qū)域 |
circle.js | 回字形運(yùn)動 | circle.i2o | 每次運(yùn)動一圈 |
spread.js | 擴(kuò)散運(yùn)動 | spread.random | 由一個中心點進(jìn)行擴(kuò)散,每次擴(kuò)散一圈 |
loop.js | 繞圈運(yùn)動 | loop.lt | 由某個頂點進(jìn)行繞圈運(yùn)動 |
random.js | 隨機(jī)運(yùn)動 | random.t2b | 線性隨機(jī)運(yùn)動 |
更為詳細(xì)的介紹可以查看 src/mode 中的具體文件,大家可以將動畫形式放入 movePoint 中查看具體的動畫效果。
當(dāng)然,已經(jīng)實現(xiàn)的運(yùn)動形式大家也可以看看有沒有更加簡單的編寫方式,優(yōu)化原本的代碼。
總之,有了想法那就開始行動吧,不管是新想法,還是優(yōu)化我原本的實現(xiàn),都?xì)g迎 Pull Request。當(dāng)然可能有了想法,但時間上不允許,也可以在 Issues 上記錄,大家可以一起幫你實現(xiàn)。
最后最后再次提供 github 地址,歡迎大家 Pull Request 。
喜歡的話 可以點個 star 哦,感謝~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/114777.html
摘要:發(fā)現(xiàn)倉庫被了很多次,因此下定決心要好好的把代碼整理一下,方便大家查看代碼以及更加愉快的。雖然這個簡介有點短,但是該篇的目的并不在于讓大家了解這個矩陣動畫,而是想讓大家一起來豐富這個倉庫。 前段時間,發(fā)布了一篇文章:學(xué)不動了,來點有趣的吧。發(fā)現(xiàn) github 倉庫被 frok 了很多次,因此下定決心要好好的把代碼整理一下,方便大家查看代碼以及更加愉快的 Pull Request。 簡介 ...
摘要:如果你想減少包大小,你可以這樣引入事實上,每個組件都是支持單獨安裝的,我們也推薦你使用這種方式引入組件。以下是運(yùn)行示例后各界面的截圖組件圖標(biāo)右上角的圓形徽標(biāo)數(shù)字。 1. 前言 一直以來都想做個組件庫,一方面是對工作中常遇問題的總結(jié),另一方面也確實能夠提升工作效率(誰又不想造一個屬于自己的輪子呢~),于是乎就有了本文的主角兒rn-components-kit。 市面上web的UI組件庫如...
摘要:在容器領(lǐng)域內(nèi),已經(jīng)成為了容器編排和管理的社區(qū)標(biāo)準(zhǔn)。就是的邏輯擴(kuò)展,它的核心目標(biāo)是為了更加高效和安全的應(yīng)用發(fā)布。第二個問題就是,生產(chǎn)環(huán)境的發(fā)布權(quán)限一般都是需要嚴(yán)格控制的,通常只有應(yīng)用管理員或者運(yùn)維管理員才有生產(chǎn)發(fā)布權(quán)限。 為了解決傳統(tǒng)應(yīng)用升級緩慢、架構(gòu)臃腫、不能快速迭代、故障不能快速定位、問題無法快速解決等問題,云原生這一概念橫空出世。云原生可以改進(jìn)應(yīng)用開發(fā)的效率,改變企業(yè)的組織結(jié)構(gòu),甚...
閱讀 1727·2021-11-11 10:58
閱讀 4217·2021-09-09 09:33
閱讀 1268·2021-08-18 10:23
閱讀 1558·2019-08-30 15:52
閱讀 1634·2019-08-30 11:06
閱讀 1877·2019-08-29 14:03
閱讀 1516·2019-08-26 14:06
閱讀 2969·2019-08-26 10:39