CSS3的動畫效果可以藉由CSS的 keyframe 參數來控制動畫的 期間、重覆及重覆的模式例如重覆次數、起始延遲、暫時停止。

瀏覽器支援
animation 屬性目前在 IE 10+ 以上主流瀏覽器都可以執行,但採用 Webkit 引擎的瀏覽器必須加上 -webkit- 前綴字串。
IE 10+ 的主流瀏覽器都已經支援 transition

資料來源:
PJCHENder愛分享 – [筆記] CSS動畫Animation — @keyframes
openfoundry – CSS3 動畫基礎
[新手前端]CSS3動畫效果 transition, animation


[nextpage title=”1-css-animation @keyframes”]

縮寫
animation: name duration timing-function delay iteration-count direction;
animation:{
[<動畫名> || <動畫期間> || <動畫特效> || <動畫延遲> || <動畫次數> || <動畫方向>] ,
[<動畫名> || <動畫期間> || <動畫特效> || <動畫延遲> || <動畫次數> || <動畫方向>]
}

1-1-基礎範例

  • 裡面會包含要執行動畫的名稱 animation-nam 和執行動畫的時間 animation-duration,這兩個部分都可以根據自己的需要設定。
  • 設定@keyframes的內容,在 @keyframes 後面要先輸入剛剛在div當中所寫的animation-name,然後就可以在”{ }”內設定要執行動畫的效果。
  • 用from和to,表示在4s的期間內,從一開始(0%)到最後(100%)動畫的變化。

See the Pen CSS動畫Animation-1 by Jimmy_Wu (@Jimmy_Wu) on CodePen.


1-2-使用百分比

動畫中間是有很多不同時間點的變化,可以不用from和to,而是直接使用百分比

See the Pen CSS動畫Animation-百分比 by Jimmy_Wu (@Jimmy_Wu) on CodePen.


1-3-animation 屬性詳解

1-3-1-animation-name 動畫名稱

1-3-2-animation-duration 播放一次動畫需要的時間
單位 s (秒)或 ms (毫秒)

1-3-3-animation-timing-function 動畫的加速度曲線
這個屬性是用來控制動畫執行過程中的速度變化

  • ease,這是預設值,動畫一開始慢慢的,接著會漸漸加速,結束的時候再慢下來。
  • linear,動畫從開始到結束的過程都是一樣的速度。
  • ease-in,動畫開始的速度較慢。
  • ease-out,動畫結束的速度較慢。
  • ease-in-out,動畫的開始和結束時的速度較慢。
  • cubic-bezier(n,n,n,n),自行定義動畫的速度。

See the Pen animation-timing-function-demo by Jimmy_Wu (@Jimmy_Wu) on CodePen.

1-3-4-animation-delay 延遲多久後啟始動畫
這個動畫會延遲幾秒後才進行,例如,animation-delay: 5s,表示這個動畫會延遲5表後才執行。

1-3-5-animation-iteration-count 動畫播放次數
可用 infinite (無限次播放)

1-3-6-animation-direction 動畫播放方向
所謂的播放方向是指從動畫效果 0% 到 100% 的方向,同時也是預設的 normal 值。

  • normal :每次播放都是從 0% 至 100%
  • reverse :每次播放都是從 100% 至 0%
  • alternate :播放兩次以上的話,會從 0% 至 100% ,再從 100% 回到 0% ,以此類推
  • alternate-reverse :跟 alternate 相反,會先從 100% 開始播放

animation 播放方向 reverse

See the Pen 例:animation 播放方向 reverse by Jace Ju (@jaceju) on CodePen.


animation 播放方向 alternate

See the Pen 例:animation 播放方向 alternate by Jace Ju (@jaceju) on CodePen.


animation 播放方向 alternate-reverse

See the Pen 例:animation 播放方向 alternate-reverse by Jace Ju (@jaceju) on CodePen.

1-3-7-animation-fill-mode 指定動畫播放前後的狀態
如果想要控制動畫播放完後的最終狀態,可以用 animation-fill-mode 屬性

  • none :回到未播放動畫效果前的狀態
  • forwards :停在動畫的最後一個狀態上
  • backwards :停在動畫的第一個狀態上 (實測不出來)
  • both :視 animation-direction 來決定停在哪一個狀態上。

指定 animation 播放後的狀態 forwards

See the Pen 例:指定 animation 播放後的狀態 forwards by Jace Ju (@jaceju) on CodePen.

1-3-8-animation-play-state 指定動畫播放或暫停
決定 animation 執行或暫停

See the Pen 例:決定 animation 執行或暫停 by Jace Ju (@jaceju) on CodePen.


[nextpage title=”2-css-transitions”]

2-1-animation和transitions的比較

CSS3發佈的 transitions 提供了參數可以製作簡單的動畫效果。其動畫效果是由起始參數及結束時的參數所決定。transitions 只是提供設計師一個可以指定中間過度動畫的方法。
animation 和 transitions 最大的不同在於,tansitions 是當參數改變時觸發,而 animation 則是直接就執行,所以動畫效果需要明確的指定關鍵影格的參數。


2-2-基本的 transition

而 CSS 為了補足這方面的視覺轉換特效,特別加入 transition 屬性。 一個簡易的動畫效果就是在想要變化的狀態上,加入一個 transition 屬性,而其值為變化需歷時的秒數。

transition 就會自動幫我們補足中間的過場動畫

See the Pen 例:加入 transition 後的效果 by Jace Ju (@jaceju) on CodePen.

transition 改變顏色

See the Pen 例:用 transition 改變顏色 by Jace Ju (@jaceju) on CodePen.


2-3-transition 屬性詳解

2-3-1-transition-property 要做變換的 CSS 屬性
不是所有 CSS 屬性都可以使用 transition ,可以參考這篇 CSS animated properties 得知有哪些屬性可以使用 transition 。

只對單一屬性加入 transition

See the Pen 例:只對單一屬性加入 transition by Jace Ju (@jaceju) on CodePen.

對不同屬性同時做 transition ,用逗號將要做 transition 的屬性分隔開來,寫法像 img 的多重背景。

See the Pen 例:對不同屬性同時做 transition by Jace Ju (@jaceju) on CodePen.

2-3-2-transition-duration 變換需要的時間
單位為 s 或 ms

2-3-3-transition-delay 延遲多久後開始變換
單位為 s 或 ms

延遲變換 – 先變換一個屬性,再變換另一個屬性

See the Pen 例:先變換一個屬性,再變換另一個屬性 by Jace Ju (@jaceju) on CodePen.

2-3-transition-timing-function 稱為 Timing Funciton
用名稱來定義變換時的加速度。Timing Funciton 包含數種模式,下圖可以看出它們的加速度曲線。

  • linear: 匀速
  • ease: 急加速後減速 (預設值)
  • ease-in: 加速
  • ease-out: 减速
  • ease-in-out: 較平緩的 ease
  • cubic-bezier: 自定義速度模式

cubic-bezier 函式
利用貝茲曲線函式來定義加速曲線,可以直接使用線上工具 cubic-bezier() 來找出需要的數值。

雙向的 transition
Transition 的效果只會作用在有加入 transition 屬性的那個狀態,一旦要回復至原來的狀態時,就會失去 Transition 的平順效果了。這時我們需要對原先的狀態,也加入 transition 。

See the Pen 例:雙向的 transition by Jace Ju (@jaceju) on CodePen.


2-4-transition 的限制與使用條件

transition 的開始和結束都必須是具體數值;例如以下的 CSS 屬性值之間是無法被計算的,就無法使用 transition

  • height: auto (不確定的值) 至 height: 100px (具體數值)
  • display: none 至 display: block
  • background: url(foo.jpg) 至 background: url(bar.jpg)

另外 transition 需要事件來觸發它的動作,所以沒辦法在一進頁面自動產生效果。
如果不透過 JavaScript 事件處理的話,就只能配合與事件有關的 Pseudo Classes (偽類別 :hover :focus 等) 來呈現效果了。

See the Pen 例:搭配 :focus 偽類別 by Jace Ju (@jaceju) on CodePen.

搭配 jQuery 透過切換 class 來做 transition

See the Pen 例:透過切換 class 來做 transition by Jace Ju (@jaceju) on CodePen.


[nextpage title=”
3-Animation 搭配 Transform 做旋轉動畫”]
rotate(θ) 是指讓指定元素以參考點為中心軸 2D 旋轉 θ 度, transform-origin 會將 (x, y) 設為參考點。當我們把 transform: rotate(θ) 放到 @keyframes 中時, animation 就會改變 θ 值來做出動畫效果。

模擬太陽、地球、月亮的週期

See the Pen 範例:模擬太陽、地球、月亮的週期 by Jace Ju (@jaceju) on CodePen.