SVG 之 path

可縮放矢量圖形SVG是基於可擴展標記語言……吧啦吧啦(百度百科上的定義嗯)

最近剛剛忙完我們隊的一個項目的網站,裏面雖然主要用的不是svg,只是很小的一個效果用到了,但是用的時候查閱一下資料啥的感覺像是打開了新世界的大門(可能是太菜的緣故之前都沒怎麼用過svg)

所以想總結一下關於svg裏面的path以及animate用法以及自己的體會

例子

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <path d="M150 0 L75 200 L225 200 Z" />
</svg>

這裏寫圖片描述

這裏svg就是一個類似於畫布的東西,path中最核心的屬性就是 “d” 屬性,這個屬性就像一個虛擬的畫筆,根據屬性值來繪製圖形,上面例子詳情:先將畫筆移動到svg畫布的(150,0)位置,然後畫直線(L代表LineTo)到終點(75,200),再畫直線到(225,200)。

d屬性預覽表

畫筆操作 參數 例子 解釋
M x,y M150 40 畫筆移動到畫布上一點,位置由M後面的兩個數值決定 M150 40 移動到座標(150,40)
L x,y L250 0 畫直線到畫布上某一點,直線終點位置由L後面的兩個數值決定L250 0 畫直線到點(250,0)
H x H50 畫水平直線,H50 縱座標不變,從當前座標畫水平線到橫座標爲50處
V y V200 畫豎直直線,V50 橫座標不變,從當前座標畫豎直線到縱座標爲50處
C x1,y1,x2,y2,x,y 三次貝塞爾曲線(三次需要兩個控制點(x1 y1 x2 y2)和一個曲線終點(x y))
S x2,y2,x,y 光滑的三次貝塞爾曲線
Q x1,y1,x,y 二次貝塞爾曲線(二次需要一個控制點和一個曲線終點)
T x,y 光滑的二次貝塞爾曲線
A rx,ry,x-rotation,flag1,flag2,x2,y2 橢圓曲線,rx,ry代表橢圓的兩個半軸長,如果想要畫圓就將這兩個參數設置相等(居然還能記得專業名詞不容易2333)
x-rotation代表弧線繞x軸的旋轉角度
flag1表示從起始點到終點是畫大角度弧,還是小角度(1爲大角度,0爲小角度)
flag2表示畫弧的方向是順時針還是逆時針(1爲順時針,0爲逆時針)
x2,y2表示弧線的終點
表格後面會給出例子
Z 無參數 結束次路徑的繪製

注:小寫字符的指令參數和大寫字母是一樣的,只是後面的參數不是畫布上的絕對座標,而是相對於畫筆當前的位置在x和y軸上移動的距離

橢圓例子

<svg xmlns="http://www.w3.org/2000/svg">
  <path d="M60,60  A30,30 0 0,0 85,85"
      style="stroke: yellow; stroke-width:2; fill:none;"/>
  <path d="M60,60  A30,30 0 1,0 85,85"
      style="stroke: red; stroke-width:2; fill:none;"/>
  <path d="M60,60  A30,30 0 1,1 85,85"
      style="stroke: green; stroke-width:2; fill:none;"/>
  <path d="M60,60  A30,30 0 0,1 85,85"
      style="stroke: blue; stroke-width:2; fill:none;"/>
</svg>

這裏寫圖片描述

首先圓上兩點確定,半徑確定,能且只能確定兩個圓,再由兩點連線分隔就是四個圓弧,上面代碼一共四條路徑,也是四條弧線,首先因爲rx和ry都是一樣的,所以是正圓弧,x-rotation都是0,主要在於flag1和flag2取不同值的效果,都是從點(60,60)到(85,85)的圓弧,
- 第一個path黃色的小圓弧,flag1=0,flag2=0,小角度弧,逆時針
- 第二個path紅色的小圓弧,flag1=1,flag2=0,大角度弧,逆時針
- 第三個path綠色的小圓弧,flag1=1,flag2=1,大角度弧,順時針
- 第四個path藍色的小圓弧,flag1=0,flag2=1,小角度弧,順時針

貝塞爾曲線

這裏寫圖片描述
比較懶,這是百度百科上面的關於貝塞爾曲線的公式講解,咱就只看到三次的好了,通用的太複雜嗯

每個公式裏面的P0、P1、P2這些都是對應上面提到的path的d屬性中的n次貝塞爾曲線變換(C,S,Q,T)的參數裏面的x1,y1,x2,y2,x,y以及畫貝塞爾曲線之前畫筆所在的位置(即貝塞爾曲線起始位置),每個點的橫座標代入求出點B的橫座標(縱座標同理)
咳咳,不過,不管作爲一個設計還是前端,估計都很難直接用公式來看曲線樣式嗯,所以上面這公式都不重要
下面主要總結一下path d屬性中的C,S,Q,T幾種貝塞爾曲線

C,S 三次貝塞爾曲線

這裏寫圖片描述

圖上的(x1,y1),(x2,y2),(x,y) 就是對應與C(Cx1 y1 x2 y2 x y)裏面的參數一一對應,(x0,y0)是執行C指令之前畫筆的位置

S也是三次貝塞爾曲線,但是其參數比C少了一個點,這是因爲,S必須在C指令後面使用,C畫了(x0,y0)到到(x1,y1)的部分,S會自動把C的(x2,y2)關於(x,y)做中心對稱,對稱點就是上圖右下角的那個點,該點作爲S的(x1,y1),所以後面S的參數只需要指明x2 y2 x y就可以了(接着上面的C的效果畫的S的效果見下圖)

這裏寫圖片描述

Q,T 二次貝塞爾曲線

這裏寫圖片描述

二次貝塞爾曲線Q T 其實看起來就相當於把三次貝塞爾曲線的兩個控制點合二爲一
圖上的(x1,y1),(x,y) 就是與Q(Qx1 y1 x y)裏面的參數一一對應

T也是二次貝塞爾曲線,但是其參數比Q少了一個點,這是因爲,T必須在Q指令後面使用,T會自動把Q的(x1,y1)關於(x,y)做中心對稱,對稱點就是上圖右下角的那個點,該點作爲T的(x1,y1),所以後面T的參數只需要指明x y就可以了(接着上面的Q的效果畫的T的效果見下圖)

這裏寫圖片描述

animate標籤

animate 標籤包裹在path line text 等可以進行動畫的元素內部,通過改變外部包裹元素的某些屬性來產生動畫

<svg width="400" height="200" xmlns="http://www.w3.org/2000/svg">
  <g> 
    <text font-size="30" y="60" x="0">
    這個會左右移動嗯
      <animate attributeName="x" from="0" to="60" begin="0s" dur="3s" repeatCount="indefinite" />
    </text>
  </g>
</svg>

上面這個例子是“這個會左右移動嗯”這幾個字的橫座標從0變爲60的動畫,歷時3秒,並且會一直不斷重複。

animate標籤的屬性

  1. attributeName
    指定了animate修改的是動畫元素的哪個屬性,上面例子中就是指定改變text 的x屬性即橫座標
  2. from
    指定屬性變化的初始值,例如例子中橫座標初始值是0,也就是從0開始變化
  3. to
    指定屬性變化的終止值,例子中橫座標變化到最大值爲60
  4. begin
    指定動畫開始時間,即從svg加載完成開始算
  5. dur
    動畫執行過程需要的時間,也決定了動畫的快慢
  6. end
    動畫結束的時刻
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章