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