HTML5之SVG詳解(一):基本概括


1、背景

SVG是Scalable Vector Graphics的縮寫,意為可縮放矢量圖形。1998年,萬維網聯盟成立了一個工作組,研發一種通過XML來表現矢量圖形的技術——SVG!由於SVG也是一種XML文件,所以SVG也繼承了XML的開放性、可移植性和交互性的優點。如今幾乎所有主流的瀏覽器都支持SVG,大家可以從這里得到更多的兼容信息,其中包括:

  • 使用<embed>或者<object>元素來顯示基本的SVG圖形;
  • 使用<img>來顯示SVG圖形;
  • 將SVG圖形應用為CSS背景圖;
  • 直接在HTML文檔中使用<svg>標簽(需要HTML5支持);
  • 對使用CSS或者外部對象元素的HTML元素使用SVG變換、濾鏡等特效;
  • 對SVG對象使用類似photoshop的效果,包括模糊和色彩處理;
  • 對SVG圖像使用動畫;
  • 使用SVG格式的字體;

2、圖形系統

目前在計算機上主要有兩種形式來表現圖形,一種是柵格圖形,另一種是矢量圖形。

2.1 柵格圖形

在柵格圖形中,圖像用像元或者像素的矩形陣列來表示,每個像素代表一個RGB顏色值或者是一個指向顏色列表的索引。通常以一種壓縮格式來存儲(如JPEG, GIF, PNG等),由於現在大部分的顯示設備都是柵格設備,所以顯示這些圖形只需要做解壓處理就可以了。

2.2 矢量圖形

在矢量圖形系統中,圖形被描述為一些列的形狀,它是特定坐標的集合。顯示矢量圖形需要按照特定的命令來繪制這些坐標,然后顯示在屏幕上。矢量圖形是對象,而不是一系列的像素。它們可以改變顏色、形狀還有大小,圖形中的文字都是可以被檢索的,這些與柵格圖形都有很大的不同。

2.3 為什么要使用矢量圖形

絕大部分情況下,我們都在使用柵格圖形,而且創建柵格圖形的工具更容易獲得和使用。但是矢量圖形有一個柵格圖形無法替代的優勢:無論如何的縮放,矢量圖形都不會失真。這使得當我們需要具有精確測量以及看清圖形細節的放大能力時,矢量圖形顯得尤其重要。

3、創建一個SVG圖形

下面首先創建一個SVG圖形,這里我並不會詳細的講解各個標簽,只是先給一個感性的認識,隨后的章節會對SVG的語法做詳細的介紹。看代碼:

 1 <?xml version="1.0"?>
 2 <!DOCTYPE svg PUBLIC "//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
 3 <svg width="140" height="170" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
 4      <title>cat</title>
 5      <desc>Stick Figure of a Cat</desc>
 6      <circle cx="70" cy="95" r="50" style="stroke: black; fill: none;"/>
 7      <circle cx="55" cy="80" r="5" style="stroke: black; fill: #339933"/>
 8      <circle cx="85" cy="80" r="5" style="stroke: black; fill: #339933"/>
 9      <g id="whiskers">
10          <link x1="75" y1="95" x2="135" y2="85" style="stroke: black;"/>
11          <link x1="75" y1="95" x2="135" y2="105" style="stroke: black;"/>
12      </g>
13      <use xlink:href="#whiskers" transform="scale(-1,1) translate(-140,0)" />
14      <!-- ears -->
15      <polyline points="108 62, 90 10,70 45, 50 10, 32 62" style="stroke: black; fill: none;" />
16      <!-- mouth -->
17      <polyline points="35 110, 45 120, 95 120, 105 110" style="stroke: black; fill: none;" />
18      <!-- nose -->
19      <path d="M 75 90 L 65 90 A 5 10 0 0 0 75 90" style="stroke: black; fill: #ffcccc;" />
20      <text x="60" y="165" style="font-family:sans-serif; font-size:14pt;">
21          Cat
22      </text>
23  </svg> 

 

可能大家已經看出來了,這實際上是一個標准的XML文件,在瀏覽器中瀏覽,會看到一只貓的圖案,如下圖:

另外,由於很多人習慣了HTML5式的文檔模式,即

 1 <!DOCTYPE HTML>
 2 <html lang="en-US">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     
 9 </body>
10 </html>

 

 

將命令空間省略,這里強烈的建議寫SVG的時候保留命名空間,即

xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"

后面你會看到因為忽略命令空間而引發的異常。

4、應用SVG圖形

如何才能夠在HTML文檔中引入SVG呢?一般有一下幾種方法

  • 包含在<svg>標簽內部

  這是一種最直接的方法,但是需要瀏覽器支持HTML5中的<svg>標簽,如:

 1 <!DOCTYPE HTML>
 2 <html lang="en-US">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>SVG DEMO</title>
 6 </head>
 7 <body>
 8     <svg width="140" height="170">
 9         <title>cat</title>
10         <desc>Stick Figure of a Cat</desc>
11         <circle cx="70" cy="95" r="50" style="stroke: black; fill: none;"/>
12         <circle cx="55" cy="80" r="5" style="stroke: black; fill: #339933"/>
13         <circle cx="85" cy="80" r="5" style="stroke: black; fill: #339933"/>
14         <g id="whiskers">
15             <link x1="75" y1="95" x2="135" y2="85" style="stroke: black;"/>
16             <link x1="75" y1="95" x2="135" y2="105" style="stroke: black;"/>
17         </g>
18         <use xlink:href="#whiskers" transform="scale(-1,1) translate(-140,0)" />
19         <!-- ears -->
20         <polyline points="108 62, 90 10,70 45, 50 10, 32 62" style="stroke: black; fill: none;" />
21         <!-- mouth -->
22         <polyline points="35 110, 45 120, 95 120, 105 110" style="stroke: black; fill: none;" />
23         <!-- nose -->
24         <path d="M 75 90 L 65 90 A 5 10 0 0 0 75 90" style="stroke: black; fill: #ffcccc;" />
25         <text x="60" y="165" style="font-family:sans-serif; font-size:14pt;">Cat</text>
26     </svg>
27 </body>
28 </html>

 

 

  • 通過<embed>或者<object>標簽嵌入

  其中DEMO1.svg是先前創建的SVG文件。

 1 <!DOCTYPE HTML>
 2 <html lang="en-US">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>SVG DEMO</title>
 6 </head>
 7 <body>
 8     <embed src="DEMO1.svg" type="image/svg+xml" width="140" height="170">
 9     <object data="DEMO1.svg" type="image/svg+xml" width="140" height="170"></object>
10 </body>
11 </html>

 

 

  • 通過<img>標簽的src屬性
 1 <!DOCTYPE HTML>
 2 <html lang="en-US">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>SVG DEMO</title>
 6 </head>
 7 <body>
 8     <img src="DEMO1.svg" width="140" height="170" alt="">
 9 </body>
10 </html>

 

  • 通過CSS:background: url(...)
 1 <!DOCTYPE HTML>
 2 <html lang="en-US">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>SVG DEMO</title>
 6     <style type="text/css">
 7         #cat{
 8             width: 140px;
 9             height: 170px;
10             background: url(DEMO1.svg) no-repeat;
11         }
12     </style>
13 </head>
14 <body>
15     <div id="cat"></div>
16 </body>
17 </html>

 

所有的方法都產生同樣的結果,如上圖所示。

 重要聲明:本文所用的圖片以及示例來自於http://commons.oreilly.com/wiki/index.php/SVG_Essentials/Getting_Started


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM