1. 程式人生 > >簡單聊一聊那些svg的沿路徑運動

簡單聊一聊那些svg的沿路徑運動

之前遇見動畫就很想用css實現,顯然有些效果是我們力所不能及,實現起來麻煩,效果不好,讓人捉急。其實歸結起來,不同的動畫有自己的優勢,根據實際情況進行取捨。本文就告訴大家如何用SVG寫出個簡單動畫。就讓我們以路徑動畫為例來說明吧。

類似於下面動畫,這種之前就覺得好炫酷

640?wx_fmt=gif&wxfrom=5&wx_lazy=1&retryload=1

好吧,就算不說這個,沒學習之前,svg實現的loading我也不知道怎麼搞得。

當然SVG肯定不是隻是來做這個的啦,這只是人家神奇的一部分。SVG的優勢是 跨裝置能力強、體積小、影象可透明,可以與js互動等等等等,在這裡不一一介紹啦。我們直接從小例子開始,動手實現個按路徑運動的動畫。

首先讓我們來實現一個描繪圖形邊框的小例子,如下圖:

640?wx_fmt=gif&wxfrom=5&wx_lazy=1&retryload=1

要描繪如上圖的五角星圖形,我們首先應該確定各個角的座標,然後將它們連線起來就好了。說起來簡單,做起來其實更簡單,簡單程式碼實現如下:

  1. <svgversion="1.1"

  2. xmlns="http://www.w3.org/2000/svg"width="500"height="500"viewbox="-500 -500 2500 2500">

  3. <polygonpoints="-12 -69,-58 85,64 -14,-81 -14,41 85"class="star-path"></polygon>

  4. <polygonpoints="-12 -69,-58 85,64 -14,-81 -14,41 85"class="star-fill"></polygon>

  5. </svg>

在以上的程式碼中,polygon 標籤是svg多邊形標籤,points 屬性定義多邊形每個角的 x 和 y 座標。通過class為star-path的標籤來實現我們圖中的灰色軌跡,通過class為star-fill的標籤來實現描繪的動畫。

上邊我們實現了五角星的圖形,下面我們就結合css,來完成這個完整的描繪動畫:

  1. .star-path{

  2.    fill: none;

  3.    stroke-width:10;

  4.    stroke:#d3dce6;

  5.    stroke-linejoin:round;

  6.    stroke-linecap:round;

  7. }

  8. .star-fill{

  9.    fill: none;

  10.    stroke-width:10;

  11.    stroke:#ff7700;

  12.    stroke-linejoin:round;

  13.    stroke-linecap:round;

  14.    stroke-dasharray:782;

  15.    stroke

    -dashoffset:0;

  16.    animation: starFill 2s ease-out infinite;

  17. }

  18. @keyframes starFill {

  19. 0%{

  20.        stroke-dashoffset:782;

  21. }

  22. 100%{

  23.        stroke-dashoffset:0;

  24. }

  25. }

在上面的程式碼中,最核心的屬性就是 stroke-dasharray和stroke-dashoffset 。 stroke-dasharray:定義描邊的虛線長度,如果提供奇數個,則會自動複製該值成偶數。 stroke-dashoffset:定義虛線描邊的偏移量。 在上面程式碼中,stroke-dasharray代表虛線之間的間距大小。當我們設定了間距足夠長的時候,以至於大於我們圖形的總邊長,就會達到我們想要的效果。一開始我們的短劃線是0,缺口是全部長度,隨動畫的進行,短劃線的長度慢慢增長為圖形總邊長的全部長度,達到了慢慢充滿全部的效果。另外,我們要知道路徑長度也可以藉助 如下程式碼path.getTotalLength() 函式獲取路徑的長度。

  1. document.querySelector('.star-path').getTotalLength();

除此之外,我們還可以改變偏移 stroke-dashoffset 來達到效果,將虛線的偏移量設定為 0,此時我們看到的路徑描邊就是沒有間斷的連續曲線,通過設定虛線偏移量等於曲線的長度,那該曲線恰好“消失”,程式碼如下:

  1. .star-path{

  2.    fill: none;

  3.    stroke-width:10;

  4.    stroke:#d3dce6;

  5.    stroke-linejoin:round;

  6.    stroke-linecap:round;

  7. }

  8. .star-fill{

  9.    fill: none;

  10.    stroke-width:10;

  11.    stroke:#ff7700;

  12.    stroke-linejoin:round;

  13.    stroke-linecap:round;

  14.    stroke-dasharray:1340;

  15.    stroke-dashoffset:0;

  16.    animation: starFill 2s ease-out infinite;

  17. }

  18. @keyframes starFill {

  19. 0%{

  20.        stroke-dashoffset:1340;

  21. }

  22. 100%{

  23.        stroke-dashoffset:0;

  24. }

  25. }

很多時候我們可以運用這種方法到我們運營活動專案中,stroke-dasharray 和 stroke-dashoffset 是創造大量 SVG 路徑動畫所要用到的兩個重要屬性,掌握原理就可以給各種圖形描邊

另外我們再實現個根據運動路徑運動的小例子,這裡要涉及到svg的 path屬性實現,如下圖:

640?wx_fmt=gif

  1. <svgwidth="500"height="500">

  2. <pathd="M100 150 L200 50 L300 150 L400 50 Z"

  3. stroke="#ccc"stroke-width="2"

  4. fill="none"

  5. />

  6. <circler="20"x="150"y="0"style="fill:#336622;">

  7. <animateMotion

  8. dur="3s"

  9. repeatCount="indefinite"

  10. rotate="auto"

  11. path="M100 150 L200 50 L300 150 L400 50 Z"/>

  12. </circle>

  13. </svg>

path標籤用於指定一條運動路徑,從點(100,150)到(200,50)再到(300,150)再到(400,50)最後再連結起點。 我們用了svg的animateMotion動畫標籤。repeatCount屬性描述動畫的重複次數,indefinite是無限迴圈,dur屬性描述動畫的持續時間,我們這裡讓整個動畫持續3秒。 我們用start和end可以控制整個動畫的開始結束時間,而且如果我們想點選控制運動的開始可以加入begin="click"。

當然我們實現的很簡單的效果,如果涉及到想元素自動根據運動路徑的角度來改變它的運動方向,我們可以使用rotate設定為auto,想讓元素在外圍運動,可以設定rotate="auto-reverse"。

另外,當路徑複雜的時候再用path屬性來描述就顯得很多餘和麻煩,這時候我們可以使用標籤來指定運動路徑:

  1. <svgwidth="500"height="500">

  2. <pathd="M100 150 L200 50 L300 150 L400 50 Z"

  3. stroke="#ccc"stroke-width="2"

  4. fill="none"

  5. id="myPath"

  6. />

  7. <circler="20"x="150"y="0"style="fill:#336622;">

  8. <animateMotion

  9. dur="6s"

  10. begin="click"

  11. repeatCount="indefinite"

  12. rotate="auto">