在網頁中使用SVG技術

cf4s45ddd 8年前發布 | 24K 次閱讀 SVG 前端技術

來自: http://netsmell.com/post/intro-to-html5-svg.html

可縮放矢量圖形(SVG)是矢量圖形家族的一部分。相比其他光柵圖形(JPEG、GIF 和 PNG),SVG 圖形具有更多的優勢。本文將探討 SVG 圖形的基本概念和在 HTML5 中的使用。學習繪制、過濾器、漸變、文本和將 SVG XML 添加到網頁。

簡介

可縮放矢量圖形 (SVG) 是基于矢量的圖形家族的一部分。它們與基于光柵的圖形不同,后者在一個數據數組中存儲每個像素的顏色定義。如今,網絡上使用的最常見的光柵圖形格式包括 JPEG、GIF 和 PNG,每種格式都具有優缺點。

相比任何基于光柵的格式,SVG 具有多項優勢:

  • SVG 圖形是使用數學公式創建的,需要在源文件中存儲的數據要少得多,因為您無需存儲每個獨立像素的數據。
  • 矢量圖形可更好地縮放。對于網絡上的圖像,嘗試從原始大小放大圖像可能產生失真(或像素化的)圖像。原始像素數據是針對特定大小進行設計的。當圖像不再是該大小時,顯示圖像的程序會猜測使用何種數據來填充新的像素。矢量圖像具有更高的彈性;當圖像大小變化時,數據公式可相應地調整。
  • 源文件大小可能更小,所以 SVG 圖形比其他光柵圖形的加載速度更快,使用的帶寬更少。
  • SVG 圖像由瀏覽器渲染,可以以編程方式繪制。SVG 圖像可動態地更改,這使它們尤其適合數據驅動的應用程序,比如圖表。
  • SVG 圖像的源文件是一個文本文件,所以它既具有易于訪問和搜索引擎友好特征。
  • </ul>

    本文將介紹 SVG 格式的優勢,以及它們如何在 HTML5 中的 Web 設計工作中提供幫助。

    SVG 基礎知識

    要創建 SVG 圖形,您會經歷與創建 JPEG、GIF 或 PNG 文件完全不同的流程。JPEG、GIF 和 PNG 文件通常使用圖像編輯程序創建,比如 Adobe Photoshop。SVG 圖像通常使用基于 XML 的語言創建。有一些 SVG 編輯 GUI 將為您生成基礎的 XML。但是,對于本文,我們假設您使用的是原始的 XML 語言。請參見 參考資料 獲取有關 SVG 編輯程序的信息。

    清單 1 給出了一個簡單 SVG XML 文件的示例,該文件繪制一個具有 2 像素寬的黑色邊框的紅色圓形。

    清單 1. SVG XML 文件

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
         <circle  cx="100" cy="50" r="40" stroke="black"
                stroke-width="2" fill="red" />
    </svg>

    上述代碼會得到演示 1 中的圖形。

    演示 1. 具有 2 像素寬的黑色邊框的紅色圓形

    創建基本形狀

    對于 SVG 圖形,需要使用 XML 標記來創建形狀,表 1 給出了這些 XML 元素。

    表 1. 創建 SVG 圖形的 XML 元素

    </tr> </thead>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr> </tbody> </table>

    line 元素

    line 元素是基本的繪圖元素。清單 2 展示了如何創建一條水平線。

    清單 2. 創建一條水平線

    <svg xmlns="http://www.w3.org/2000/svg" version='1.1'
     width="100%" height="100%" >
       <line x1='25' y1="150" x2='300' y2='150'
               style='stroke:red;stroke-width:10'/>
     </svg>

    清單 2 中的代碼會生成演示 2 中的圖形。

    演示 2. 基本的水平線

    根 SVG 標記具有寬度和高度屬性,用于定義可用于繪制的畫布區域。它們的原理類似于其他 HTML 元素的寬度和高度屬性。在本例中,畫布設置為占據所有可用空間。

    該示例還使用了 style 標記。SVG 圖形支持使用多種方法設置其內容的樣式。本文中的樣式可用于使他們變得顯眼,也可在必須使用某些屬性(比如筆畫顏色和寬度)才能渲染圖像時使用。 參考資料 中提供了有關設置 SVG 圖形樣式的更多信息。

    要創建一個線定義,可以定義相對于畫布的開始和結束 x 和 y 坐標。 x1 和 y1 屬性是開始坐標, x2 和 y2 屬性是結束坐標。要更改線的方向,只需更改這些坐標。例如,通過修改上一個示例,可以生成一條對角線,如清單 3 所示。

    清單 3. 創建一條對角線

    <svg xmlns="http://www.w3.org/2000/svg" version='1.1'
                    width="100%" height="100%" >
                        <line x1="0" y1="0" x2="200" y2="200"
                            style='stroke:red;stroke-width:10'/>
                    </svg>

    演示 3 給出了清單 3 中的代碼的結果。

    演示 3. 對角線

    polyline 元素

    多直線圖形是一個由多個線定義組成的圖形。清單 4 中的示例創建了一個類似一組樓梯的圖形。

    清單 4. 創建多直線樓梯

    <svg xmlns="http://www.w3.org/2000/svg"
    width="100%" height="100%" version='1.1'>
       <polyline points="0,40 40,40 40,80 80,80 80,120 120,120 120,160"
             style="fill:white;stroke:red;stroke-width:4"/>
    </svg>

    清單 4 中的代碼會生成演示 4 中的圖形。

    演示 4. 多直線樓梯

    要創建一個多直線圖形,可以使用 points 屬性并定義由逗號分隔的 x 和 y 坐標對。在本例中,第一個點定義為 0,40 ,其中 0 是 x 值, 40 是 y 值。但是,單獨一組點無法在屏幕上顯示任何東西,因為這僅告訴 SVG 渲染器從何處開始。在最低限度上,您需要兩組點:一個開始點和一個結束點(例如 points="0,40 40,40” )。

    與簡單的線圖形一樣,這些線不需要完全水平或垂直。如果更改上一個示例中的值,如清單 5 所示,可以生成不規則的線形狀。

    清單 5. 創建不規則的線

    <svg xmlns="http://www.w3.org/2000/svg"
    width="100%" height="100%" version='1.1'>
       <polyline points="20,20 40,25 60,40 80,120 120,140 200,180"
             style="fill:white;stroke:red;stroke-width:3"/>
    </svg>

    清單 5 中的代碼會生成演示 5 所示的圖形。

    演示 5. 不規則線

    rect 元素

    創建一個矩形非常簡單,只需定義寬度和高度,如清單 6 所示。

    清單 6. 創建矩形

    <svg xmlns="http://www.w3.org/2000/svg"
    width="100%" height="100%" version='1.1'>
        <rect width="300" height="100"
              style="fill:red"/>
    </svg>

    清單 6 中的代碼會生成演示 6 中的圖形。

    演示 6. 矩形

    您也可以使用 rect 標記創建一個正方形,正方形就是高和寬相等的矩形。

    circle 元素

    要創建一個圓,可以定義圓心的 x 和 y 坐標和一個半徑,如清單 7 所示。

    清單 7. 創建一個圓

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
         <circle  cx="100" cy="50" r="40" stroke="black"
                stroke-width="2" fill="red" />
    </svg>

    清單 7 中的代碼會生成演示 7 中的圖形。

    演示 7. 圓

    cx 和 cy 屬性定義圓心相對于繪圖畫布的位置。因為半徑是圓寬度的一半,所以在定義半徑時,請記住圖像的總寬度將是該值的兩倍。

    ellipse 元素

    橢圓基本上是一個圓,其中的代碼定義了兩個半徑,如清單 8 所示。

    清單 8. 創建一個橢圓

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
                        <ellipse cx="300" cy="80" rx="100" ry="50" style="fill:red;"/>
                    </svg>

    清單 8 中的代碼會生成演示 8 中的圖形。

    演示 8. 橢圓

    再次說明, cx 和 cy 屬性定義了相對于畫布的中心坐標。但是對于橢圓,需要使用 rx 和 ry 屬性為 x 軸定義一個半徑,為 y 軸定義一個半徑。

    polygon 元素

    多邊形這個形狀包含至少 3 條邊。清單 9 創建了一個簡單的三角形。

    清單 9. 創建一個三角形

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
                        <polygon points="200,10 250,190 160,210"
                            style="fill:red;stroke:black;stroke-width:1"/>
                    </svg>

    清單 9 中的代碼會生成演示 9 中的圖形。

    演示 9. 三角形

    類似于 polyline 元素,可使用 points 屬性定義幾對 x 和 y 坐標來創建多邊形。

    可以通過添加 x 和 y 對,創建具有任意多條邊的多邊形。通過修改上一個示例,可以創建一個四邊形,如清單 10 所示。

    清單 10. 創建一個四邊形

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
                        <polygon points="220,10 300,210 170,250 123,234"
                            style="fill:red;stroke:black;stroke-width:1"/>
                    </svg>

    清單 10 中的代碼會生成演示 10 中的圖形。

    演示 10. 四邊形

    甚至可以使用 polygon 標記創建復雜的形狀。清單 11 創建一個星形。

    清單 11. 創建一個星形

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
          <polygon points="100,10 40,180 190,60 10,60 160,180 100,10"
                style="fill:red;stroke:black;stroke-width:1"/>
    </svg>

    清單 11 中的代碼會生成演示 11 中的圖形。

    演示 11. 星形

    path 元素

    使用 path 元素(所有繪圖元素中最復雜的),可以使用一組專門的命令創建任意圖形。 path 元素支持表 2 中的命令。

    表 2. path 元素支持的命令

    元素 描述
    line 創建一條簡單的線。
    polyline 定義由多個線定義構成的形狀。
    rect 創建一個矩形。
    circle 創建一個圓形。
    ellipse 創建一個橢圓。
    polygon 創建一個多邊形。
    path 支持任意路徑的定義。

    </tr> </thead>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr> </tbody> </table>

    能以大寫或小寫形式使用這些命令。當命令為大寫時,應用絕對位置。當它為小寫時,應用相對位置。提供所有命令示例已超出了本文的范圍。但是,以下示例會演示它們的基本使用。

    可以使用 path 元素從本文前面的示例創建任何簡單的形狀。清單 12 使用 path 元素創建了一個基本的三角形。

    清單 12. 使用 path 元素創建一個三角形

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
        <path d="M150 0 L75 200 L225 200 Z" style="fill:red"/>
    </svg>

    清單 12 中的代碼會生成演示 12 中的圖形。

    演示 12. 使用 path 元素的三角形

    這組命令使用 d 屬性定義。在本例中,從 x 坐標 150 和 y 坐標 0 處開始繪制,這在移動到命令 ( M150 0 ) 中定義。然后再使用 “連線到” 命令繪制一條直線連接到 x 坐標 75 和 y 坐標 200 的位置 ( L75 200 )。接下來,使用另一個 “連線到” 命令繪制另一條線 ( L225 200 )。最后,使用 “封閉到” 命令封閉圖形 ( Z )。 Z 命令沒有提供任何坐標,因為要關閉您所在的路徑,根據定義,要繪制一條從當前位置到圖形起點(在本例中為 x = 150 y =0)的線。

    這里的意圖是展示一個基本示例;如果您想要的只是一個簡單的三角形,最好使用 polygon 標記。

    path 元素的真正強大之處是創建自定義形狀的能力,如清單 13 所示。該示例來自萬維網聯盟 (W3C) 文檔 可縮放矢量圖形 (SVG) 1.1(第二版) (參見 參考資料 )。

    清單 13. 使用 path 元素創建一個自定義形狀

    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
           <path d="M300,200 h-150 a150,150 0 1,0 150,-150 z"
                    fill="red" stroke="blue" stroke-width="5"/>
           <path d="M275,175 v-150 a150,150 0 0,0 -150,150 z"
                     fill="yellow" stroke="blue" stroke-width="5"/>
           <path d="M600,350 l 50,-25
                     a25,25 -30 0,1 50,-25 l 50,-25
                     a25,50 -30 0,1 50,-25 l 50,-25
                     a25,75 -30 0,1 50,-25 l 50,-25
                     a25,100 -30 0,1 50,-25 l 50,-25"
                     fill="none" stroke="red" stroke-width="5"/>
    </svg>

    清單 13 中的代碼會生成演示 13 中的圖形。

    演示 13. 使用 path 元素的自定義形狀

    使用 path 元素,可以創建復雜的圖形,比如圖表和波浪線。請注意,這個示例使用了多個 path 元素。當創建圖形時,根 SVG 標記中可以包含多個繪圖元素。

    過濾器和漸變

    除了目前為止許多示例中的基本 CSS 樣式,SVG 圖形還支持使用過濾器和漸變。本節將介紹如何向 SVG 圖形應用過濾器和漸變。

    過濾器

    可以使用過濾器向 SVG 圖形應用特殊的效果。SVG 支持以下過濾器。

    • feBlend
    • feColorMatrix
    • feComponentTransfer
    • feComposite
    • feConvolveMatrix
    • feDiffuseLighting
    • feDisplacementMap
    • feFlood
    • feGaussianBlur
    • feImage
    • feMerge
    • feMorphology
    • feOffset
    • feSpecularLighting
    • feTile
    • feTurbulence
    • feDistantLight
    • fePointLight
    • feSpotLight
    • </ul>

      請參見 參考資料 ,了解使用這些過濾器的詳細說明。

      清單 14 創建了一種應用到矩形上的投影效果。

      清單 14. 創建矩形的投影效果

      <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
                <defs>
                         <filter id="f1" x="0" y="0"
                                   width="200%" height="200%">
                               <feOffset result="offOut" in="SourceAlpha"
                                    dx="20" dy="20"/>
                               <feGaussianBlur result="blurOut"
                                     in="offOut" stdDeviation="10"/>
                               <feBlend in="SourceGraphic"
                                      in2="blurOut" mode="normal"/>
                          </filter>
               </defs>
                <rect width="90" height="90" stroke="green"
                         stroke-width="3" fill="yellow" filter="url(#f1)"/>
      </svg>

      清單 14 中的代碼會生成圖 14 中的圖形。

      圖 14. 一個矩形的投影效果

      過濾器在 def (表示定義)元素中定義。本示例中的過濾器分配了一個 id "f1" 。 filter 標記本身擁有定義過濾器的 x 和 y 坐標及寬度和高度的屬性。在 filter 標記中,可以使用想要的過濾器元素并將其屬性設置為想要的值。

      定義過濾器之后,使用 filter 屬性將它與一個特定圖形關聯,如 rect 元素 中所示。將 url 值設置為您分配給過濾器的 id 屬性的值。

      漸變

      漸變 是從一種顏色到另一種顏色逐漸的過渡。漸變具有兩種基本形式:線性和徑向漸變。所應用的漸變類型由您使用的元素確定。以下示例展示了應用于一個橢圓形的線性和徑向漸變。

      清單 15 創建了一個具有線性漸變的橢圓。

      清單 15. 創建一個具有線性漸變的橢圓

      <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
               <defs>
                  <linearGradient id="grad1" x1="0%" y1="0%"
                           x2="100%" y2="0%">
                 <stop offset="0%"
                           style="stop-color:rgb(255,255,0);stop-opacity:1"/>
                 <stop offset="100%"
                           style="stop-color:rgb(255,0,0);stop-opacity:1"/>
                 </linearGradient>
               </defs>
               <ellipse cx="200" cy="70" rx="85" ry="55"
                              fill="url(#grad1)"/>
      </svg>

      清單 15 中的代碼會生成圖 15 中的圖形。

      圖 15. 具有線性漸變的橢圓

      清單 16 創建了一個具有徑向漸變的橢圓。

      清單 16. 創建一個具有徑向漸變的橢圓

      <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
                   <defs>
                           <radialGradient id="grad1" cx="50%" cy="50%"
                                  r="50%" fx="50%" fy="50%">
                           <stop offset="0%"
                                  style="stop-color:rgb(255,255,255);stop-opacity:0"/>
                           <stop offset="100%"
                                  style="stop-color:rgb(255,0,0);stop-opacity:1"/>
                           </radialGradient>
                   </defs>
                   <ellipse cx="200" cy="70" rx="85" ry="55"
                           fill="url(#grad1)"/>
      </svg>

      清單 16 中的代碼會生成圖 16 中的圖形。

      圖 16. 具有徑向漸變的橢圓

      像過濾器一樣,漸變在 def 元素內定義。每個漸變分配有一個 id 。漸變屬性(比如顏色)可使用 stop 元素在漸變標記內設置。要將漸變應用于圖形,可以將 fill 屬性的 url 值設置為想要的漸變的 id 。

      文本和 SVG

      除了基本形狀,還可以使用 SVG 生成文本,如清單 17 所示。

      清單 17. 使用 SVG 創建文本

      <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
             <text x="0" y="15" fill="red">I love SVG</text>
      </svg>

      清單 17 中的代碼會生成圖 17 中的圖形。

      圖 17. SVG 文本

      此示例使用了一個 text 元素來創建句子 I love SVG 。當使用 text 元素時,要顯示的實際文本在開始和結束 text 元素之間。

      您可以沿多個軸,以及甚至沿多條路徑顯示文本。清單 18 沿一條弧形路徑顯示文本。

      清單 18. 沿一條弧形路徑創建文本

      <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
       xmlns:xlink="http://www.w3.org/1999/xlink">
              <defs>
                        <path id="path1" d="M75,20 a1,1 0 0,0 100,0"/>
              </defs>
              <text x="10" y="100" style="fill:red;">
                         <textPath xlink:href="#path1">I love SVG I love SVG</textPath>
               </text>
      </svg>

      清單 18 中的代碼會生成圖 18 中的圖形。

      圖 18. 一個弧形路徑上的文本

      在此示例中,向根 SVG 標記添加了一個額外的 XML 命名空間 xlink 。用戶顯示文本的弧形路徑在 def 元素內創建,所以該路徑不會在圖形中實際渲染出來。要顯示的文本嵌套在一個 textPath 元素內,該元素使用 xlink 命名空間引用想要的路徑的 id 。

      與其他 SVG 圖形一樣,也可以向文本應用過濾器和漸變。清單 19 向一些文本應用了一個過濾器和一種漸變。

      清單 19. 創建具有過濾器和漸變的文本

      <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
      xmlns:xlink="http://www.w3.org/1999/xlink">
                <defs>
                          <radialGradient id="grad1" cx="50%" cy="50%"
                                 r="50%" fx="50%" fy="50%">
                                 <stop offset="0%"
                                      style="stop-color:red; stop-opacity:0"/>
                                 <stop offset="100%"
                                     style="stop-color:rgb(0,0,0);stop-opacity:1"/>
                          </radialGradient>
                          <filter id="f1" x="0" y="0"
                                     width="200%" height="200%">
                                 <feOffset result="offOut"
                                     in="SourceAlpha" dx="20" dy="20"/>
                                 <feGaussianBlur result="blurOut"
                                     in="offOut" stdDeviation="10"/>
                                 <feBlend in="SourceGraphic"
                                     in2="blurOut" mode="normal"/>
                          </filter>
                </defs>
                <text x="10" y="100" style="fill:url(#grad1); font-size: 30px;"
                              filter="url(#f1)">
                              I love SVG I love SVG
                </text>
      </svg>

      清單 19 中的代碼會生成圖 19 中的圖形。

      圖 19. 具有過濾器和漸變的文本

      向網頁添加 SVG XML

      創建 SVG XML 之后,可采用多種方式將它包含在 HTML 頁面中。第一種方法是直接將 SVG XML 嵌入到 HTML 文檔中,如清單 20 所示。

      清單 20. 直接將 SVG XML 嵌入 HTML 文檔

      <html>
           <head>
                   <title>Embedded SVG</title>
           </head>
           <body style="height: 600px;width: 100%; padding: 30px;">
                    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
                          <circle cx="100" cy="50" r="40" fill="red"/>
                    </svg>
           </body>
      </html>

      此方法可能最簡單,但它不支持重用。請記住,可以使用 .svg 擴展名保存 SVG XML 文件。當將 SVG 圖形保存在 .svg 文件中時,您可以使用 embed 、 object 和 iframe 元素來將它包含在網頁中。清單 21 顯示了使用 embed 元素包含 SVG XML 文件的代碼。

      清單 21. 使用 embed 元素包含一個 SVG XML 文件

      <embed src="circle.svg" type="image/svg+xml" />

      清單 22 顯示了如何使用 object 元素包含一個 SVG XML 文件。

      清單 22. 使用 object 元素包含一個 SVG XML 文件

      <object data="circle.svg" type="image/svg+xml"></object>

      清單 23 給出了使用 iframe 元素包含一個 SVG XML 文件的代碼。

      清單 23. 使用 iframe 元素包含一個 SVG XML 文件

      <iframe src="circle1.svg"></iframe>

      當使用其中一種方法時,可以將同一個 SVG 圖形包含在多個頁面中,并編輯 .svg 源文件來進行更新。

      結束語

      本文介紹了使用 SVG 格式創建圖形的基礎知識。您學習了如何使用內置的集合元素(比如線、矩形、圓等)創建基本形狀。您還學習了如何通過發出一系列命令(比如移動到、連線到和使用弧線連接到),使用 path 元素創建復雜的圖形。本文還探討了如何對 SVG 圖形應用過濾器和漸變,包括文本圖形,以及如何在 HTML 頁面中包含 SVG 圖形。

      </div> </span></span></span></span>

       本文由用戶 cf4s45ddd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
       轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
       本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
    命令 描述
    M 移動到
    L 連線到
    H 水平連線到
    V 垂直連線到
    C 使用曲線連接到
    S 使用平滑曲線連接到
    Q 使用二次貝塞爾曲線連接到
    T 使用平滑的二次貝塞爾曲線連接到
    A 使用橢圓曲線連接到
    Z 將路徑封閉到
sesese色