1. 程式人生 > >SVG學習之stroke-dasharray 和 stroke-dashoffset 詳解

SVG學習之stroke-dasharray 和 stroke-dashoffset 詳解

本文適合對SVG已經有所瞭解,但是對stoke-dasharray和stroke-dashoffset用法有疑問的童鞋

 

第一:概念解釋

1. stroke意思是:畫短線於,在...上劃線

2. stroke-dasharray:用於建立虛線,之所以後面跟的是array的,是因為值其實是陣列。請看下面解釋

stroke-dasharray = '10'
stroke-dasharray = '10, 5'
stroke-dasharray = '20, 10, 5'

 

stroke-dasharray為一個引數時: 其實是表示虛線長度和每段虛線之間的間距

  如:stroke-dasharray = '10' 表示:虛線長10,間距10,然後重複 虛線長10,間距10

兩個引數或者多個引數時:一個表示長度,一個表示間距
  如:stroke-dasharray = '10, 5' 表示:虛線長10,間距5,然後重複 虛線長10,間距5
  如:stroke-dasharray = '20, 10, 5' 表示:虛線長20,間距10,虛線長5,接著是間距20,虛線10,間距5,之後開始如此迴圈

 

3. stroke-dashoffset: offset:偏移的意思。
這個屬性是相對於起始點的偏移,正數偏移x值的時候,相當於往左移動了x個長度單位,負數偏移x的時候,相當於往右移動了x個長度單位。
需要注意的是,不管偏移的方向是哪邊,要記得dasharray 是迴圈的,也就是 虛線-間隔-虛線-間隔。

這個屬性要搭配stroke-dashoffset才能看得出來效果,非虛線的話,是無法看出偏移的。


概念有點抽象,來看一個MDN的例子,圖中紅線段是偏移的距離

 

上圖效果分別是:
1.沒有虛線
2.stroke-dasharray="3 1" ,虛線沒有設定偏移,也就是stroke-dashoffset值為0
3.stroke-dashoffset="3",偏移正數,虛線整體左移了3個單位,圖中3後面的紅線段,就是起始線段,線段之後是1個單位的間隔,我們可見區域從這個間隔開始,然後迴圈 3-1,3-1的虛線-間隔-虛線-間隔
4.stroke-dashoffset="-3",偏移負數,虛線整體右移動了3個單位,由於dasharray 是迴圈的,前面偏移的位置會有dasharray 填充上

5.stroke-dashoffset="1",偏移正數,虛線整體左移了1個單位,最終呈現出來的效果跟 線段4 一樣

 

2.示例

利用這兩個屬性,我們可以做出好看的動畫效果

 

線段從無到有,由短變長


實現思路就是:
第一步:設定stroke-dasharray虛線長度等於當前svg的寬度,間隔大於或者等於svg寬度

<svg >
  <line id="line" x1="30" y1="30" x2="300" y2="30" stroke-width="20" stroke="red" stroke-dasharray="300,320"/>
</svg>


這時候的效果是這樣的,可視區域內只能看到一段虛線

 

第二步:設定stroke左移 300單位(stroke-dashoffset:300),也就是剛好隱藏了虛線,可視區域內變成了320單位的間隔,

 

第三步:當滑鼠移入的時候,使offset由300變成0,就實現了動圖中的效果

svg:hover #line{
    stroke-dashoffset: 0;
}
#line{
    transition: all 2s;
}

 


圓形環繞一圈效果

滑鼠hover的時候,外層線段繞自身一圈。這個動畫的實現原理,跟上面的是一毛一樣的
設定stroke-dasharray虛線長度等於當前圓的周長,間隔大於或者等於圓的周長



第一步:先畫出一個圓圈:程式碼如下,圓的半徑設定為50

<svg  width="200" height="200" viewBox="0 0 200 200">
   <circle id="circle" cx="100" cy="80" r="50"  fill="gray" stroke-width="5" stroke="green" />
</svg>


第二步:設定圓的stroke-dasharray和stroke-dashoffset,為圓的周長

#circle{
     transition: all 2s;
     stroke-dasharray:314,314;
     stroke-dashoffset:314;
 }

 

第三步:hover的時候,設定stroke-dashoffset為0,注意圓的stroke起始位置為右側中間

svg:hover #circle{
    stroke-dashoffset:0;
}

圓形環繞的效果就做好了~

 

碼字不易,覺得有幫助,不妨點個贊哦~

原創文章,轉載請加原文連結:https://www.cnblogs.com/daisygogogo/p/11044353.html

程式碼在github倉庫:

https://github.com/daisygogogo/my-demo/blob/master/svg-line-circle.