1. 程式人生 > 其它 >HTML5(九)——超強的 SVG 動畫

HTML5(九)——超強的 SVG 動畫

SVG 動畫有很多種實現方法,也有很大SVG動畫庫,現在我們就來介紹 svg動畫實現方法都有哪些?

一、SVG 的 animation

SVG animation 有五大元素,他們控制著各種不同型別的動畫,分別為:

  • set
  • animate
  • animateColor
  • animateTransform
  • animateMotion

1.1、set

set 為動畫元素設定延遲,此元素是SVG中最簡單的動畫元素,但是他並沒有動畫效果。

使用語法:

<set attributeName="" attributeType="" to="" begin="" />
  • attributeName :是要改變的元素屬性名稱。
  • attributeType :是表明attributeName屬性值的列表,支援三個固定引數 CSS/XML/auto,如x,y以及transform屬於XML,opacity屬於CSS。auto是瀏覽器自動判別的意思,也是預設值,如果你不知道該選哪個就填auto,瀏覽器自己判別。
  • to :動畫結束的屬性值。
  • begin :動畫延遲時間。

eg:繪製一個半徑為200的圓,4秒之後,半徑變為50。

<svg width="320" height="320">
 <circle cx="0" cy="0" r="200" style="stroke: none; fill: #0000ff;">
  <set attributeName="r" attributeType="XML" to="50" begin="4s" />
 </circle>
</svg>

1.2、animate

是基礎的動畫元素,實現單屬性的過渡效果。

使用語法:

<animate 
 attributeName="r" 
 from="200" to="50" 
 begin="4s" dur="2s" 
 repeatCount="2"
></animate>
  • from :過渡效果的屬性開始值。
  • to:過渡效果的屬性結束值。
  • begin:動畫開始時間。
  • dur:動畫過渡時間,控制動畫速度。
  • repeatCount:動畫重複次數。

eg:繪製一個半徑為200的圓,4秒之後半徑在2秒內從200逐漸變為50。

<circle cx="0" cy="0" r="200" style="stroke: none; fill: #0000ff;">
 <animate attributeName="r" from="200" to="50" 
  begin
="4s" dur="2s" repeatCount="2"></animate> </circle>

1.3、animateColor

控制顏色動畫,animate也可以實現這個效果,所以該屬性目前已被廢棄。

1.4、animateTransform

實現transform變換動畫效果,與css3的transform變換類似。實現平移、旋轉、縮放等效果。

使用語法:

<animateTransform attributeName="transform"  type="scale" 
 from="1.5" to="0" 
 begin="2s"  dur="3s" 
 repeatCount="indefinite"></animateTransform>
  • repeatCount:重複次數,設定為 indefinite 表示無限迴圈,一直執行。
  • type:新增 transform 變換型別。

eg:繪製一個半徑為200的圓,4秒之後開始縮放,在2秒內從1.5縮小到0倍。

<svg width="320" height="320">
 <circle cx="0" cy="0" r="200" style="stroke: none; fill: #0000ff;">
  <animateTransform attributeName="transform" begin="4s"  
   dur="2s" type="scale" from="1.5" to="0" 
   repeatCount="indefinite"></animateTransform>
 </circle>
</svg>

1.5、animateMotion

可以定義動畫路徑,讓SVG各個圖形,沿著指定路徑運動。

使用語法:

<animateMotion 
 path="M 0 0 L 320 320" 
begin="4s" dur="2s"></animateMotion>

eg:繪製一個半徑為10的圓,延遲4秒從左上角運動的右下角。

<svg width="320" height="320">
 <circle cx="0" cy="0" r="10" style="stroke: none; fill: #0000ff;">
  <animateMotion 
   path="M 0 0 L 320 320" 
   begin="4s" dur="2s"
   ></animateMotion>
 </circle>
</svg>

實際製作動畫的時候,動畫太單一不酷,需要同時改變多個屬性時,上邊的四種元素可以互相組合,同類型的動畫也能組合。以上這些元素雖然能夠實現動畫,但是無法動態地新增事件,所以接下來我們就看看 js 如何製作動畫。

二、JavaScript 控制

上篇文章我們介紹js可以操作path,同樣也可以操作SVG的內建形狀元素,還可以給任意元素新增事件。

給SVG元素新增事件方法與普通元素一樣,可以只用on+事件名 或者addEventListener新增。

eg:使用SVG繪製地一條線,點選線條地時候改變 x1 ,實現旋轉效果。

<svg width="800" height="800" id="svg">
    <line id="line" x1="100" y1="100" 
    x2="400" y2="300" 
    stroke="black" stroke-width="5"></line>  
  </svg>
<script>
 window.onload = function(){
  var line = document.getElementById("line")
  line.onclick = function(){
   let start = parseInt(line.getAttribute("x1")),
       end=400,dis = start-end
   requestAnimationFrame(next)
   let count = 0;
   function next(){
    count++
    let a = count/200,cur = Math.abs(start+ dis*a)
    line.setAttribute('x1',cur)
    if(count<200)requestAnimationFrame(next)
   }
  }
 }
</script>

js製作的SVG動畫,主要利用 requestAnimationFrame 來實現一幀一幀的改變。

我們上述製作的 SVG 圖形、動畫等,執行在低版本IE中,發現SVG只有IE9以上才支援,低版本的並不能支援,為了相容低版本瀏覽器,可以使用 VML ,VML需要新增額外東西,每個元素需要新增 v:元素,樣式中還需要新增 behavier ,經常用於繪製地圖。由於使用太麻煩,所以我們藉助 Raphael.js 庫。

三、Raphaël.js (拉斐爾)

Raphael.js是通過SVG/VML+js實現跨瀏覽器的向量圖形,在IE瀏覽器中使用VML,非IE瀏覽器使用SVG,類似於jquery,本質還是一個javascript庫,使用簡單,容易上手。

使用之前需要先引入Raphael.js庫檔案。cdn的地址為:
https://cdn.bootcdn.net/ajax/libs/raphael/2.3.0/raphael.js

3.1、建立畫布

Rapheal有兩種建立畫布的方式:

第一種:瀏覽器視窗上建立畫布

建立語法:

var paper = Raphael(x,y,width,height)

x,y是畫布左上角的座標,此時畫布的位置是絕對定位,有可能會與其他html元素重疊。width、height是畫布的寬高。

第二種:在一個元素中建立畫布

建立語法:

var paper = Raphael(element, width, height);

element是元素節點本身或ID width、height是畫布的寬度和高度。

3.2、繪製圖形

畫布建立好之後,該物件自帶SVG內建圖形有矩形、圓形、橢圓形。他們的方法分別為:

paper.circle(cx, cy, r); // (cx , cy)圓心座標 r 半徑
paper.rect(x, y, width, height, r); // (x,y)左上角座標 width寬度 height高度 r圓角半徑(可選)
paper. ellipse(cx, cy, rx, ry); // (cx , cy)圓心座標 rx水平半徑 ry垂直半徑

eg:在div中繪製一個圓形,一個橢圓、一個矩形。

<div id="box"></div>
<script>
 var paper = Raphael("box",300,300)
 paper.circle(150,150,150)
 paper.rect(0,0,300,300)
 paper.ellipse(150,150,100,150)
</script>

執行結果如下:

除了簡單圖形之外,還可以繪製複雜圖形,如三角形、心型,這時就使用path方法。

使用語法:paper.path(pathString)

pathString是由一個或多個命令組成,每個命令以字母開始,多個引數是由逗號分隔。

eg:繪製一個三角形。

let sj = paper.path("M 0,0 L100,100 L100,0 'Z'")

還可以繪製文字,如果需要換行,使用 \n 。

文字語法:paper.text(x,y,text)

(x,y)是文字座標,text是要繪製的文字。

3.3、設定屬性

圖形繪製之後,我們通常會新增stroke、fill、stroke-width等讓圖形更美觀,Raphael使用attr給圖形設定屬性。

使用語法:circle.attr({"屬性名","屬性值","屬性名","屬性值",...})

如果只有屬性名沒有屬性值,則是獲取屬性,如果有屬性值,則是設定屬性。

注意:如果只設置一個屬性時,可以省略‘{}’。如:rect.attr('fill','pink')

eg:給上邊的矩形新增邊框和背景色。

<div id="box"></div>
<script>
 var paper = Raphael("box",300,300)
 let rect = paper.rect(100,100,150,200)
 rect.attr({'fill':'red','stroke':'blue','stroke-width':'10'})
</script>

3.4、新增事件

RaphaelJS一般具有以下事件:
click、dblclick、drag、hide、hover、mousedown、mouseout、mouseup、mouseover等以及對應的解除事件,只要在前面加上“un”就可以了(unclick、undblclick)。

使用語法:

obj.click(function(){
 //需要操作的內容
})

3.5、新增動畫

animate為指定圖形新增動畫並執行。

使用語法:

obj.animate({
 "屬性名1":屬性值1,
 "屬性名2":屬性值2,
  ...
},time,type)

屬性名和屬性值就根據你想要的動畫型別加就ok。

time:動畫所需時間。

type:指動畫緩動型別。常用值有:

  • linear - 線性漸變
  • ease-in | easeIn | < - 由慢到快
  • ease-out | easeOut | > - 由快到慢
  • ease-in-out | easeInOut | <> - 由慢到快再到慢
  • back-in | backIn - 開始時回彈
  • back-out | backOut - 結束時回彈
  • elastic - 橡皮筋
  • bounce - 彈跳

eg:點選矩形,矩形緩緩變大。

<div id="box"></div>
<script>
 var paper = Raphael("box",800,500)
 let rect = paper.rect(100,100,150,100)
 rect.attr({'fill':'red','stroke':'blue','stroke-width':'10'})
 rect.attr('fill','pink')
 rect.click(function(){
  rect.animate({
   "width":300,
   "height":300
  },1000,"bounce")
 })
</script>

複製上邊的程式碼,分別在各個瀏覽器和低版本IE瀏覽器執行,發現都可以正常執行。SVG的動畫庫挺多了,我們介紹了拉斐爾,有興趣的小夥伴可以自行找找其他庫。