您好,登錄后才能下訂單哦!
小編給大家分享一下SVG動(dòng)態(tài)圖標(biāo)是怎么實(shí)現(xiàn)的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在 loading.io 上能看到好多效果驚艷的loading圖標(biāo)。它們都是用svg寫成的,寥寥幾行代碼,比img圖片更精細(xì)更節(jié)省體積,比純dom實(shí)現(xiàn)要更靈活和高效。另外還可以讓圖標(biāo)響應(yīng)點(diǎn)擊事件 。
怎么畫這些圓和方塊?怎么著色?怎么動(dòng)起來? 先看看svg的基礎(chǔ)知識(shí),然后將上面第一個(gè)圖標(biāo)畫出來。
svg有一些預(yù)定義的形狀元素:矩形<rect>,圓形<circle>,橢圓<ellipse>,直線<line>,折線<polyline>,多邊形<polygon>,路徑<path>和文本<text>。
1 <!-- viewBox定義畫布大小 width/height定義實(shí)際大小 --> 2 <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300" height="300" viewBox="0 0 300 300"> 3 4 <!-- 直線 (x1,y1)與(x2,y2)為兩點(diǎn)坐標(biāo) --> 5 <line x1="0" y1="0" x2="250" y2="30" /> 6 7 <!-- 多邊形 通過多個(gè)點(diǎn)的坐標(biāo)形成封閉圖形 --> 8 <polygon points="5,5 100,100 50,200" /> 9 10 <!-- 矩形 (x,y)為左上角起始點(diǎn) --> 11 <rect x="100" y="100" width="120" height="100" /> 12 13 <!-- 圓形 (cx,cy)圓心點(diǎn) r半徑 --> 14 <circle cx="100" cy="50" r="40" stroke="black"/> 15 16 <!-- 文本 (x,y)左下角坐標(biāo) --> 17 <text x="0" y="20" style="font-size:16px;font-weight: bold">Try SVG</text>18 19 </svg>
svg元素的樣式可以寫成標(biāo)簽的屬性,也可以寫在style里面。下面是一些主要的樣式屬性:
stroke: 筆觸顏色
stroke-width:筆觸寬度
stroke-opacity:筆觸的透明度
fill:填充色,即background
fill-opacity:填充色的透明度
transform:圖形變換,類似css3 transform
svg還支持很多濾鏡效果,能做漸變、陰影、模糊、圖像混合等等。不需要了解那么多,例如要畫幾個(gè)彩色圓圈,用circle 配合fill 即可。
注意:transform 默認(rèn)以svg左上角為基點(diǎn),而不是圓心或其他中心。左上角是svg坐標(biāo)系原點(diǎn)。了解transform和坐標(biāo)系統(tǒng),可以參考 這里。
svg有幾個(gè)輔助元素:<g> <defs> <symbol> <use>。它們不代表具體形狀,而是幫助進(jìn)行圖形元素的分組管理、重復(fù)使用等。具體介紹可以參考 這里。
<g> 元素通常用來對(duì)相關(guān)圖形元素進(jìn)行分組,以便統(tǒng)一操作,比如旋轉(zhuǎn),縮放或者添加相關(guān)樣式等。
<use> 實(shí)現(xiàn)SVG現(xiàn)有圖形的重用,可以重用單個(gè)SVG圖形元素,也可以重用<g><defs>定義的組元素。
<defs> 內(nèi)部定義的元素不會(huì)直接顯示,可以不用事先定義樣式,而是在使用<use>實(shí)例化的時(shí)候再定義。
<symbol> 能夠創(chuàng)建自己的視窗,兼具<g>的分組功能和<defs>初始不可見的特性。
對(duì)于上面提到的transform基點(diǎn)問題,可以通過嵌套<g>標(biāo)簽并偏移<g>的位置,進(jìn)而重設(shè)基點(diǎn)。如下畫出幾個(gè)水平排列的圓圈,并設(shè)置不同的縮放尺寸,得到
1 <svg width="80px" height="80px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"> 2 <g transform="translate(20 50)"> 3 <circle cx="0" cy="0" r="7" fill="#e15b64" transform="scale(0.99275 0.99275)" /> 4 </g> 5 <g transform="translate(40 50)"> 6 <circle cx="0" cy="0" r="7" fill="#f47e60" transform="scale(0.773605 0.773605)" /> 7 </g> 8 <g transform="translate(60 50)"> 9 <circle cx="0" cy="0" r="7" fill="#f8b26a" transform="scale(0.42525 0.42525)" /> 10 </g> 11 <g transform="translate(80 50)"> 12 <circle cx="0" cy="0" r="7" fill="#abbd81" transform="scale(0.113418 0.113418)" /> 13 </g> 14 </svg>
svg的動(dòng)畫效果是基于動(dòng)畫標(biāo)簽元素實(shí)現(xiàn)的:
<animate>實(shí)現(xiàn)單屬性的過渡效果,
<animateTransform>實(shí)現(xiàn)transform變換動(dòng)畫效果,
<animateMotion>實(shí)現(xiàn)路徑動(dòng)畫效果。
svg的寫法很靈活,樣式可以寫成標(biāo)簽屬性也可以寫在style里面,動(dòng)畫標(biāo)簽可以通過xlink指定元素,也可以寫在動(dòng)畫元素的內(nèi)部。如下演示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" <!-- 指定動(dòng)畫元素 --> attributeName="transform" <!-- 需要?jiǎng)赢嫷膶傩悦Q --> type="scale" <!-- 指定transform屬性 --> begin="0s" <!-- 開始時(shí)間,即延遲 --> dur="3s" <!-- 動(dòng)畫時(shí)間 --> from="1" <!-- 開始值 --> to="2" <!-- 結(jié)束值 --> repeatCount="indefinite" <!-- 重復(fù)方式,indefinite無限重復(fù) --> /> </svg>
上例的動(dòng)畫是A到B的過渡,要形成順暢的循環(huán),至少要定義三個(gè)關(guān)鍵點(diǎn)。animateTransform支持更多更靈活的屬性設(shè)置:
values:多個(gè)關(guān)鍵點(diǎn)的值,替代from和to,例如 values="0;1;0"
keyTimes:跟values對(duì)應(yīng),各個(gè)點(diǎn)的時(shí)間點(diǎn)
calcMode:動(dòng)畫快慢方式。discrete
| linear
| paced
| spline
keySplines:設(shè)置運(yùn)動(dòng)的貝塞爾控制點(diǎn),calcMode為spline時(shí)有效
對(duì)svg動(dòng)畫的更詳細(xì)介紹,參考 這里 。
五、代碼實(shí)例
circle畫圓,fill著色,用g標(biāo)簽包裹并定位,transform設(shè)置初始形變,animateTransform設(shè)置動(dòng)畫?,F(xiàn)在來看代碼,相信不會(huì)再是一頭霧水了:
<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>
以上是SVG動(dòng)態(tài)圖標(biāo)是怎么實(shí)現(xiàn)的的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。