SVG 全稱是 Scalable Vector Graphics,即,矢量圖。在 Web 中使用 SVG 可以解決位圖放大失真的問題。首先,不要把 SVG 和 CSS,Canvas,HTML 搞混。他們之間并沒有你中有我,我中有你的關(guān)系。SVG 是通過 XML 的形式寫在 HTML 文檔中的。 如何書寫開篇說過,SVG 就是一個(gè) XML。看一下代碼吧:
大家看 svg 標(biāo)簽中帶有一個(gè) viewBox 的屬性。這其實(shí)是 SVG 中一個(gè)很重要的概念,后面的縮放都會與它有關(guān)。 說到這里,我們就需要了解一下關(guān)于 SVG 的幾個(gè)基本概念。 基本概念簡單來說有 3 個(gè)基本概念:
我們接下來,一個(gè)一個(gè)的進(jìn)行講解吧。 viewport參照上面的 demo,這實(shí)際上就是你用 x,y,width,height。這 4 個(gè)屬性,在頁面上固定的矩形區(qū)域。 viewbox定義 SVG 元素在 viewport 中的具體尺寸比例。假設(shè)有如下內(nèi)容:
默認(rèn)情況下 SVG 是自動填充滿 viewport 的。注意,在 SVG 中,子標(biāo)簽的所有尺寸都是不能帶單位的,因?yàn)槌跏紗挝痪褪歉鶕?jù)上面兩個(gè)概念確定。 當(dāng)為以上情況,SVG 中基本的尺寸則不是 1px,而是 500/50 = 10px。所以,如下的圖形大小為:
也就是在 SVG 里面定義的 preserveAspectRatio該屬性就是用來定義上面 viewport 和 viewbox 相互對齊的方式。換句話就是說,它的屬性可以改變 viewbox 的具體位置?;靖袷綖椋?/p>
其中,align 需要著重理解一下。首先,它的默認(rèn)值為 xMidYMid,即為中點(diǎn)重合。 可以從圖中看出,viewbox 是通過中心進(jìn)行延展的。注意,它的原點(diǎn)坐標(biāo)還是在 viewbox 的左上角。如果你是動態(tài)增加尺寸的話,此時(shí)并不是從左到右增加,而是從中心向兩端擴(kuò)張。同理,如果你使用的是 然后就是 meet || slice || none 這三個(gè)屬性具體干的事情。 在這之前,我們需要了解一個(gè)公式–縮放比計(jì)算公式:
其中,vb_ 為 viewbox 簡寫,vp_ 為 viewport 的簡寫。vb_h 代表就是 viewbox height。vb_w 代表就是 viewbox width。rat_x/y 代表的是 x,y 軸的縮放比例。 假設(shè)有下列情況:
那么,rat_x 和 rat_y 分別為:
現(xiàn)在,針對上面 meet/slice 不同的取值,實(shí)際應(yīng)用到 svg 里面的縮放比例是不同的。
所以針對不同的取值,基準(zhǔn)比例也不同。 當(dāng)為 meet 的情況,那么實(shí)際縮放比例為 1。則里面實(shí)際矩形的大小就為 (10,10) 到 (150,150)。 當(dāng)為 slice 的情況,那么實(shí)際縮放比例為 2。則里面實(shí)際矩形的大小就為 (20,20) 到 (300,300)。 如果你的值為 none 的話,他會直接鋪滿整個(gè) viewport,即,實(shí)際矩形大小為:(20,10) 到 (300,150)。 響應(yīng)式 SVG雖然講起響應(yīng)式,一些童鞋會想這 TM 又是啥奇技淫巧? 對不起,并不是。。。就是一個(gè) viewbox 并且不帶 width/height 而已。 看個(gè)實(shí)際的例子吧:
可以看到,上面的 svg 標(biāo)簽并沒有帶上啥 width/height 屬性,只是簡單描述了 viewBox 的范圍而已。當(dāng)然,里面的尺寸標(biāo)準(zhǔn)都是在這 viewBox 的范圍內(nèi)進(jìn)行設(shè)置的。 另外,在這里聲明一下,本文章并不是新手教程,也就是說,不會教你一步一步的畫直線啊,圓啊,矩形啊等等這些基本圖形。這些直接 google 一下,一搜一大把。所以,這里假設(shè)大家的水平是處于,能對 SVG 基本的圖形屬性熟悉即可,對一些高級屬性還不是很清楚和熟練。OK,繼續(xù)~ 在 SVG 中,能夠直接使用的圖形有:
上面沒有啥說的,后面我詳細(xì)說一下兩個(gè)比較重要的概念,分組和 Path。 分組和 Path通常 Path 和 分組通常是一起使用的,如上:
分組我們放到后面進(jìn)行講解,這里先看一下 Path。 PathPath 在 SVG 中的地位應(yīng)該是比較高的,實(shí)際上,利用 Path 這個(gè)一個(gè)標(biāo)簽可以畫出任意的圖形。path 中
而在 10 中不同表示符中,又可以分為直線和曲線兩種不同的標(biāo)識符。這里,我們分類來講解一下。 線型M/m該使用定義起始點(diǎn)的,沒啥特殊的作用。
表示,以 (10,10) 為起始點(diǎn)。 L/l原意是 Line to,用來畫線段的。格式和 M/m 差不多:
H/h用來畫水平線,即,Horizontal。既然方向已經(jīng)定了,剩下的就是距離,格式很簡單:
V/v用來畫豎直線,即,vertical。同上,方向也定了,格式為:
看個(gè)例子吧:
該 path 實(shí)際上就是畫了一個(gè)正方形,寬 = 高 = 90。 Z/z該標(biāo)識符用來表示 path 的結(jié)束,并且將最后一點(diǎn)和 M/m 標(biāo)識開頭的一點(diǎn)連接起來。所以,它不存在什么表示點(diǎn)之類的,格式為:
而上面也可以進(jìn)行相關(guān)的優(yōu)化,最終的結(jié)果為:
曲線曲線就是 Web 畫圖中常見的 Bezier Curves(貝塞爾),Arcs,several Bezier curves(很多貝塞爾 - .-)等。 我們簡單看一下: C/c這是正統(tǒng)的貝塞爾曲線,需要 4 個(gè)參考點(diǎn),下圖應(yīng)該說比較確切表示了二次貝塞爾所需要的點(diǎn)。所以,C/c 需要定義三個(gè)點(diǎn)。 基本格式為:
例如:
S/s該標(biāo)識符實(shí)際上使用來表示一個(gè)反射貝塞爾,即,在原有貝塞爾上再加一段貝塞爾曲線,所以,S/s 一般和 C/c 一起使用。 基本格式為:
實(shí)際樣式圖為: 相當(dāng)于原有的貝塞爾曲線的最后一段進(jìn)行反向延長并對稱。然后加上新定義的一段限制曲線。 具體實(shí)例為:
Q/q該標(biāo)識符是用來定義二次(quadratic)貝塞爾曲線,該曲線相當(dāng)于上面?zhèn)鹘y(tǒng)的貝塞爾來說,更加簡單,它只需要定義三個(gè)點(diǎn),即可完整一個(gè)貝塞爾曲線,具體作圖過程如下: 基本格式為:
即為圖上點(diǎn), P1(x1,y1),P2(x,y) 起始點(diǎn)為 M 定義的點(diǎn),例如:
T/t該標(biāo)識符和 S 差不多,也是一個(gè)貝塞爾曲線的延長。相當(dāng)于原曲線的控制點(diǎn) P1 相當(dāng)于 end point P2 做對稱,然后,只需要定義一個(gè)終點(diǎn)即可,即,T/t 只需要定義貝塞爾曲線里面的終點(diǎn)即可:
如圖: 所以,簡單來說,C/S,Q/T 是兩兩搭配一起使用的。在使用的時(shí)候,千萬不要搞混即可。 弧線A/a該曲線是用來畫弧線(Arcs),而,弧線通常是圓/橢圓的一部分。當(dāng),橢圓的兩個(gè)軸徑長相等則為圓,所以,A/a 是按照橢圓作為基準(zhǔn)格式:
說實(shí)在的,這個(gè)比較復(fù)雜。因?yàn)?,他畫橢圓的方式和我們平常不一樣,一般情況下,橢圓只要確定一個(gè)中心,然后是長短軸,然后是弧度范圍即可。 但是,它這里是通過橢圓上的兩點(diǎn)來確定的,在加上旋轉(zhuǎn)角度,倆軸徑等因素來確定的。另外,需要注意,它的起始點(diǎn)是從上一個(gè)命令的結(jié)束點(diǎn)位置開始計(jì)算的。OK,我們首先簡單了解一下格式里面的參數(shù):
上面幾個(gè)屬性中,比較難理解的就是 簡單說一種,例如當(dāng),laf 和 sf 都為 0的情況。首先,laf 為 0 選擇的是小弧長。所以,里面兩段比較小的弧長被抽出來。然后,sf 為 0 選擇的是逆時(shí)針。即,以起始點(diǎn)為參考,選擇通過逆時(shí)針方向到達(dá)終點(diǎn)的那段弧。即,2 抽 1。最終得出我們需要的弧。 說實(shí)在的,這個(gè)是真 TM 復(fù)雜。。。 給一個(gè)參考 codepen。 一般情況下,我們并不需要手動來確定 path,有工具為啥不用工具呢! 比如,Illustrator, Sketch 等,都可以自動生成 SVG。不過,生成之后,需要對代碼做相關(guān)的壓縮優(yōu)化,這些都可以直接在編譯器里面找到。 你也可以用一下可視化工具 SVGOMG 來簡單看一下。 分組SVG 中的分組你可以理解為 PS 中的圖層,一塊圖層里面通常只會放一下高內(nèi)聚的圖形,這樣既方便移動又方便做動畫。SVG 中的分組標(biāo)簽就是 例如:
需要注意的是,使用 不過, 分組動畫在分組重定義動畫是直接寫在
每種變換動畫之間是通過
具體可以使用的動畫形式和 CSS 動畫一模一樣,詳情可以參考: SVG 動畫 原文鏈接: https://www./2017/04/17/SVG 快速入門 更新時(shí)間: 2017-04-17 |
|