前面的話
SVG動畫非常強大,只需要設置HTML元素,不需要CSS和JS,就可以實現動畫效果。本文將詳細介紹SVG動畫
概述
動畫實際上就是值關于時間的一個函數。在這個函數中,包含起始值和結束值,經過的時間一般被稱為持續時間。動畫執行時的曲線就是動畫函數。但是,在計算機中,不可能窮盡每一時刻的狀態,而是取多個采樣點,每個采樣點就叫做幀。要讓動畫流暢顯示,一般地需要每秒60幀
在SVG中實現動畫主要通過SMIL。SVG的動畫元素是和SMIL開發組合作開發的。SMIL開發組和SVG開發組合作開發了SMIL動畫規范,在規范中制定了一個基本的XML動畫特征集合。SVG吸收了SMIL動畫規范當中的動畫優點,并提供了一些SVG繼承實現
[注意]SVG動畫除了IE瀏覽器不支持之外,兼容其他主流瀏覽器
動畫元素
SVG動畫元素共有4個,包括:<set>、<animate>、<animateTransform>、<animateMotion>
【<set>】
<set>
可以實現基本的延遲功能。就是指:可以在特定時間之后修改某個屬性值(也可以是CSS屬性值)
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <set attributeName="x" attributeType="XML" to="60" begin="2s" /> </text> </g> </svg>
2s后,文字會向右移動30px
【<animate>】
<animate>是基礎動畫元素,用于實現單屬性的動畫過渡效果
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate attributeName="x" to="60" begin="0s" dur="2s" repeatCount="indefinite" /> </text> </g> </svg>
【<animateTransform>】
<animateTransform>用于實現transform
變換動畫效果
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animateTransform attributeName="transform" type="scale" from="1" to="1.5" begin="0s" dur="2s" repeatCount="indefinite" /> </text> </g> </svg>
【<animateMotion>】
<animateMotion>可以讓SVG各種圖形沿著特定的path
路徑運動
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="0" x="0"> 火柴 <animateMotion path="M 20 20 H 60 V 50 Z" begin="0s" dur="3s" repeatCount="indefinite" /> </text> <path d="M 20 20 H 60 V 50 Z" fill="transparent" stroke="black"></path> </g> </svg>
動畫屬性
【attributeName】
attributeName表示要變化的元素屬性名稱
① 可以是元素直接暴露的屬性,例如,對應的text
元素上的x
, y
或者font-size
;
② 可以是CSS屬性。例如,透明度opacity
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate attributeName="opacity" to="0" begin="0s" dur="1s" repeatCount="indefinite" /> </text> </g> </svg>
【attributeType】
attributeType
支持三個固定參數:CSS、
XML、
auto,
用來表明attributeName
屬性值的列表。x、
y
以及transform
屬于XML;
opacity等CSS
屬于CSS;
auto
為默認值,自動判別的意思(實際上是先當成CSS處理,如果發現不認識,直接XML類別處理)。因此,如果不確信某屬性是XML類別還是CSS類別的時候,可以不設置attributeType
值,直接讓瀏覽器自己去判斷
【from, to, by, values】
from 動畫的起始值
to 指定動畫的結束值
by 動畫的相對變化值
values 用分號分隔的一個或多個值,可以看成是動畫的多個關鍵值點
from、
to、
by、
values
相互之間有制約關系:
1、如果動畫的起始值與元素的默認值是一樣的,from
參數可以省略
2、如果不考慮values,
to、
by
兩個參數至少需要有一個出現。否則沒有動畫效果。to
表示絕對值,by
表示相對值。以位移距離為例子,如果from
是100
, to
值為160,
則表示移動到160
這個位置;如果by
值是160
,則表示移動到100+160=260
這個位置
3、如果to、
by
同時出現,則只識別to
4、 當values
值設置并能識別時,from、
to、
by
的值都會被忽略
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate attributeName="x" values="30;50;30;70;30" dur="2s" repeatCount="indefinite" /> </text> </g> </svg>
【時間表示】
SVG animation中的時間表示,常見單位有 "h"、
"min"、
"s"、
"ms"。
單位含義都是英文單位的縮寫。例如h
表示小時(hour)
時間值支持小數寫法,因此,90s
也可以使用1.5min
表示。時間值還支持hh:mm:ss
這種寫法,因此,90s
也可以使用01:30
表示
如果begin="1.5"
沒有單位,這里的小數點表示秒,也就是1.5s
的意思
【begin、end】
begin
指動畫開始的時間,begin
的定義是分號分隔的一組值。
例如,beigin="3s;6s"
表示的是3s
之后動畫走一下,6s
時候動畫再走一下(如果之前動畫沒走完,會立即停止從頭開始)
所以,如果一次動畫時間為3s
, 即dur="3s"
,同時沒有repeatCount
屬性時候,可以看到動畫似乎連續執行了2
次
begin
的單值除了普通value,還有下面這些類別的value:
offset-value | syncbase-value | event-value | repeat-value | accessKey-value | media-marker-value | wallclock-sync-value | "indefinite"
① offset-value
表示偏移值,數值前面有+
或-,
相對于document的begin
值而言。
② syncbase-value
基于同步確定的值。語法為:[元素的id].begin/end +/- 時間值。
就是說借用其他元素的begin值進行加減運算,這個可以準確實現兩個獨立元素的動畫級聯效果
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate id="x" attributeName="x" to="70" dur="2" fill="freeze"/> <animate attributeName="y" begin="x.end" to="60" dur="2" fill="freeze"/> </text> </g> </svg>
③ event-value
表示與事件相關聯的值。類似于PowerPoint動畫的“點擊執行該動畫”。語法是:[元素的id].[事件類型] +/- 時間值
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <circle id="circle1" cx="15" cy="15" r="15"/> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate id="x" attributeName="x" begin="circle1.click" to="70" dur="2"/> </text> </g> </svg>
點擊小球,會觸發文字的運動。如果想點擊小球2秒后文字才支持,加上偏移時間就可以了——begin="circle1.click+2s"
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <circle id="circle1" cx="15" cy="15" r="15"/> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate id="x" attributeName="x" begin="circle1.click" to="70" dur="2"/> </text> </g> </svg>
④ repeat-value
指重復N次之后再進行其他運動。語法為:[元素的id].repeat(整數) +/- 時間值
[注意]經測試該屬性并不生效
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate id="x" attributeName="x" to="70" dur="2"/> <animate attributeName="y" begin="x.repeat(2)" to="70" dur="2" fill="freeze"/> </text> </g> </svg>
⑤accessKey-value
定義快捷鍵。即按下某個按鍵動畫開始。語法為:accessKey("character")。
character
表示快捷鍵所在的字符
[注意]經測試該屬性并不生效
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="30"> 小火柴的藍色理想 <animate attributeName="y" begin="accessKey('s')" to="70" dur="2" /> </text> </g> </svg>
⑥ wallclock-sync-value
指真實世界的時鐘時間定義。時間語法是基于在ISO8601中定義的語法
⑦ "indefinite"
這個字符串值,表示“無限等待”。需要指向該動畫元素的超鏈接(SVG中的a
元素)
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="40"> 小火柴的藍色理想 <animate id="animate1" attributeName="x" begin="indefinite" to="70" dur="1" repeatCount="indefinite"/> </text> <a xlink:href="#animate1"> <text y="30" fill="#cd0000" font-size="20">點擊</text> </a> </g> </svg>
【dur】
dur
屬性值只有兩種:常規時間值 | "indefinite"
“常規時間值”就是3s
之類的正常值;"indefinite"
指動畫不執行
【calcMode, keyTimes, keySplines】
這幾個參數是控制動畫曲線的
calcMode
屬性支持4個值:discrete
| linear
| paced
| spline
. 中文意思分別是:“離散”|“線性”|“踏步”|“樣條”
discrete from值直接跳到to值
linear animateMotion元素以外元素的calcMode默認值。動畫從頭到尾的速率都是一致的
paced 通過插值讓動畫的變化步調平穩均勻。僅支持線性數值區域內的值,這樣點之間“距離”的概念才能被計算(如position, width, height等)。如果”paced“指定,任何keyTimes或keySplines值都失效
spline 插值定義貝塞爾曲線。spline點的定義在keyTimes屬性中,每個時間間隔控制點由keySplines定義
keyTimes = “<list>”
跟上面提到的<list>
類似,都是分號分隔一組值。keyTimes
是關鍵時間點的意思,這里有一些約定的規則:首先,keyTimes
值的數目要和values
一致,如果是from/to/by
動畫,keyTimes
就必須有兩個值。然后對于linear
和spline
動畫,第一個數字要是0
, 最后一個是1
。 最后,每個連續的時間值必須比它前面的值大或者相等
paced
模式下,keyTimes
會被忽略;keyTimes
定義錯誤,也會被忽略;dur
為indefinite
也會被忽略
keySplines = “<list>”
keySplines
表示的是與keyTimes
相關聯的一組貝塞爾控制點(默認0 0 1 1
)。每個控制點使用4個浮點值表示:x1 y1 x2 y2
. 只有模式是spline
時候這個參數才有用,也是分號分隔,值范圍0~1
,總是比keyTimes
少一個值。
如果keySplines
值不合法或個數不對,是沒有動畫效果的
下面是離散值discrete的例子
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="40"> 小火柴的藍色理想 <animate id="animate1" attributeName="x" dur="3" values="40;60;80;100" calcMode="discrete" repeatCount="indefinite"/> </text> </g> </svg>
下面是踏步值paces的例子
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="40"> 小火柴的藍色理想 <animate id="animate1" attributeName="x" dur="3" values="40;60;80;100" calcMode="paced" repeatCount="indefinite"/> </text> </g> </svg>
下面是貝塞爾曲線spline的例子
<svg height="70" xmlns="http://www.w3.org/2000/svg"> <g> <text font-family="microsoft yahei" font-size="20" y="30" x="40"> 小火柴的藍色理想 <animate id="animate1" attributeName="x" dur="3" values="40;60;100" keyTimes="0; .8; 1" calcMode="spline" keySplines=".5 0 .5 1; 0 0 1 1" repeatCount="indefinite"/> </text> </g> </svg>
【repeatCount, repeatDur】
repeatCount
表示動畫執行次數,可以是合法數值或者"indefinite"
repeatDur
定義重復動畫的總時間。可以是普通時間值或者"indefinite"
<animate attributeName="x" to="60" dur="3s" repeatCount="indefinite" repeatDur="10s" /
上面的代碼中,動畫只執行完整3
個 +
一個1/3
個動畫。因為repeat總時間是10s
【fill】
fill
表示動畫間隙的填充方式。支持參數有:freeze
| remove
。其中remove
是默認值,表示動畫結束直接回到開始的地方。freeze
“凍結”表示動畫結束后像是被凍住了,元素保持了動畫結束之后的狀態
【accumulate, additive】
accumulate
是累積的意思。支持參數有:none
| sum
。默認值是none
,如果值是sum
表示動畫結束時候的位置作為下次動畫的起始位置
additive
控制動畫是否附加。支持參數有:replace
| sum
。默認值是replace
.,如果值是sum
表示動畫會附加到其他低優先級的動畫上
【restart】
restart
支持的參數有:always
| whenNotActive
| never
.
always
是默認值,表示總是。whenNotActive
表示動畫正在進行的時候,是不能重啟動畫的。never
表示動畫是一波流
【min、max】
min/max
表示動畫執行最短和最長時間。支持參數為時間值和"media"
(媒介元素有效), max
還支持indefinite
API
SVG animation有內置的API可以暫停和啟動動畫的。語法為:
// 暫停
svg.pauseAnimations();
// 恢復
svg.unpauseAnimations()
<svg height="70" xmlns="http://www.w3.org/2000/svg" id="svg"> <g id="test"> <text font-family="microsoft yahei" font-size="20" y="30" x="40"> 小火柴的藍色理想 <animate id="animate1" attributeName="x" dur="2" to="80" repeatCount="indefinite" /> </text> </g> </svg> <script> svg.onclick = function(){ if(!this.paused){ this.paused = true; this.pauseAnimations(); }else{ this.paused = false; this.unpauseAnimations(); } } </script>
點擊文字可暫停或恢復
文章列表