如何用SVG製作酷炫動態表徵圖?(代碼執行個體)

來源:互聯網
上載者:User
本章給大家介紹在html5中如何用SVG製作酷炫動態表徵圖?(代碼執行個體),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。

一、基本圖形元素

  svg有一些預定義的形狀元素:矩形<rect>,圓形<circle>,橢圓<ellipse>,直線<line>,折線<polyline>,多邊形<polygon>,路徑<path>和文本<text>。

<!-- viewBox定義畫布大小 width/height定義實際大小 --><svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300" height="300" viewBox="0 0 300 300">    <!-- 直線 (x1,y1)與(x2,y2)為兩點座標 -->    <line x1="0" y1="0" x2="250" y2="30" />    <!-- 多邊形 通過多個點的座標形成封閉圖形 -->    <polygon points="5,5 100,100 50,200" />    <!-- 矩形 (x,y)為左上方起始點 -->    <rect x="100" y="100" width="120" height="100" />    <!-- 圓形 (cx,cy)圓心點 r半徑 -->    <circle cx="100" cy="50" r="40" stroke="black"/>    <!-- 文本 (x,y)左下角座標  -->    <text x="0" y="20" style="font-size:16px;font-weight: bold">Try SVG</text></svg>

二、樣式與效果

svg元素的樣式可以寫成標籤的屬性,也可以寫在style裡面。下面是一些主要的樣式屬性:

stroke: 筆觸顏色
stroke-width:筆觸寬度
stroke-opacity:筆觸的透明度
fill:填充色,即background
fill-opacity:填充色的透明度
transform:圖形變換,類似css3 transform

svg還支援很多濾鏡效果,能做漸層、陰影、模糊、映像混合等等。不需要瞭解那麼多,例如要畫幾個彩色圓圈,用circle 配合fill 即可。

注意:transform 預設以svg左上方為基點,而不是圓心或其他中心。左上方是svg座標系原點。瞭解transform和座標系統,可以參考 這裡。

三、輔助元素

svg有幾個輔助元素:<g> <defs> <symbol> <use>。它們不代表具體形狀,而是協助進行圖形元素的分組管理、重複使用等。具體介紹可以參考 這裡。

<g> 元素通常用來對相關圖形元素進行分組,以便統一操作,比如旋轉,縮放或者添加相關樣式等。
<use> 實現SVG現有圖形的重用,可以重用單個SVG圖形元素,也可以重用<g><defs>定義的組元素。
<defs> 內部定義的元素不會直接顯示,可以不用事先定義樣式,而是在使用<use>執行個體化的時候再定義。
<symbol> 能夠建立自己的視窗,兼具<g>的分組功能和<defs>初始不可見的特性。

對於上面提到的transform基點問題,可以通過嵌套<g>標籤並位移<g>的位置,進而重設基點。如下畫出幾個水平排列的圓圈,並設定不同的縮放尺寸

<svg width="80px" height="80px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">    <g transform="translate(20 50)">        <circle cx="0" cy="0" r="7" fill="#e15b64" transform="scale(0.99275 0.99275)" />    </g>    <g transform="translate(40 50)">        <circle cx="0" cy="0" r="7" fill="#f47e60" transform="scale(0.773605 0.773605)" />    </g>    <g transform="translate(60 50)">        <circle cx="0" cy="0" r="7" fill="#f8b26a" transform="scale(0.42525 0.42525)" />    </g>    <g transform="translate(80 50)">        <circle cx="0" cy="0" r="7" fill="#abbd81" transform="scale(0.113418 0.113418)" />    </g></svg>

四、動畫的實現

svg的動畫效果是基於動畫標籤元素實現的:

  <animate>實現單屬性的過渡效果;
 <animateTransform>實現transform變換動畫效果;
 <animateMotion>實現路徑動畫效果。

svg的寫法很靈活,樣式可以寫成標籤屬性也可以寫在style裡面,動畫標籤可以通過xlink指定元素,也可以寫在動畫元素的內部。如下示範animateTransform的xlink寫法:

<svg xmlns="http://www.w3.org/2000/svg">    <rect id="animateObject" x="20" y="20" width="50" height="50" fill="blue"></rect>    <animateTransform        xlink:href="#animateObject" <!-- 指定動畫元素 -->        attributeName="transform"  <!-- 需要動畫的屬性名稱 -->        type="scale"  <!-- 指定transform屬性 -->        begin="0s"    <!-- 開始時間,即延遲 -->        dur="3s"      <!-- 動畫時間 -->        from="1"      <!-- 開始值 -->        to="2"        <!-- 結束值 -->        repeatCount="indefinite"   <!-- 重複方式,indefinite無限重複  -->    /></svg>

上例的動畫是A到B的過渡,要形成順暢的迴圈,至少要定義三個關鍵點。animateTransform支援更多更靈活的屬性設定:

values:多個關鍵點的值,替代from和to,例如 values="0;1;0"

keyTimes:跟values對應,各個點的時間點

calcMode:動畫快慢方式。discrete | linear | paced | spline

keySplines:設定運動的貝塞爾控制點,calcMode為spline時有效

五、代碼執行個體

circle畫圓,fill著色,用g標籤包裹並定位,transform設定初始形變,animateTransform設定動畫。現在來看代碼,相信不會再是一頭霧水了:

<svg class="lds-message" width="80px" height="80px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">    <g transform="translate(20 50)">        <circle cx="0" cy="0" r="7" fill="#e15b64" transform="scale(0.99275 0.99275)">            <animateTransform attributeName="transform" type="scale" begin="-0.375s" calcMode="spline" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" values="0;1;0" keyTimes="0;0.5;1" dur="1s" repeatCount="indefinite"></animateTransform>        </circle>    </g>    <g transform="translate(40 50)">        <circle cx="0" cy="0" r="7" fill="#f47e60" transform="scale(0.773605 0.773605)">            <animateTransform attributeName="transform" type="scale" begin="-0.25s" calcMode="spline" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" values="0;1;0" keyTimes="0;0.5;1" dur="1s" repeatCount="indefinite"></animateTransform>        </circle>    </g>    <g transform="translate(60 50)">        <circle cx="0" cy="0" r="7" fill="#f8b26a" transform="scale(0.42525 0.42525)">            <animateTransform attributeName="transform" type="scale" begin="-0.125s" calcMode="spline" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" values="0;1;0" keyTimes="0;0.5;1" dur="1s" repeatCount="indefinite"></animateTransform>        </circle>    </g>    <g transform="translate(80 50)">        <circle cx="0" cy="0" r="7" fill="#abbd81" transform="scale(0.113418 0.113418)">            <animateTransform attributeName="transform" type="scale" begin="0s" calcMode="spline" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" values="0;1;0" keyTimes="0;0.5;1" dur="1s" repeatCount="indefinite"></animateTransform>        </circle>    </g></svg>

也可以用js控制svg的屬性,控制svg的動畫過程,做成能響應點擊等事件的表徵圖按鈕。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.