SVG animation 回顧

来源:http://www.cnblogs.com/Chrimisia/archive/2017/04/06/6670303.html
-Advertisement-
Play Games

一、 SVG animation元素 1. set set雖然不能觸發連續的動畫,但是,其還是可以實現基本的延遲功能。就是指:可以在特定時間之後修改某個屬性值(也可以是CSS屬性值)。 2. animate 基礎動畫元素。實現單屬性的動畫過渡效果。類似Snap.svg的animate()方法支持的動 ...


想起來學習SVG動畫完全是因為做比賽時,需要用到沿著運動路徑運動,作為一個前端萌新,css3顯然無法做到,就現學了SVG動畫。

  一、 SVG animation元素

  1. <set>
  2. <animate>
  3. <animateColor>
  4. <animateTransform>
  5. <animateMotion>

1. set

set雖然不能觸發連續的動畫,但是,其還是可以實現基本的延遲功能。就是指:可以在特定時間之後修改某個屬性值(也可以是CSS屬性值)。

<svg width="320" height="320" xmlns="http://www.w3.org/2000/svg">
  <g> 
    <text font-family="microsoft yahei" font-size="120" y="160" x="160">
      3s後移動
      <set attributeName="x" attributeType="XML" to="60" begin="3s" />
    </text>
  </g>
</svg>

2. animate

基礎動畫元素。實現單屬性的動畫過渡效果。類似Snap.svg的animate()方法支持的動畫效果

<svg width="320" height="320" xmlns="http://www.w3.org/2000/svg">
  <g> 
    <text font-family="microsoft yahei" font-size="120" y="160" x="160">
    動畫過渡
      <animate attributeName="x" from="160" to="60" begin="0s" dur="3s" repeatCount="indefinite" />
    </text>
  </g>
</svg>

3. animateColor
一看就知道是顏色動畫。不過,animate可以實現其功能與效果,因此,此屬性已經被廢棄。逝者已矣~

4. animateTransform
一看就知道實現transform變換動畫效果的。知識是一脈相承的,這裡的transform變換與CSS3的transform變換,以及Snap.svg.js中的transform()方法都是一個路數。

<svg width="320" height="320">
 <g>
     <text font-family="microsoft yahei" font-size="80" y="100" x="100">
    規模從1變大到1.5
    </text>
    <animateTransform attributeName="transform" begin="0s" dur="3s" type="scale" from="1" to="1.5" repeatCount="indefinite"/>
 </g> 
</svg>

5. animateMotion
讓SVG各種圖形沿著特定的path路徑運動,跟上面的SVG代碼相比,少個組標簽g元素。無妨。只要動畫元素是圖形元素子元素就可以。rotate="auto"

<svg width="360" height="200">
  <text font-family="microsoft yahei" font-size="40" x="0" y="0" fill="#cd0000">沿路徑運動,方向自動
  <animateMotion path="M10,80 q100,120 120,20 q140,-50 160,0" begin="0s" dur="3s" rotate="auto" repeatCount="indefinite"/> </text> </svg>

6. 自由組合
實際製作時候的動畫,不可能總是一個屬性修改。

<svg width="320" height="200">
    <text font-family="microsoft yahei" font-size="120" y="160" x="160">位置透明度同時變化 
        <animate attributeName="x" from="160" to="60" begin="0s" dur="3s" repeatCount="indefinite" /> 
        <animate attributeName="opacity" from="1" to="0" begin="0s" dur="3s" repeatCount="indefinite" /> 
    </text> 
</svg>

二、SVG animation參數詳解

 1. attributeName = <attributeName>

     要變化的元素屬性名稱。

  ① 可以是元素直接暴露的屬性,例如,text元素上的x, y或者font-size; ② 可以是CSS屬性。例如,透明度opacity.

 2. attributeType = “CSS | XML | auto”

   attributeType支持三個固定參數,CSS/XML/auto.

  用來表明attributeName屬性值的列表。x, y以及transform就屬於XML, opacity就屬於CSS. auto為預設值,自動判別的意思(實際上是先當成CSS處理,如果發現不認識,直接XML類別處理)。因此,如果你不確信某屬性是XML類別還是CSS類別的時候,不設置attributeType值,直接讓瀏覽器自己去判斷,幾乎無差錯。

 3. from, to, by, values

  from = “<value>“
      動畫的起始值。
  to = “<value>“
      指定動畫的結束值。
  by = “<value>“
      動畫的相對變化值。
  values = “<list>“
      用分號分隔的一個或多個值,可以看出是動畫的多個關鍵值點。

   相互之間還是有制約關係的。有以下一些規則:

  1. (不考慮values)to,by兩個參數至少需要有一個出現。否則動畫效果沒有。to表示絕對值,by表示相對值。拿位移距離,如果from是100, to值為160則表示移動到160這個位置,但是,如果by值是160,則表示移動到100+160=260這個位置。

  2. 如果to,by同時出現,則by打醬油,只識別to.
  3. 如果to,by,values都沒設置,自然沒動畫效果。如果任意(包括from)一個屬性的值不合法,規範上說是沒有動畫效果。(據測試,FireFox確實如此,但是Chrome特意做了容錯處理。如,本來是數值的屬性,寫了個諸如“a”這個不合法的值,其會當作“0”來處理,動畫效果依然存在。)

  4. values可以是一個值或多值。但在Chrome瀏覽器下的測試,是一個值的時候是沒有動畫效果。多值時候有動畫效果。當values值設置並能識別時候,from, to, by的值都會被忽略。我們實現動畫,不可能就是單純的從a位置到b位置,有時候,需要去c位置過渡下。此時,實際上有3個動畫關鍵點。而from, to/by只能駕馭兩個,此時就是values大顯身手的時候了!

<svg width="320" height="200" xmlns="http://www.w3.org/2000/svg">
     <text font-family="microsoft yahei" font-size="120" y="150" x="160">來回跑 
        <animate attributeName="x" values="160;40;160" dur="3s" repeatCount="indefinite" />
     </text> 
</svg>    

總結下,也就是from-to動畫、from-by動畫、to動畫、by動畫以及values動畫。

4. begin, end

begin指動畫開始的時間,看上去很簡單。設個時間,延遲嘛~~實際上非也非也,上面出現的beigin="3s"只是最簡單最基本的表示。

begin的定義是分號分隔的一組值。單值只是其中的情況之一。例如,beigin="3s;5s"表示的是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表示偏移值,數值前面有+或-. 應該指相對於documentdocument的begin值而言。
② syncbase-value基於同步確定的值。語法為:[元素的id].begin/end +/- 時間值. 就是說借用其他元素的begin值再加加減減,這個可以準確實現兩個獨立元素的動畫級聯效果。OK,看完下麵的例子一定會豁然開朗,對於上面的offset-value也會有一定的認知。後面attributeName為y的元素的begin值是x.end. x.end中的x就是上面一個animate元素的id值,而end是動畫元素都有的一個屬性,動畫結束的時間。因此,begin="x.end"意思就是,當id為x的元素動畫結束的時候,我執行動畫。非常類似於PowerPoint動畫的“上一個動畫之後”的選項。還可以增加一些偏移值,例如begin="x.end-1s", 就表示id為x的元素動畫結束前一秒開始縱向移動

<svg width="320" height="200" xmlns="http://www.w3.org/2000/svg">
     <text font-family="microsoft yahei" font-size="120" y="160" x="160">id為x的動畫結束了開始,無縫連接
        <animate id="x" attributeName="x" to="60" begin="0s" dur="3s" fill="freeze" /> 
        <animate attributeName="y" to="100" begin="x.end" dur="3s" fill="freeze" /> 
    </text> 
</svg>    

③ event-value這個表示與事件相關聯的值。類似於PowerPoint動畫的“點擊執行該動畫”。語法是:[元素的id].[事件類型] +/- 時間值. 舉個例子,點擊下圖的圓圈圈,馬兒它就會自己跑!

<svg id="svg" width="320" height="200" xmlns="http://www.w3.org/2000/svg"> 
    <circle id="circle" cx="100" cy="100" r="50"></circle> 
        <text font-family="microsoft yahei" font-size="120" y="160" x="160">點擊圓圈字會跑 
            <animate attributeName="x" to="60" begin="circle.click" dur="3s" /> 
        </text> 
</svg> 

註意,這類與事件關聯的SVG需要內聯在頁面中,否則click什麼的都是徒勞。

④ repeat-value指重覆多少次之後幹嘛幹嘛。語法為:[元素的id].repeat(整數) +/- 時間值. 舉個例子,下麵這個馬兒會在水平運動2次之後,斜向運動,begin="x.repeat(2)"指id為x的元素的動畫重覆2次後執行~~

<svg width="320" height="200" xmlns="http://www.w3.org/2000/svg">
     <text font-family="microsoft yahei" font-size="120" y="160" x="160">x執行2次後再執行y 
        <animate id="x" attributeName="x" to="60" begin="0s" dur="3s" repeatCount="indefinite" />
        <animate attributeName="y" to="100" begin="x.repeat(2)" dur="3s" fill="freeze" />
     </text> 
</svg>    

⑤ accessKey-value定義快捷鍵。即按下某個按鍵動畫開始。語法為:accessKey(" character "). character表示快捷鍵所在的字元,舉個例子,按下s鍵動畫走起。SVG代碼如下:

<svg width="320" height="200" xmlns="http://www.w3.org/2000/svg">
    <text font-family="microsoft yahei" font-size="120" y="160" x="160">按鍵盤s鍵執行
        <animate attributeName="x" to="60" begin="accessKey(s)" dur="3s" repeatCount="indefinite" />
    </text>
</svg>

⑥ wallclock-sync-value指真實世界的時鐘時間定義。時間語法是基於在ISO8601中定義的語法。

⑦ "indefinite"就是這個字元串值,表示“無限等待”。據說需要beginElement()方法觸發或者指向該動畫元素的超鏈接(SVG中的a元素)。點擊我們的svg, 觸發animate元素的beginElement()方法,前提是begin="indefinite".

<svg id="svg" width="320" height="200" xmlns="http://www.w3.org/2000/svg">         
    <text font-family="microsoft yahei" font-size="120" y="160" x="160">觸發事件後運動   
        <animate attributeName="x" to="60" begin="indefinite" dur="3s" />
    </text>
</svg>
var animate = document.getElementsByTagName("animate")[0]; 
    if (animate) {
         document.getElementById("svg").onclick = function() {     
            animate.beginElement();
    };
}

 a元素的xlink:href指向的我們的動畫元素

<svg width="320" height="200" font-family="microsoft yahei" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <text font-size="120" y="160" x="160">點擊觸發<animate id="animate" attributeName="x" to="60" begin="indefinite" dur="3s" repeatCount="indefinite" />
    </text> 
    <a xlink:href="#animate"> 
    <text x="10" y="20" fill="#cd0000" font-size="30">點擊我</text> 
    </a>
</svg>

5. dur
後面兩種:常規時間值 | "indefinite".

“常規時間值”就是3s之類的正常值;"indefinite"指事件無限。動畫時間無限,實際上就是動畫壓根不執行的意思。因此,設置為"indefinite"跟沒有dur是一個意思,與dur解析異常一個意思。

6. calcMode, keyTimes, keySplines
這幾個參數是控制動畫先快還是先慢類似這樣作用的。

calcMode屬性支持4個值:discrete | linear | paced | spline. 中文意思分別是:“離散”|“線性”|“踏步”|“樣條”。

discrete
from值直接跳到to值。
linear
animateMotion元素以外元素的calcMode預設值。動畫從頭到尾的速率都是一致的。
paced
通過插值讓動畫的變化步調平穩均勻。僅支持線性數值區域內的值,這樣點之間“距離”的概念才能被計算(如position, width, height等)。
如果”paced“指定,任何keyTimeskeySplines值都會打醬油。
spline
插值定義貝塞爾曲線。spline點的定義在keyTimes屬性中,每個時間間隔控制點由keySplines定義。

keyTimes = “<list>”
跟上面提到的<list>類似,都是分號分隔一組值。keyTimes從名字上看是關鍵時間點的意思,大致就是這個意思。前面提到過values也是多值,這裡有一些約定的規則:

  一、keyTimes值的數目要和values一致,如果是from/to/by動畫,keyTimes就必須有兩個值。

  二、對於linearspline動畫,第一個數字要是0, 最後一個是1

  三、每個連續的時間值必須比它前面的值大或者相等。

 paced模式下,keyTimes會被忽略;keyTimes定義錯誤,也會被忽略;durindefinite也會被忽略。

keySplines = “<list>”
keySplines表示的是與keyTimes相關聯的一組貝塞爾控制點(預設0 0 1 1)。每個控制點使用4個浮點值表示:x1 y1 x2 y2. 只有模式是spline時候這個參數才有用,也是分號分隔,值範圍0~1,總是比keyTimes少一個值。

如果keySplines值不合法或個數不對,是沒有動畫效果的。

如下4個SVG,只展示重要部分代碼:

<animate attributeName="x" dur="5s" values="0; 20; 160" calcMode="linear" />

<animate attributeName="x" dur="5s" values="0; 20; 160" calcMode="paced"/>

<animate attributeName="x" dur="5s" values="0; 80; 160" keyTimes="0; .8; 1" calcMode="linear"/>

<animate attributeName="x" dur="5s" values="0; 80; 160" keyTimes="0; .8; 1" calcMode="spline"  keySplines=".5 0 .5 1; 0 0 1 1" />

就是values, keyTimes, keySplines三個人之間事情。values確定動畫的關鍵位置,keyTimes確定到這個關鍵點需要的時間,keySplines確定的是每個時間點段之間的貝塞爾曲線,也就是具體的緩動表現。平時CSS3寫的transition動畫效果,也是這麼回事,這是values值就兩個,所以,keyTimes只能是0;1, 貝塞爾曲線就只有一個,要不ease, 要不linear等

7. repeatCount, repeatDur

repeatCount表示動畫執行次數,可以是合法數值或者”indefinite“(動畫迴圈到電腦死機)。
repeatDur定義重覆動畫的總時間。可以是普通時間值或者”indefinite(”動畫迴圈到電腦死機)。

動畫只玩執行完整3個 + 一個1/3個動畫。因為repeat總時間就10s而已。

<animate attributeName="x" to="60" dur="3s" repeatCount="indefinite" repeatDur="10s" />

8. fill

fill表示動畫間隙的填充方式。支持參數有:freeze | remove. 其中remove是預設值,表示動畫結束直接回到開始的地方。freeze“凍結”表示動畫結束後像是被凍住了,元素保持了動畫結束之後的狀態。

9. accumulate, additive

accumulate是累積的意思。支持參數有:none | sum. 預設值是none. 如果值是sum表示動畫結束時候的位置作為下次動畫的起始位置。
additive控制動畫是否附加。支持參數有:replace | sum. 預設值是replace. 如果值是sum表示動畫的基礎知識會附加到其他低優先順序的動畫上,

<img ...>    
    <animateMotion begin="0" dur="5s" path="[some path]" additive="sum" fill="freeze" />    
    <animateMotion begin="5s" dur="5s" path="[some path]" additive="sum" fill="freeze" />    
    <animateMotion begin="10s" dur="5s" path="[some path]" additive="sum" fill="freeze" /> 
</img>

這裡輪到第二個動畫的時候,路徑是從第一個動畫路徑結束地方開始的,於是,3個動畫完美無縫連接起來了。

    <animateTransform attributeName="transform" type="scale" from="1" to="3" dur="10s" repeatCount="indefinite" additive="sum"/> 
    <animateTransform attributeName="transform" type="rotate" from="0 30 20" to="360 30 20" dur="10s" fill="freeze" repeatCount="indefinite" additive="sum"/>;

兩個動畫同時都是transform,都要使用一個type屬性,好在這個例子additive="sum"是累加的而不是replace替換。

於是,我們就可以是實現一邊旋轉一邊放大的效果。

10. restart

restart這個屬性誕生的背景如下:很多動畫呢,其觸發可能與事件相關。現在,存在這種情況,希望點擊一次反應一次,之後再點擊就沒有反應。這種需求的出現迫使restart參數的出現。支持的參數有:always | whenNotActive | never.

always是預設值,表示總是,也就是點一次,觸發一次事件。whenNotActive表示動畫正在進行的時候,是不能重啟動畫的。never表示動畫是一波流。

11. min, max

min/max表示動畫執行最短和最長時間。支持參數為時間值和"media"(媒介元素有效), max還支持indefinite.

四、動畫的暫停與播放

SVG animation中是有內置的API可以暫停和啟動動畫的

// svg指當前svg DOM元素
// 暫停
    svg.pauseAnimations(); 
// 重啟動 
    svg.unpauseAnimations()

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • A 調用攝像頭拍照,自定義裁剪編輯頭像,頭像圖片色度調節B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器 freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本,處理類,service等完整模塊C 集成阿裡巴巴資料庫連接池 ...
  • 解決: ...
  • 兜兜轉轉,突然發現我現在已經是一個老司機了,一直寫代碼都很忙,沒有把很多點點滴滴的記錄下來,今天開始就開始一個系列,分析當年我接觸或者我設計過的表結構,有好有壞,有歡喜也有淚水。很多實踐經驗來自於踩了一個又一個的坑,從現在的角度去回想,在設計的時候如果那麼做,也許我就不需要改代碼了…… 歡迎各位在評 ...
  • 本文也同步發表在我的公眾號“我的天空” 依賴註入 依賴註入不是AngularJS獨有的概念,而是現代軟體開發與架構的範疇,但是在AngularJS中“依賴註入”是其核心思想之一,所以我們專門來學習一下。 觀察除“AngularJS路由”這節之前的控制器代碼,發現我們把所有的業務邏輯都寫在控制器代碼部 ...
  • 1. ng-if跟ng-show/hide的區別有哪些? 第一點區別是,ng-if 在後面表達式為 true 的時候才創建這個 dom 節點,ng-show 是初始時就創建了,用 display:block 和 display:none 來控制顯示和不顯示。 第二點區別是,ng-if 會(隱式地)產 ...
  • 之前一直對this的指向很模糊,找了一些別人的博客看,又重新看了一下《你不知道的JavaScript》,感覺基本上是弄懂了,挑一些重點的地方記錄一下,有些地方對我來說書上解釋寫的不夠多,所以自己做下補充以方便理解,有理解錯的地方還望指出。 一.澄清誤區 首先你需要知道: 1.this並不指向函數自身 ...
  • 首先說一下函數傳參。 函數傳參:顧名思義就是函數傳遞參數。這個參數指的就是已知的JS數據類型:數字、字元串、布爾值、函數、對象以及未定義。 1、數字 上邊代碼中相當於使用a來接收100,b來接收px,通過函數中的alert(a+b)展示為100px。 2、字元串 執行之後第一次彈出 第二次彈出 在這 ...
  • nvm 是 windows 下切換 node 版本的管理工具,mac 下可以使用 TJ 寫的 n 。 1、https://github.com/coreybutler/nvm-windows/releases,圖示點擊下載 2、點擊安裝,預設配置即可,win開始菜單會生成一個 3、命令行cmd進入, ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...