SVG動畫

来源:http://www.cnblogs.com/lovesong/archive/2016/10/29/6011328.html
-Advertisement-
Play Games

動畫原理 SVG動畫,就是元素的屬性值關於時間的變化。 如下圖來說,元素的某個屬性值的起始值(from)到結束值(to)在一個時間段(duration)根據時間函數(timing-function)計算出每一幀(frame)的插值(interpolation)作為變換的行為。 PS:SVG動畫是幀動 ...


動畫原理

SVG動畫,就是元素的屬性值關於時間的變化。 如下圖來說,元素的某個屬性值的起始值(from)到結束值(to)在一個時間段(duration)根據時間函數(timing-function)計算出每一幀(frame)的插值(interpolation)作為變換的行為。

PS:SVG動畫是幀動畫,在SVG里也就是每秒設置多少個value值。

SVG動畫語法

SVG動畫是基於SMIL(Synchronized Multimedia Integration Language)語言的,全稱是同步多媒體集成語言。

SVG動畫使用

SVG元素使用動畫有兩種方式:

1. 被xlink:href引用

<animate  xlink:href="url(#rect1)"></animate> 

2. 包含在目標元素里

<rect  x="0"  ...>
     <animate></animate>
</rect>

<animate>標簽

該標簽用於基本動畫。

參數 描述
attributeName 要變化屬性名稱
1.可以是元素直接暴露的屬性
2.可以是CSS屬性
attributeType  用來表明attributeName屬性值的類型
支持三個固定參數,CSS/XML/auto,預設值auto。
例如:x、 y以及transform就屬於XML, opacity就屬於CSS。
from 起始值
起始值與元素的預設值是一樣的,該參數可省略。
to 結束值
by 相對from的變化值
PS:當有to值時,該值無效。
values 動畫的多個關鍵值,用分號分隔。
dur 持續時間
取值:常規時間值 | "indefinite"
repeatCount 動畫執行次數
取值:合法數值或者“indefinite”
fill 動畫間隙的填充方式
取值:freeze | remove(預設值)。
remove:表示動畫結束直接回到開始的地方。
freeze:表示動畫結束後保持了動畫結束之後的狀態。
calcMode 控制動畫的快慢
取值:discrete | linear(預設值) | paced | spline.
中文意思分別是:“離散”|“線性”|“踏步”|“樣條”。
另外,該參數要結合keyTimes、keySplines使用,數值的是對應values的,
所以如果沒有設置values和keyTime或keySplines,是沒有效果的。
begin 動畫開始的時機,取值:
time-value | offset-value | syncbase-value | event-value | repeat-value |
accessKey-value | media-marker-value | wallclock-sync-value | "indefinite"
1. time-value:動畫開始時間,可傳多個值,分號分隔。
2. syncbase-value:[元素的id].begin/end +/- 時間值(offset-value)
    某個動畫效果開始或結束觸發此動畫的,可加上偏移量。
3. event-value:事件觸發
4. repeat-value:指某animation重覆多少次開始。
    語法為:[元素的id].repeat(整數) +/- 時間值
end end與begin除了名字和字面含義不一樣,其值的種類與表意都是一模一樣的。

PS:只列出常用參數,其他請查閱參考文獻。

例子:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
     <rect x="50" y ="50" width="100" height="50" fill="red">
          <animate attributeType="XML"
               attributeName="x"
               from="50"
               to="400"
               dur="5s"
               fill="freeze">
          </animate>
     </rect>
     <rect x="50" y ="150" width="100" height="50" fill="green">
          <animate attributeType="XML"
               attributeName="x"
               from="50"
               by="400"
               dur="5s"
               fill="freeze">
          </animate>
     </rect>
     <rect x="50" y ="250" width="100" height="50" fill="blue">
          <animate attributeType="XML"
               attributeName="x"
               values="50;450;50"
               dur="10s"
               >
          </animate>
     </rect>
     <rect x="50" y ="350" width="100" height="50" fill="orange">
          <animate attributeType="XML"
               attributeName="x"
               dur="10s"
               values="50;450;50"
               calcMode="spline"
               keySplines=".5 0 .5 1; 0 0 1 1"
               fill="freeze"
               >
          </animate>
     </rect>
     <rect x="50" y ="450" width="100" height="50" fill="black">
          <animate attributeType="XML"
               attributeName="x"
               from="50"
               by="400"
               dur="5s"
               calcMode="spline"
               keySplines=".5 0 .5 1; 0 0 1 1"
               fill="freeze"
               >
          </animate>
     </rect>
</svg>

效果:

begin例子:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
     <text x="50" y="30" id="t" stroke="red">click red go</text>
     <rect x="50" y ="50" width="100" height="50" fill="red">
          <animate attributeType="XML"
               attributeName="x"
               begin="t.click"
               from="50"
               to="400"
               dur="5s"
               fill="freeze">
          </animate>
     </rect>
     <rect x="50" y ="150" width="100" height="50" fill="green">
          <!--表示的是3s之後動畫開始,10s時候動畫再開始一次
               (如果之前動畫沒走完,會立即停止從頭開始)-->
          <animate attributeType="XML"
               attributeName="x"
               begin="3s;10s"
               from="50"
               to="400"
               dur="5s"
               fill="freeze">
          </animate>
     </rect>
     <rect x="50" y ="250" width="100" height="50" fill="blue">
          <animate id="goleft" attributeType="XML"
               attributeName="x"
               from="50"
               to="400"
               dur="5s"
               fill="freeze"
               >
          </animate>
          <!--註意begin的id是animate的id,不是元素的-->
          <animate attributeType="XML"
               attributeName="y"
               begin="goleft.end"
               to="350"
               dur="2s"
               fill="freeze"
               >
          </animate>
     </rect>
     <rect x="50" y ="350" width="100" height="50" fill="orange">
          <animate id="goleft" attributeType="XML"
               attributeName="x"
               from="50"
               to="400"
               dur="5s"
               fill="freeze"
               >
          </animate>
          <!--註意begin的id是animate的id,不是元素的-->
          <animate attributeType="XML"
               attributeName="y"
               to="400"
               dur="5s"
               fill="freeze"
               >
          </animate>
     </rect>
     <line stroke='black' x1="50" y1="350" x2="500" y2="350"/>
     <line stroke='black' x1="50" y1="400" x2="500" y2="400"//>
</svg>

效果:

註意:

1. 多個animate是可以疊加的。

<animateTransform>標簽

該標簽用於變換動畫,animateTransform也有animate的參數,額外的是type。

參數 描述
type 變換的類型,取值:translate、scale、rotate、skewX、skewY

例子:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-200 -200 800 800">
     <rect x="50" y ="50" width="50" height="50" fill="red">
          <animateTransform attributeName="transform"
               attributeType="XML"
               type="rotate"
               from="0 75 75"
               to="360 75 75"
               dur="2"
               repeatCount="indefinite"/>
     </rect>
     <!--x、y都放大了-->
     <rect x="50" y ="150" width="50" height="50" fill="green">
          <animateTransform attributeName="transform"
               attributeType="XML"
               type="scale"
               from="1"
               to="2"
               dur="2"
               fill="freeze"/>
     </rect>     
     <rect x="50" y ="250" width="50" height="50" fill="blue">
          <animateTransform attributeName="transform"
               attributeType="XML"
               type="translate"
               to="250 0"
               dur="2"
               fill="freeze"/>
     </rect>
     <rect x="50" y ="150" width="50" height="50" fill="black">
          <animateTransform attributeName="transform"
               attributeType="XML"
               type="rotate"
               from="0 75 125"
               to="360 75 125"
               dur="2"
               repeatCount="indefinite" additive="sum"/>
          <animateTransform attributeName="transform"
               attributeType="XML"
               type="scale"
               from="1"
               to="2"
               dur="2"
               fill="freeze" additive="sum"/>
     </rect>
</svg>

效果:

註意:

1. animateTransform也是可以疊加的,不過要加上additive="sum",否則後面的無效了。

<animateMotion>標簽

這個標簽讓元素在路徑(Path)上滑動。

例子:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
     <path d="M100,400Q150,300 250,400 T400,400" stroke="red" fill="none"/>
     <rect width="20" height="20" fill="red">
          <animateMotion
               path="M100,400Q150,300 250,400 T400,400"
               rotate="auto"
               dur="3s"
               fill="freeze">
          </animateMotion>
     </rect>
</svg>

效果:

註意:

1. 設置rotate="auto",可以讓元素根據路徑的切線方向做旋轉。

腳本動畫

SVG的requestAnimationFrame函數可以讓我們用js來做動畫,瀏覽器對requestAnimationFrame調用的頻率是每秒60次逐幀動畫。

例子:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
     <rect id="rect" x="50" y="50" width="100" height="100" fill="green" />
</svg>
<script>
    var cur = 0;
    var rect=document.getElementById("rect");
    var frames = window.requestAnimationFrame(doAnim);
    function doAnim(){
        if(cur>=360){
            //取消幀動畫
            window.cancelAnimationFrame(frames);
            return;
        }
        cur++;
        rect.setAttribute("transform", "rotate(" + cur + ",100, 100)");
        frames = window.requestAnimationFrame(doAnim);
    }
</script>

PS:效果就是正方形旋轉360°後停止。

 

參考視頻

1. SVG課程(慕課網)

 

參考文獻

1. http://www.w3.org/TR/SVG/animate.html

2. http://www.zhangxinxu.com/wordpress/?p=4333

 

本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/6011328.html


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

-Advertisement-
Play Games
更多相關文章
  • 如下記錄一次作業: 很顯然,我這個應該屬於二逼青年版,會在以後更新文藝青年版的答案。 1、模仿sed,一個文件中,用新字元串替換老字元串。 2、查找、添加、刪除特定的內容 ...
  • 我的博客園博文地址:http://www.cnblogs.com/tenglongwentian/ Lucene,最新版是Lucene6.2.1,匹配的jdk版本是1.8正式版。這裡用jdk7最後一版,所以用Lucene5.3.3。 新建一個maven項目,如果不會可以參考前面的博文,前面的博文有專 ...
  • 以太坊是區塊鏈開發領域最好的編程平臺,而truffle是以太坊(Ethereum)最受歡迎的一個開發框架,這是我們第一篇區塊鏈技術文章介紹truffle的原因,實戰是最重要的事情,這篇文章不講原理,只搭建環境,運行第一個區塊鏈程式(Dapp)。 安裝truffle $ npm install -g ...
  • 1.計算程式運行時常 2.文件讀寫 3.立flag 設置布爾變數,用來在程式運行時對一些邏輯進行標記。其中false和true需要自己定義其含義。因此在設置flag的時,需要註意false以及true對應的含義。否則這些邏輯上的錯誤很難被檢查出來。 4.使用HashMap 聲明myMap為HashM ...
  • 這個案例類似於在地圖上滾動滾輪,能縮小或者放大地圖,分別用zoomIn和zoomOut來命名。 代碼如下: 另外,detail在滾輪事件中,向上滾——放大(detail == -3),觸發zoomOut;向下滾——縮小(detail == 3),觸發zoomIn。 自定義事件需要trigger來主動 ...
  • 通過資料庫和ajax方法寫出地圖 客戶端部分:html、js、css代碼部分: 服務端部分:app.js(一個JavaScript): 資料庫mysql信息: 最終結果: ...
  • 類似的文章園子里已有,請看這裡,個人感覺稍顯複雜,日前也打算寫一個簡單的給項目用,一些關鍵點記錄於此。最終效果如下: 後端使用Asp.net mvc5,前端框架有:jquery.validate、jquery.validate.unobtrusive、requirejs、Bootstrap,都是當前 ...
  • 直入正題,用JS實現一個簡單的打地鼠游戲 因為功能比較簡單就直接裸奔JS了,先看看效果圖,或者 線上玩玩 吧 如果點擊顏色比較深的那個(俗稱壞老鼠),將扣分50;如果點擊顏色比較淺的那個(俗稱好老鼠),將得分100 實現 老鼠好像有點難畫,又不想用圖片,就直接用CSS畫個簡單的圖代表老鼠和坑吧 ht ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...