將向量圖形新增到網頁

向量圖形在許多情況下非常有用 — 它們檔案大小小且可高度擴充套件,因此在放大或縮放到很大尺寸時不會出現畫素化。本文將向您展示如何在網頁中包含一個向量圖形。

先決條件 您應該瞭解 HTML 基礎知識 以及如何 將影像插入您的文件
目標 學習如何在網頁中嵌入 SVG(向量)影像。

注意:本文並非旨在教授 SVG;而是介紹什麼是 SVG 以及如何將其新增到網頁中。

什麼是向量圖形?

在 Web 上,您將使用兩種型別的影像 — **光柵影像** 和 **向量影像**

  • **光柵影像** 使用畫素網格定義 — 光柵影像檔案包含顯示每個畫素的確切位置以及其確切顏色資訊的。常見的 Web 光柵格式包括 Bitmap (.bmp)、PNG (.png)、JPEG (.jpg) 和 GIF (.gif)。
  • **向量影像** 使用演算法定義 — 向量影像檔案包含形狀和路徑定義,計算機可以使用這些定義來確定在螢幕上呈現影像時影像應是什麼樣子。 SVG 格式允許我們建立強大的向量圖形,以便在 Web 上使用。

為了讓您瞭解兩者之間的區別,讓我們來看一個例子。您可以在我們的 GitHub 倉庫中找到這個示例,網址為 vector-versus-raster.html — 它並排顯示了兩個看似相同的影像,一個紅色星星帶有一個黑色陰影。區別在於左邊是 PNG,右邊是 SVG 影像。

當您放大頁面時,差異變得顯而易見 — PNG 影像在您放大時會變得畫素化,因為它包含每個畫素的位置(以及顏色)資訊。當它被放大時,每個畫素的大小都會增加,以填充螢幕上的多個畫素,因此影像開始變得塊狀。然而,向量影像仍然看起來清晰銳利,因為無論它有多大,都會使用演算法來計算影像中的形狀,並且值會隨著它變得更大而進行縮放。

Two star images

Two star images zoomed in, one crisp and the other blurry

注意:上面的影像實際上都是 PNG — 左邊的星星在每種情況下都代表光柵影像,右邊的星星代表向量影像。再次,請訪問 vector-versus-raster.html 演示以檢視真實示例!

此外,向量影像檔案比光柵影像檔案輕得多,因為它們只需要儲存少量演算法,而不是每個畫素的資訊。

什麼是 SVG?

SVG 是一種基於 XML 的向量影像描述語言。它本質上是標記語言,類似於 HTML,只是它提供了許多不同的元素來定義影像中要顯示的形狀以及要應用於這些形狀的效果。SVG 用於標記圖形,而不是內容。SVG 定義了用於建立基本形狀的元素,如 <circle><rect>,以及用於建立更復雜形狀的元素,如 <path><polygon>。更高階的 SVG 功能包括 <feColorMatrix>(使用變換矩陣變換顏色)、<animate>(動畫化向量圖形的部分)和 <mask>(在影像頂部應用蒙版)。

作為基本示例,以下程式碼建立了一個圓形和一個矩形

html
<svg
  version="1.1"
  baseProfile="full"
  width="300"
  height="200"
  xmlns="http://www.w3.org/2000/svg">
  <rect width="100%" height="100%" fill="black" />
  <circle cx="150" cy="100" r="90" fill="blue" />
</svg>

這將生成以下輸出

從上面的示例中,您可能會認為 SVG 很容易手工編碼。是的,您可以使用文字編輯器手工編碼簡單的 SVG,但對於複雜的影像來說,這很快就會變得非常困難。對於建立 SVG 影像,大多數人使用向量圖形編輯器,例如 InkscapeIllustrator。這些軟體包允許您使用各種圖形工具建立各種插圖,並建立照片的近似值(例如 Inkscape 的 Trace Bitmap 功能)。

除了迄今為止描述的那些優點之外,SVG 還有一些其他優點

  • 向量影像中的文字保持可訪問性(這也對您的 SEO 有益)。
  • SVG 非常適合樣式化/指令碼化,因為影像的每個元件都是一個元素,可以透過 CSS 樣式化或透過 JavaScript 指令碼化。

那麼為什麼有人想使用光柵圖形而不是 SVG 呢?嗯,SVG 也有一些缺點

  • SVG 可能會很快變得複雜,這意味著檔案大小會增加;複雜的 SVG 在瀏覽器中也可能需要大量的處理時間。
  • 根據您要建立的影像型別,SVG 可能比光柵影像更難建立。

出於上述原因,光柵圖形可能更適合於像照片這樣的複雜精密影像。

注意:在 Inkscape 中,將檔案儲存為 Plain SVG 以節省空間。此外,請參閱這篇 文章,介紹如何為 Web 準備 SVG

將 SVG 新增到您的頁面

在本節中,我們將介紹將 SVG 向量圖形新增到網頁的不同方法。

快速方法:img 元素

要透過 <img> 元素嵌入 SVG,您只需在 src 屬性中引用它,就像您預期的那樣。您將需要一個 heightwidth 屬性(或者兩者都有,如果您的 SVG 沒有固有的 縱橫比)。如果您還沒有這樣做,請閱讀 HTML 中的影像

html
<img
  src="equilateral.svg"
  alt="triangle with all three sides equal"
  height="87"
  width="100" />

優點

  • 快速、熟悉的影像語法,在 alt 屬性中提供內建的文字等效項。
  • 您可以透過將 <img> 巢狀在 <a> 元素中,輕鬆地將影像變成超連結。
  • SVG 檔案可以被瀏覽器快取,從而導致將來使用該影像的任何頁面載入速度更快。

缺點

  • 您無法使用 JavaScript 操作影像。
  • 如果您想使用 CSS 控制 SVG 內容,您必須在 SVG 程式碼中包含內聯 CSS 樣式。(從 SVG 檔案呼叫的外部樣式表不起作用。)
  • 您無法使用 CSS 偽類(如 :focus)重新設定影像樣式。

故障排除和跨瀏覽器支援

對於不支援 SVG 的瀏覽器(IE 8 及更低版本,Android 2.3 及更低版本),您可以從 src 屬性中引用 PNG 或 JPG,並使用 srcset 屬性(僅最近的瀏覽器識別)來引用 SVG。這樣一來,只有支援的瀏覽器才會載入 SVG - 較舊的瀏覽器將載入 PNG 而不是 SVG。

html
<img
  src="equilateral.png"
  alt="triangle with equal sides"
  srcset="equilateral.svg" />

您也可以將 SVG 用作 CSS 背景影像,如下所示。在以下程式碼中,較舊的瀏覽器將堅持使用它們理解的 PNG,而較新的瀏覽器將載入 SVG

css
background: url("fallback.png") no-repeat center;
background-image: url("image.svg");
background-size: contain;

與上面描述的 <img> 方法一樣,使用 CSS 背景影像插入 SVG 意味著無法使用 JavaScript 操作 SVG,並且還受到相同的 CSS 限制。

如果您的 SVG 根本沒有顯示出來,可能是因為您的伺服器沒有正確設定。如果是這種情況,這篇 文章將為您指明正確的方向

如何在 HTML 中包含 SVG 程式碼

您也可以在文字編輯器中開啟 SVG 檔案,複製 SVG 程式碼,然後將其貼上到 HTML 文件中 - 這有時稱為將您的 SVG 內聯,或 內聯 SVG。確保您的 SVG 程式碼片段以 <svg> 開始標籤開頭,並以 </svg> 結束標籤結尾。這是一個非常簡單的示例,說明您可能貼上到文件中的內容

html
<svg width="300" height="200">
  <rect width="100%" height="100%" fill="green" />
</svg>

優點

  • 將您的 SVG 內聯可以節省一個 HTTP 請求,因此可以稍微縮短載入時間。
  • 您可以將 classid 分配給 SVG 元素,並使用 CSS 為其設定樣式,無論是在 SVG 內還是在您放置 HTML 文件的 CSS 樣式規則的位置。實際上,您可以將任何 SVG 表現屬性 用作 CSS 屬性。
  • 內聯 SVG 是唯一一種允許您在 SVG 影像上使用 CSS 互動(如 :focus)和 CSS 動畫的方法(即使在您的常規樣式表中也是如此)。
  • 您可以透過將 SVG 標記包裝在 <a> 元素中,將其變成超連結。

缺點

  • 此方法僅適用於您只在一個地方使用 SVG 的情況。重複會導致資源密集型維護。
  • 額外的 SVG 程式碼會增加 HTML 檔案的大小。
  • 瀏覽器無法像快取常規影像資產那樣快取內聯 SVG,因此包含該影像的頁面在載入包含該影像的第一個頁面後不會載入得更快。
  • 您可以在 <foreignObject> 元素中包含回退,但支援 SVG 的瀏覽器仍然會下載任何回退影像。您需要權衡額外的開銷是否真正值得,僅僅是為了支援過時的瀏覽器。

如何使用 iframe 嵌入 SVG

您可以像網頁一樣在瀏覽器中開啟 SVG 影像。因此,使用 <iframe> 嵌入 SVG 文件就像我們在 從 <object> 到 <iframe> - 其他嵌入技術 中學習的那樣。

這是一個快速回顧

html
<iframe src="triangle.svg" width="500" height="500" sandbox>
  <img src="triangle.png" alt="Triangle with three unequal sides" />
</iframe>

這絕對不是最好的選擇

缺點

  • iframe 確實具有回退機制,如您所見,但瀏覽器只有在完全不支援 iframe 的情況下才會顯示回退。
  • 此外,除非 SVG 和您的當前網頁具有相同的 來源,否則您無法使用主網頁上的 JavaScript 來操作 SVG。

主動學習:玩轉 SVG

在本節的主動學習中,我們希望您嘗試玩一些 SVG 來娛樂一下。在下面的“輸入”部分中,您會看到我們已經為您提供了一些示例來幫助您入門。您也可以訪問 SVG 元素參考,詳細瞭解您可以在 SVG 中使用的其他工具,並嘗試一下。本節的重點是練習您的研究技能,並享受樂趣。

如果您遇到困難,無法使程式碼正常執行,您可以隨時使用“重置”按鈕將其重置。

總結

本文為您快速介紹了向量圖形和 SVG 是什麼、為什麼它們非常有用以及如何在網頁中包含 SVG。它從未打算成為學習 SVG 的完整指南,而只是一個指示,以便您在瀏覽 Web 時遇到 SVG 時知道它是什麼。因此,如果您不覺得自己已經是 SVG 專家了,請不要擔心。我們在下面提供了一些連結,如果您想了解更多有關其工作原理的資訊,這些連結可能會有所幫助。

在本模組的最後一篇文章中,我們將詳細探討 自適應影像,看看 HTML 提供了哪些工具來幫助您使影像在不同裝置上執行得更好。

另請參見