細說css3的動畫(1)animation屬性


用程序做過動畫的同學再看下面的這篇講解,或許會非常熟悉(不同程序寫動畫語法可能稍微不太一樣,但很多的思想和原理都是相同的)。

 

1、再介紹css3動畫前,先普及一下一些動畫相關的概念:

幀(frame):通過去的膠片電影一樣,幾十張圖連起來放就是動畫,一張圖就是一幀,人眼識別的極限大概是24幀/秒(看不出間斷)。而即便是黑科技滿天飛的今天,動畫的基本組成部分也離不開“幀”。

補間動畫(Tween Animation):從某一幀過度到另一幀有一定數學規律的連貫的動畫。比如一個圖片從a點勻速運動到b點的動畫、亦或是勻變速運動、以拋物線的速度曲線運動等等,當然也不只是規定運動,也可以規定動畫的變化是勻變速等,如變大變小、圓變方、變色、旋轉等。

 

2、簡單說說css3動畫執行的原理

(1) css3中新增了一個animation的屬性,該屬性類似於創建一個animation對象

如:animation: bounce 2.0s infinite ease-in-out; 

animation有以下幾個參數:

屬性 描述 CSS
animation 所有動畫屬性的簡寫屬性,除了 animation-play-state 屬性。 3
animation-name 規定 @keyframes 動畫的名稱。 3
animation-duration 規定動畫完成一個周期所花費的秒或毫秒。默認是 0。 3
animation-timing-function 規定動畫的速度曲線。默認是 "ease"。 3
animation-delay 規定動畫何時開始。默認是 0。 3
animation-iteration-count 規定動畫被播放的次數。默認是 1。 3
animation-direction 規定動畫是否在下一周期逆向地播放。默認是 "normal"。 3
animation-play-state 規定動畫是否正在運行或暫停。默認是 "running"。 3
animation-fill-mode 規定對象動畫時間之外的狀態。 3

除了第一個,我依次介紹:

animation-name:這里是一個鍵值,通過@keyframes 該鍵值{ 每幀畫面 },從0%幀~n%幀的動作變化(注:后面詳細說明)

animation-duration:一輪動畫總時間s或ms

animation-timing-function:補間動畫規則(注:后面詳細說明)

animation-delay:動畫是否延時播放,延時多少s或ms

animation-iteration-count:動畫是否循環,循環多少次,無限循環是“infinite”

animation-direction:正向播放完再逆向播放是“alternate”,只正向播放是“normal”

animation-play-state:控制動畫運行或暫停,暫停是“paused”,運行是“running”(一般是通過js來控制這個屬性)

animation-fill-mode:屬性規定動畫在播放之前或之后,其動畫效果是否可見。(效果在keyframes 中設定)

                “none”不改變默認行為。

                “forwards”當動畫完成后,保持最后一個屬性值(在最后一個關鍵幀中定義)。
                “backwards”在 animation-delay 所指定的一段時間內,在動畫顯示之前,應用開始屬性值(在第一個關鍵幀中定義)。
                “both”向前和向后填充模式都被應用。

 

(2)通過上面創建了animation的對象后,我們就可以一幀一幀的畫圖了

在animation-name中定義了一個key值,用它來構建每幀的樣式,如下例:

from是開始時樣式,to是結束時樣式,意思就是從“from”的樣式到“to”的樣式的變化,比如說from里面背景色是藍色,to里面背景色是紅色,動畫會從藍色變成綠色

下面是效果圖:

 

當然,我們也可以從0%幀~n%幀設置動作變化,如下例:

如上段代碼,藍色->紅色->黃色->黑色 的轉變,效果圖如下:

(3)如何理解和應用 animation-timing-function“補間動畫”

這個屬性有下面幾個參數:

linear:勻速變化

ease:低速開始,然后加快,快結束的時候再放慢

ease-in:低速開始

ease-out:低速結束

ease-in-out:低速開始、低速結束

cubic-bezier(n,n,n,n):n=0~1,自定義“三次貝賽爾曲線”速度變化方式

step:把每個區域變化樣式分割成了n幀,start+end幀總計n+1幀

step-start(n)或steps(n,start):不算start幀的n幀(相當於從第2幀開始)

step-end(n)或steps(n,end):不算end幀的n幀(相當於結束於倒數第2幀)

 

①、linear和ease的對比運動的例子如下:

代碼如下:

 

②、然后介紹一下steps函數,第一個參數是每個區域拆分的幀數,為了方便觀察,我把它設置為1幀,例子如下:

如下代碼所示:顏色變化分為紅、綠、藍、黃,

第一個圖沒有紅,也就是說step-start從第2幀開始,

第二個圖缺少黃,同樣是說step-end到倒數第2幀結束。

如上段代碼,steps的拆分規則是以一段區間拆分,

即0%~25%的區間拆分n幀,相當於0%幀是start幀,

25%~50%的區間拆分n幀,無start、end幀,

50%~100%的區間拆分n幀,相當於100%幀是end幀,

而n幀是包含start或end幀總共的幀數為n,並且start幀、end幀只能有其一

 

③、最后一個:animation-timing-function補間動畫中有一個“三次貝賽爾曲線”

首先百度上先腦補一下什么叫“三次貝塞爾曲線”:貝塞爾曲線_百度百科

感興趣的同學可以研究研究,不過看完之后也只能“呵呵。。。”

舉個最簡單的例子:ps中不是有個鋼筆的工具嗎,效果圖如下

這種效果就是“三次貝塞爾曲線”,然后再細想一下運動的速度是如同該曲線一樣的效果,弧度越大越陡變化速度越快,越小越平緩變化速度越慢

 

(4)最后再來說說animation-fill-mode,這是控制動畫播放完時所顯示的狀態,下面解釋摘錄自百度

none 表示不設置結束之后的狀態,默認情況下回到跟初始狀態一樣。
forwards 表示將動畫元素設置為整個動畫結束時的狀態。
backwards 明確設置動畫結束之后回到初始狀態。
both 表示設置為結束或者開始時候的狀態。一般都是回到默認狀態。

下面再舉個例子看看就明白了:

 

下面是代碼:

 

(5)其實,介紹到目前就已經可以做出完整的動畫效果了(逐幀動畫),下面我通過上面的介紹繪制一個

下面是sprite素材圖:

下面是代碼:

①、在@keyframes中只設置了一個過渡區間,而這里的animation-timing-function用steps(4)給這個過渡區間分成4幀,正如素材圖的前4幀

②、我們把容器的大小調整至素材圖中一個幀圖的大小,讓div剛好能顯示一幀的圖片

③、設置初始位置x=0px、和運動結束時的位置x=-128px,因為在這之間給分成了4幀(即steps(4)),因此它的運動軌跡分析如下:

第1幀:background-position:x=0px,顯示第1個小人

第2幀:background-position:x=-32px,顯示第2個小人

第3幀:background-position:x=-64px,顯示第3個小人

第4幀:background-position:x=-96px,顯示第4個小人

而steps(4)等同於step-end(4),因此最后一個關鍵幀background-position:x=-128px不顯示,如此循環便可

 

寫到這就算把animation詳細的介紹完了,感興趣的同學咱們多多交流哈,我是Chalk  ~~O(∩_∩)O~~

下一篇文章我會繼續寫css3的動畫,來談談transform屬性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM