簡單聊一聊那些svg的沿路徑運動
之前遇見動畫就很想用css實現,顯然有些效果是我們力所不能及,實現起來麻煩,效果不好,讓人捉急。其實歸結起來,不同的動畫有自己的優勢,根據實際情況進行取捨。本文就告訴大家如何用SVG寫出個簡單動畫。就讓我們以路徑動畫為例來說明吧。
類似於下面動畫,這種之前就覺得好炫酷
好吧,就算不說這個,沒學習之前,svg實現的loading我也不知道怎麼搞得。
當然SVG肯定不是隻是來做這個的啦,這只是人家神奇的一部分。SVG的優勢是 跨裝置能力強、體積小、影象可透明,可以與js互動等等等等,在這裡不一一介紹啦。我們直接從小例子開始,動手實現個按路徑運動的動畫。
首先讓我們來實現一個描繪圖形邊框的小例子,如下圖:
要描繪如上圖的五角星圖形,我們首先應該確定各個角的座標,然後將它們連線起來就好了。說起來簡單,做起來其實更簡單,簡單程式碼實現如下:
<svgversion="1.1"
xmlns="http://www.w3.org/2000/svg"width="500"height="500"viewbox="-500 -500 2500 2500">
<polygonpoints="-12 -69,-58 85,64 -14,-81 -14,41 85"class="star-path"></polygon>
<polygonpoints="-12 -69,-58 85,64 -14,-81 -14,41 85"class="star-fill"></polygon>
</svg>
在以上的程式碼中,polygon 標籤是svg多邊形標籤,points 屬性定義多邊形每個角的 x 和 y 座標。通過class為star-path的標籤來實現我們圖中的灰色軌跡,通過class為star-fill的標籤來實現描繪的動畫。
上邊我們實現了五角星的圖形,下面我們就結合css,來完成這個完整的描繪動畫:
.star-path{
fill: none;
stroke-width:10;
stroke:#d3dce6;
stroke-linejoin:round;
stroke-linecap:round;
}
.star-fill{
fill: none;
stroke-width:10;
stroke:#ff7700;
stroke-linejoin:round;
stroke-linecap:round;
stroke-dasharray:782;
stroke
animation: starFill 2s ease-out infinite;
}
@keyframes starFill {
0%{
stroke-dashoffset:782;
}
100%{
stroke-dashoffset:0;
}
}
在上面的程式碼中,最核心的屬性就是 stroke-dasharray和stroke-dashoffset 。 stroke-dasharray:定義描邊的虛線長度,如果提供奇數個,則會自動複製該值成偶數。 stroke-dashoffset:定義虛線描邊的偏移量。 在上面程式碼中,stroke-dasharray代表虛線之間的間距大小。當我們設定了間距足夠長的時候,以至於大於我們圖形的總邊長,就會達到我們想要的效果。一開始我們的短劃線是0,缺口是全部長度,隨動畫的進行,短劃線的長度慢慢增長為圖形總邊長的全部長度,達到了慢慢充滿全部的效果。另外,我們要知道路徑長度也可以藉助 如下程式碼path.getTotalLength() 函式獲取路徑的長度。
document.querySelector('.star-path').getTotalLength();
除此之外,我們還可以改變偏移 stroke-dashoffset 來達到效果,將虛線的偏移量設定為 0,此時我們看到的路徑描邊就是沒有間斷的連續曲線,通過設定虛線偏移量等於曲線的長度,那該曲線恰好“消失”,程式碼如下:
.star-path{
fill: none;
stroke-width:10;
stroke:#d3dce6;
stroke-linejoin:round;
stroke-linecap:round;
}
.star-fill{
fill: none;
stroke-width:10;
stroke:#ff7700;
stroke-linejoin:round;
stroke-linecap:round;
stroke-dasharray:1340;
stroke-dashoffset:0;
animation: starFill 2s ease-out infinite;
}
@keyframes starFill {
0%{
stroke-dashoffset:1340;
}
100%{
stroke-dashoffset:0;
}
}
很多時候我們可以運用這種方法到我們運營活動專案中,stroke-dasharray 和 stroke-dashoffset 是創造大量 SVG 路徑動畫所要用到的兩個重要屬性,掌握原理就可以給各種圖形描邊
另外我們再實現個根據運動路徑運動的小例子,這裡要涉及到svg的 path屬性實現,如下圖:
<svgwidth="500"height="500">
<pathd="M100 150 L200 50 L300 150 L400 50 Z"
stroke="#ccc"stroke-width="2"
fill="none"
/>
<circler="20"x="150"y="0"style="fill:#336622;">
<animateMotion
dur="3s"
repeatCount="indefinite"
rotate="auto"
path="M100 150 L200 50 L300 150 L400 50 Z"/>
</circle>
</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屬性來描述就顯得很多餘和麻煩,這時候我們可以使用標籤來指定運動路徑:
<svgwidth="500"height="500">
<pathd="M100 150 L200 50 L300 150 L400 50 Z"
stroke="#ccc"stroke-width="2"
fill="none"
id="myPath"
/>
<circler="20"x="150"y="0"style="fill:#336622;">
<animateMotion
dur="6s"
begin="click"
repeatCount="indefinite"
rotate="auto">