SVG 影象入門教程

阮一峰發表於2018-08-07

一、概述

SVG 是一種基於 XML 語法的影象格式,全稱是可縮放向量圖(Scalable Vector Graphics)。其他影象格式都是基於畫素處理的,SVG 則是屬於對影象的形狀描述,所以它本質上是文字檔案,體積較小,且不管放大多少倍都不會失真。

SVG 影象入門教程

SVG 檔案可以直接插入網頁,成為 DOM 的一部分,然後用 JavaScript 和 CSS 進行操作。

上面是 SVG 程式碼直接插入網頁的例子。

SVG 程式碼也可以寫在一個獨立檔案中,然後用<img><object><embed><iframe>等標籤插入網頁。

CSS 也可以使用 SVG 檔案。

SVG 檔案還可以轉為 BASE64 編碼,然後作為 Data URI 寫入網頁。

二、語法

2.1<svg>標籤

SVG 程式碼都放在頂層標籤<svg>之中。下面是一個例子。

<svg>的width屬性和height屬性,指定了 SVG 影象在 HTML 元素中所佔據的寬度和高度。除了相對單位,也可以採用絕對單位(單位:畫素)。如果不指定這兩個屬性,SVG 影象預設大小是300畫素(寬) x 150畫素(高)。

如果只想展示 SVG 影象的一部分,就要指定viewBox屬性。

<viewBox>屬性的值有四個數字,分別是左上角的橫座標和縱座標、視口的寬度和高度。上面程式碼中,SVG 影象是100畫素寬 x 100畫素高,viewBox屬性指定視口從(50, 50)這個點開始。所以,實際看到的是右下角的四分之一圓。

注意,視口必須適配所在的空間。上面程式碼中,視口的大小是 50 x 50,由於 SVG 影象的大小是 100 x 100,所以視口會放大去適配 SVG 影象的大小,即放大了四倍。

如果不指定width屬性和height屬性,只指定viewBox屬性,則相當於只給定 SVG 影象的長寬比。這時,SVG 影象的預設大小將等於所在的 HTML 元素的大小。

2.2 <circle>標籤

<circle>標籤代表圓形。

上面的程式碼定義了三個圓。<circle>標籤的cxcyr屬性分別為橫座標、縱座標和半徑,單位為畫素。座標都是相對於<svg>畫布的左上角原點。

class屬性用來指定對應的 CSS 類。

SVG 的 CSS 屬性與網頁元素有所不同。

  • fill:填充色
  • stroke:描邊色
  • stroke-width:邊框寬度

2.3 <line>標籤

<line>標籤用來繪製直線。

上面程式碼中,<line>標籤的x1屬性和y1屬性,表示線段起點的橫座標和縱座標;x2屬性和y2屬性,表示線段終點的橫座標和縱座標;style屬性表示線段的樣式。

2.4 <polyline>標籤

<polyline>標籤用於繪製一根折線。

<polyline>points屬性指定了每個端點的座標,橫座標與縱座標之間與逗號分隔,點與點之間用空格分隔。

2.5 <rect>標籤

<rect>標籤用於繪製矩形。

<rect>x屬性和y屬性,指定了矩形左上角端點的橫座標和縱座標;width屬性和height屬性指定了矩形的寬度和高度(單位畫素)。

2.6 <ellipse>標籤

<ellipse>標籤用於繪製橢圓。

<ellipse>cx屬性和cy屬性,指定了橢圓中心的橫座標和縱座標(單位畫素);rx屬性和ry屬性,指定了橢圓橫向軸和縱向軸的半徑(單位畫素)。

2.7 <polygon>標籤

<polygon>標籤用於繪製多邊形。

<polygon>points屬性指定了每個端點的座標,橫座標與縱座標之間與逗號分隔,點與點之間用空格分隔。

2.8 <path>標籤

<path>標籤用於制路徑。

<path>d屬性表示繪製順序,它的值是一個長字串,每個字母表示一個繪製動作,後面跟著座標。

  • M:移動到(moveto)
  • L:畫直線到(lineto)
  • Z:閉合路徑

2.9 <text>標籤

<text>標籤用於繪製文字。

<text>x屬性和y屬性,表示文字區塊基線(baseline)起點的橫座標和縱座標。文字的樣式可以用classstyle屬性指定。

2.10 <use>標籤

<use>標籤用於複製一個形狀。

<use>href屬性指定所要複製的節點,x屬性和y屬性是<use>左上角的座標。另外,還可以指定widthheight座標。

2.11 <g>標籤

<g>標籤用於將多個形狀組成一個組(group),方便複用。

2.12 <defs>標籤

<defs>標籤用於自定義形狀,它內部的程式碼不會顯示,僅供引用。

2.13 <pattern>標籤

<pattern>標籤用於自定義一個形狀,該形狀可以被引用來平鋪一個區域。

上面程式碼中,<pattern>標籤將一個圓形定義為dots模式。patternUnits="userSpaceOnUse"表示<pattern>的寬度和長度是實際的畫素值。然後,指定這個模式去填充下面的矩形。

2.14 <image>標籤

<image>標籤用於插入圖片檔案。

上面程式碼中,<image>xlink:href屬性表示影象的來源。

2.15 <animate>標籤

<animate>標籤用於產生動畫效果。

上面程式碼中,矩形會不斷移動,產生動畫效果。

<animate>的屬性含義如下。

  • attributeName:發生動畫效果的屬性名。
  • from:單次動畫的初始值。
  • to:單次動畫的結束值。
  • dur:單次動畫的持續時間。
  • repeatCount:動畫的迴圈模式。

可以在多個屬性上面定義動畫。

2.16 <animateTransform>標籤

<animate>標籤對 CSS 的transform屬性不起作用,如果需要變形,就要使用<animateTransform>標籤。

上面程式碼中,<animateTransform>的效果為旋轉(rotate),這時fromto屬性值有三個數字,第一個數字是角度值,第二個值和第三個值是旋轉中心的座標。from="0 200 200"表示開始時,角度為0,圍繞(200, 200)開始旋轉;to="360 400 400"表示結束時,角度為360,圍繞(400, 400)旋轉。

三、JavaScript 操作

3.1 DOM 操作

如果 SVG 程式碼直接寫在 HTML 網頁之中,它就成為網頁 DOM 的一部分,可以直接用 DOM 操作。

上面程式碼插入網頁之後,就可以用 CSS 定製樣式。

然後,可以用 JavaScript 程式碼操作 SVG。

上面程式碼指定,如果點選圖形,就改寫circle元素的r屬性。

3.2 獲取 SVG DOM

使用<object><iframe><embed>標籤插入 SVG 檔案,可以獲取 SVG DOM。

注意,如果使用<img>標籤插入 SVG 檔案,就無法獲取 SVG DOM。

3.3 讀取 SVG 原始碼

由於 SVG 檔案就是一段 XML 文字,因此可以通過讀取 XML 程式碼的方式,讀取 SVG 原始碼。

使用XMLSerializer例項的serializeToString()方法,獲取 SVG 元素的程式碼。

3.4 SVG 影象轉為 Canvas 影象

首先,需要新建一個Image物件,將 SVG 影象指定到該Image物件的src屬性。

然後,當影象載入完成後,再將它繪製到<canvas>元素。

四、例項:折線圖

下面將一張資料表格畫成折線圖。

上面的圖形,可以畫成一個座標系,Date作為橫軸,Amount作為縱軸,四行資料畫成一個資料點。

五、參考連結

(完)