SVG 學習筆記

SVG 簡介

SVG(Scalable Vector Graphics):可縮放矢量圖形往果,是一種基于 XML 的用于描述二維矢量圖形的圖形格式。SVG 由 W3C 制定,是一個開放標準魄幕。SVG 嚴格遵從 XML 語法,并用文本格式的描述性語言來描述圖像內(nèi)容颖杏,因此是一種和圖像分辨率無關的矢量圖形格式纯陨。
SVG 誕生于 1999 年,2001 年 9 月 4 日 SVG 1.0 成為 W3C 推薦標準留储,2003 年 1 月 4 日 SVG 1.1 成為 W3C 推薦標準翼抠,2011 年 8 月 16 日 SVG 1.1 (第二版)成為 W3C 推薦標準。SVG 2 正在制定中获讳。

SVG 優(yōu)勢

  • SVG 是純 XML 文件描述的圖像格式
  • 基于上一條 SVG 可以用任意的文本編輯器創(chuàng)建和修改
  • SVG 可以縮放并且縮放之后圖像不會失真
  • SVG 是 W3C 的開放標準

iconfont 圖標庫提供了 SVG 和 PNG 等格式的圖片阴颖,分別下載兩種格式的圖片,然后在 html 中引入看一下對比效果丐膝。

image.png
<!DOCTYPE html>
<html>
  <body>
    <img style="width: 200px; height: 200px" src="apple.svg" />
    <img style="width: 200px; height: 200px" src="apple.png" />
  </body>
</html>

下圖可以明顯的看到量愧,SVG 在放大之后不會失真钾菊,對比 PNG 更加清晰。同時我們需要知道 SVG 對比于 PNG 等以像素描述圖片不同侠畔,SVG 的大小取決于圖片信息的復雜程度结缚。

image.png

SVG 重要屬性

1. width&height

width 和 height 用于定義 SVG 畫布的大小,單位可以是 px软棺、em红竭、cm 等。默認值是300 x 150(單位px)喘落。

首先來看 width 和 height 為默認值的情況茵宪,具體屬性值設置如下:

  • svg width 未設置 height 未設置
  • viewBox 未設置
  • circle cx="50" cy="50" r="50"
<!DOCTYPE html>
<html>
  
  <body>
    <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1">
      <circle cx="50" cy="50" r="50" fill="#3BACB6" />
    </svg>
  </body>
  
</html>
image.png

上面是的代碼和顯示效果是未設置 widthheight 的情況,其中 <circle> 表示繪制運行 cx(center x)是圓心 x 軸坐標瘦棋,cy(center y) 是圓心 y 周坐標稀火,r 是圓的半徑。

接下來我們看給 widthheight賦值之后的效果赌朋。

  • svg width=100 height=100
  • viewBox 未設置
  • circle cx="50" cy="50" r="50"
<!DOCTYPE html>
<html>

<body>
  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100"
    height="100">
    <circle cx="50" cy="50" r="50" fill="#3BACB6" />
  </svg>
</body>

</html>
image.png

上面是的代碼和顯示效果是設置 width = 100height = 100 的效果凰狞,可以看到 SVG 的寬高都變成了100。
以上就是對 SVG widthheight 的作用沛慢,可以理解為 SVG 在 html 中的寬和高赡若。

2. viewBox

第二個重要的屬性是 viewBox ,從字面來理解是視圖盒子团甲,它由四個值組成逾冬,分別是

  • x:左上角橫坐標
  • y:左上角縱坐標
  • width:寬度
  • height:高度

viewBox的 width height 和 svg width height 含義不同,我們先來看一下設置 viewBox 的效果躺苦。

  • svg width=100 height=100
  • viewBox="0 0 50 50"
  • circle cx="50" cy="50" r="50"
<!DOCTYPE html>
<html>

<body>
  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100"
    height="100" viewBox="0 0 50 50">
    <circle cx="50" cy="50" r="50" fill="#3BACB6" />
  </svg>
</body>

</html>
image.png
image.png

這種情況相當于把 svg 畫布上的內(nèi)容進行了放大身腻。接下來我們修改 viewBox 看看縮小的效果。

  • svg width=100 height=100
  • viewBox="0 0 200 200"
  • circle cx="50" cy="50" r="50"
<!DOCTYPE html>
<html>

<body>
  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100"
    height="100" viewBox="0 0 200 200">
    <circle cx="50" cy="50" r="50" fill="#3BACB6" />
  </svg>
</body>

</html>
image.png
image.png

這種情況相當于把 SVG 畫布上的內(nèi)容進行了縮小匹厘。

下圖是以上 4 個例子的對比嘀趟。

image.png

3. preserveAspectRatio

上面的情況 svg width height 和 viewBox 的 width height 都是成比例的。當兩者不成比例時愈诚,我們可以使用 preserveAspectRatio 來調(diào)整對齊和縮放方式去件。格式為:<align> [<meetOrSlice>]

注意:如果沒有設置 viewBox ,preserveAspectRatio 會被忽略

align

align 的取值是 xMin扰路、xMid、xMax 與 YMin倔叼、YMid汗唱、YMax 兩兩的組合。

viewport 表示 SVG 的視口丈攒,即 SVG 寬高所占的區(qū)域哩罪。

image.png

下面所說的坐標軸原點如上圖授霸。

取值 描述
none 不會按比例縮放,會完全按照 SVG 寬高進行適配际插,可能會變形碘耳。
xMinYMin viewBox 與 ViewPort x 軸左邊對齊 viewBox 與 ViewPort y 軸左邊對齊
xMinYMid viewBox 與 ViewPort x 軸左邊對齊 viewBox 與 ViewPort y 軸中點對齊
xMinYMax viewBox 與 ViewPort x 軸左邊對齊 viewBox 與 ViewPort y 軸下邊對齊
xMidYMin viewBox 與 ViewPort x 軸中點對齊 viewBox 與 ViewPort y 軸上方對齊
xMidYMid(默認值) viewBox 與 ViewPort x 軸中點對齊 viewBox 與 ViewPort y 軸中點對齊
xMidYMax viewBox 與 ViewPort x 軸中點對齊 viewBox 與 ViewPort y 軸下方對齊
xMaxYMin viewBox 與 ViewPort x 軸右邊對齊 viewBox 與 ViewPort y 軸上方對齊
xMaxYMid viewBox 與 ViewPort x 軸右邊對齊 viewBox 與 ViewPort y 軸中心對齊
xMaxYMax viewBox 與 ViewPort x 軸右邊對齊 viewBox 與 ViewPort y 軸下邊對齊

meetOrSlice

可取值是 meetslice,其中 meet 是默認值框弛。

其中 meet 的作用是

  • viewBox 寬高比保持不變
  • viewBox 在 ViewPort 范圍內(nèi)可見
  • 盡可能的放大 viewBox辛辨,同時仍然滿足其他的條件

slice 的作用是

  • viewBox 寬高比保持不變
  • viewBox 盡可能鋪滿 ViewPort(可能造成 viewBox 裁剪)
  • viewBox 盡可能的縮小,但是仍然符合其他標準瑟枫。

xMidYMid meet

<!DOCTYPE html>
<html>

<body>
  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100"
    height="200" viewBox="0 0 200 200" preserveAspectRatio="xMidYMid meet">
    <circle cx="50" cy="50" r="50" fill="#3BACB6" />
  </svg>
</body>

</html>
image.png
image.png

xMidYMid slice

<!DOCTYPE html>
<html>

<body>
  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" width="100"
    height="200" viewBox="0 0 200 200" preserveAspectRatio="xMidYMid slice">
    <circle cx="50" cy="50" r="50" fill="#3BACB6" />
  </svg>
</body>

</html>

slice 的作用是

  • viewBox 寬高比保持不變
  • viewBox 盡可能鋪滿 ViewPort(可能造成 viewBox 裁剪)
  • viewBox 盡可能的縮小斗搞,但是仍然符合其他標準。
image.png

SVG 繪制

rect

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect width="300" height="100" fill="#3BACB6"/>
</svg>
image.png

circle

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="50" cy="50" r="50" fill="#3BACB6" />
</svg>
image.png

line

  <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <line x1="0" y1="0" x2="100" y2="100" style="stroke:#3BACB6;stroke-width:5" />
  </svg>
image.png

polygon

  <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <polygon points="0,0 100,100 0,100" style="fill:#3BACB6;" />
  </svg>
image.png

path

  <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <path d="M0 0 L100 100 L0 100 Z" style="fill:#3BACB6;" />
  </svg>
image.png

M:moveto
L:lineto
Z:closepath

其他

SVG 還提供了很多其他的元素來幫助我們繪制各種各樣的圖形慷妙,具體可參考僻焚。


image.png

參考資源

https://www.w3schools.com/graphics/svg_intro.asp
https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%B8%AE%E6%94%BE%E5%90%91%E9%87%8F%E5%9C%96%E5%BD%A2
https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute/preserveAspectRatio
https://developer.mozilla.org/zh-CN/docs/Web/SVG/Element

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膝擂,隨后出現(xiàn)的幾起案子虑啤,更是在濱河造成了極大的恐慌,老刑警劉巖架馋,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞山,死亡現(xiàn)場離奇詭異,居然都是意外死亡绩蜻,警方通過查閱死者的電腦和手機铣墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來办绝,“玉大人伊约,你說我怎么就攤上這事≡胁酰” “怎么了屡律?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長降淮。 經(jīng)常有香客問我超埋,道長,這世上最難降的妖魔是什么佳鳖? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任霍殴,我火速辦了婚禮,結果婚禮上系吩,老公的妹妹穿的比我還像新娘来庭。我一直安慰自己,他們只是感情好穿挨,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布月弛。 她就那樣靜靜地躺著肴盏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帽衙。 梳的紋絲不亂的頭發(fā)上菜皂,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音厉萝,去河邊找鬼恍飘。 笑死,一個胖子當著我的面吹牛冀泻,可吹牛的內(nèi)容都是我干的常侣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼弹渔,長吁一口氣:“原來是場噩夢啊……” “哼胳施!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肢专,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤舞肆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后博杖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椿胯,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年剃根,在試婚紗的時候發(fā)現(xiàn)自己被綠了哩盲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡狈醉,死狀恐怖廉油,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苗傅,我是刑警寧澤抒线,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站渣慕,受9級特大地震影響嘶炭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逊桦,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一眨猎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧强经,春花似錦宵呛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至码秉,卻和暖如春逮矛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背转砖。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工须鼎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人府蔗。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓晋控,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姓赤。 傳聞我的和親對象是個殘疾皇子赡译,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 坐標系統(tǒng) 1. 視口 視口是指文檔打算使用的畫布區(qū)域。在svg元素上使用width和height屬性確定視口的大小...
    億個小目標閱讀 520評論 0 2
  • 基本形狀 SVG 有一些預定義的形狀元素不铆,可被開發(fā)者使用和操作: 1.矩形 <rect> 標簽蝌焚,使用x,y,wid...
    億個小目標閱讀 572評論 0 1
  • SVG 學習筆記 SVG是什么 SVG 指可伸縮矢量圖形 (Scalable Vector Graphics) S...
    Penn_Xu閱讀 958評論 0 1
  • SVG學習筆記 簡介 SVG使用XML來描述二維圖形和繪圖程序的語言。 SVG形狀 SVG在HTML頁面 SVG ...
    EL_PSY_CONGROO閱讀 243評論 0 0
  • 一. SVG是什么誓斥? SVG 意為可縮放矢量圖形(Scalable Vectors Graphics)只洒。 SVG ...
    TROPICALlll閱讀 1,102評論 0 1