【前端可視化】SVG 學習知識點

基本概念和語法

SVG 的定義和歷史

SVG 是可縮放矢量圖形(Scalable Vector Graphics)的縮寫,它是一種用於描述二維矢量圖形的 XML 標記語言。與傳統的柵格圖像不同,SVG 圖像可以無限縮放而不會失真,同時也支持交互和動畫等特性。

SVG 最早於 1999 年由 W3C 發佈,用於在 Web 上展示矢量圖形,並於 2001 年正式成爲標準。在過去的二十多年中,SVG 經歷了多次更新和改進,增加了更多的功能和特性,如動畫、交互等,並逐漸得到廣泛的應用。

SVG 2.0 於 2016 年 9 月 15 日成爲 W3C 候選推薦標準,最新草案於 2020 年 5 月 26 日發佈。

SVG 的優點和缺點

SVG 的優點包括:

  1. 矢量圖形縮放不會失真(像素點數量不變而導致圖像出現模糊、鋸齒等),而光柵圖形(PNG、JPG)縮放會導致失真。
    • 矢量圖形:基於矢量的點、線、形狀和數學公式來構建的圖形,該圖形是沒有像素的,放大縮小是不會失真的。
    • 光柵圖形:由像素點構建的圖像——微小的彩色方塊,大量像素點可以形成高清圖像,比如照片。圖像像素越多,質量越高。
  2. 其他優點:靈活(JS 和 CSS 操作);支持動畫;輕量(尺寸小);可打印(不會失真);利於 SEO(會被搜索引擎索引);可壓縮;易於編輯等。

SVG 的缺點包括:

  1. 不適和高清圖片製作(非像素級渲染);
  2. SVG 圖像變得複雜時,加載會比較慢;
  3. 存在部分瀏覽器兼容問題。

SVG 的應用場景

  • SVG 非常適合顯示矢量徽標(Logo)、圖標(ICON)和其他幾何設計。
  • SVG 適合應用在需適配多種尺寸的屏幕上展示,因爲SVG的擴展性更好。
  • 當需要創建簡單的動畫時,SVG 是一種理想的格式。
    • SVG 可以與 JS 交互來製作線條動畫、過渡和其他複雜的動畫。
    • SVG 可以與 CSS 動畫交互,也可以使用自己內置的 SMIL 動畫。
  • SVG 也非常適合製作各種圖表(條形圖、折線圖、餅圖、散點圖等等),以及大屏可視化頁面開發。

SVG 的文件結構和語法規則

SVG 的文件結構和語法規則包括以下幾點:

  1. 文件格式:SVG 文件是一種基於 XML 語法的文本文件,以 .svg 或 .svgz 爲後綴名。其中,.svg 是未壓縮的文本格式,而 .svgz 是經過壓縮的二進制格式。
  2. XML聲明:SVG文件必須以XML聲明開始,指定XML版本和字符集。例如:
<?xml version="1.0" encoding="UTF-8"?>
  1. 命名空間:SVG使用命名空間來區分不同元素和屬性的定義和作用(現代瀏覽器會默認添加)。SVG 默認命名空間爲 "http://www.w3.org/2000/svg" ,可以通過 xmlns 屬性來指定和擴展其他命名空間。例如:
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  1. 根元素 SVG 文件必須包含一個根元素 <svg>,表示圖形容器的大小和屬性。其中,width 和 height 屬性指定畫布的寬度和高度,viewBox 屬性指定可視範圍的位置和大小。
  2. 元素和屬性 SVG 文件中包含多個元素和屬性,用於描述和繪製圖形。常見的元素包括 <rect>、<circle>、<line>、<path> 等,常見的屬性包括 fill、stroke、stroke-width、transform 等。
  3. 嵌套和順序 SVG 元素可以嵌套在其他元素中,形成複雜的圖形結構。元素的順序和層次決定了它們的顯示順序和遮擋關係。

圖形繪製基礎

SVG 座標系和單位

SVG 使用的座標系統(網格系統)和 Canvas 的差不多(笛卡爾座標系)。座標系是以左上角爲 (0,0) 座標原點,座標以像素爲單位,x 軸正方向是向右,y 軸正方向是向下。

SVG 座標系統,在沒有明確指定單位時,默認以像素爲單位,我們也可以手動指明座標系的單位。

SVG 座標系分爲視口座標系和用戶座標系:

視口座標系(視口-viewport):視口座標系是在視口上建立的座標系,原點在視口左上角的點(0, 0),x軸正向向右,y軸正向下。

用戶座標系(視圖框-viewBox):用戶座標系是建立在 SVG 視口上的座標系。該座標系最初與視口座標系相同——它的原點位於視口的左上角。使用 viewBox 屬性,可以修改初始用戶座標系,使其不再與視口座標系相同。

SVG 常見形狀和元素

常見的 SVG 形狀包括:矩形(rect)、圓形(circle)、橢圓形(ellipse)、線段(line)、折線(polyline)、多邊形(polygon)

常見的 SVG 元素還包括:

  • path:路徑
  • image:圖片
  • text、tspan:文字
  • g 、defs、use、symbols:圖形組合和複用

SVG 路徑和路徑命令

在 SVG 中,可以使用路徑 <path> 來描述複雜的圖形。路徑由一系列的路徑命令組成,常用的路徑命令包括:M(移動到)、L(畫直線)、Z(關閉路徑)、H(水平線)、V(垂直線)、C(貝塞爾曲線)等。

SVG 填充和描邊效果

使用屬性 fill(填充) 和 stroke(描邊),其中描邊屬性中 stroke-dasharray(將虛線類型應用在邊框上)和 stroke-dashoffset(指定在dasharray模式下路徑的偏移量)是 SVG 路徑動畫的應用原理。

填充和描邊也能使用 css 來進行控制,其 css 樣式優先級爲:

內聯的 style > defs 中的 style > 外部 / head 內部 > 屬性 fill

SVG 漸變和濾鏡效果

SVG 漸變有兩種類型:線性漸變和徑向漸變

線性漸變使用 linearGradient 和 stop 元素,例如:

<linearGradient id="gradient1">
  <stop offset="0%" stop-color="red"></stop>
  <stop offset="50%" stop-color="green"></stop>
  <stop offset="100%" stop-color="blue"></stop>
</linearGradient>

濾鏡效果通過在 defs 中定義,比如定義一個高斯模糊效果:

   <defs>
	<!-- 高斯模糊效果 -->
	<filter id="blurFilter">
	  <feGaussianBlur stdDeviation="8"></feGaussianBlur>
	</filter>
  </defs>

SVG 的形變操作

SVG 的形變支持平移(translate)、旋轉(rotate)等,注意:形變會修改座標系,SVG 渲染是先形變修改了座標系後,根據新座標系再設置元素 xy 座標。

SVG 的描邊動畫

原理爲 stroke-dasharray(描邊虛線) 和 stroke-dashoffset(虛線偏移量) 屬性的設置。將描邊設置爲虛線,接着將描邊偏移到不可見處,通過動畫讓描邊慢慢變爲可見,這樣就產生了動畫效果了。例如:

#line {
/* 指定爲虛線,300px大於或等於路徑長度,虛線和偏移量大小會影響動畫速度*/
	stroke-dasharray: 300px;
	/* 可見 */
	stroke-dashoffset: 300px;
	animation: line1Move 2s linear forwards;
}
@keyframes line1Move {
	100% {
	/* 可見 */
	stroke-dashoffset: 0px;
	}
}

支持 stroke 屬性的元素都能實現該動畫,比如:path、ellipse、polyline 等。

動畫和交互

SVG 動畫的實現方式

  1. 用 JS 腳本實現:通過各種處理 SVG 的 JavaScript 庫實現動畫和交互效果。

  2. 用 CSS 樣式實現:主要是使用 CSS3 的動畫屬性。

  3. 用 SMIL 實現:一種基於 SMIL 語言實現的 SVG 動畫。

SMIL(Synchronized Multimedia Integration Language 同步多媒體集成語言,是W3C推薦的可擴展標記語言,用於描述多媒體演示)

SVG 的 SMIL 動畫元素

SVG 中支持 SMIL 動畫的元素:

  • set:經過特定時間間隔後,將屬性設置爲某個值(不是過度動畫效果)。
  • animate:給某個屬性創建過度動畫效果。需將animate元素嵌套在要應用動畫的元素內。
  • animateTransform:指定目標元素的形變(transform)屬性,從而允許控制元素的平移、旋轉、縮放或傾斜動畫(類似於 CSS3 的形變)。
  • animateMotion:定義了一個元素如何沿着運動路徑進行移動。

SVG 動畫庫-Snap.svg

Snap.svg 是一個專門用於處理 SVG 的 JavaScript 庫 ( 類似jQuery )。

SVG 動畫庫-GSAP 動畫庫

GSAP 全稱是( GreenSock Animation Platform)GreenSock 動畫平臺。
GSAP 是一個強大的 JavaScript 動畫庫,可讓開發人員輕鬆的製作各種複雜的動畫。
與 Snap.svg 不一樣,GSAP 無論是 HTML 元素、還是 SVG、或是 Vue、React 組件的動畫,都可以滿足你的需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章