1. 程式人生 > >canvas與svg特性和使用對比

canvas與svg特性和使用對比

什麼是 Canvas?

HTML5 的 canvas 元素使用 JavaScript 在網頁上繪製圖像。

畫布是一個矩形區域,您可以控制其每一畫素。

canvas 擁有多種繪製路徑、矩形、圓形、字元以及新增影象的方法。

什麼是SVG?

  • SVG 指可伸縮向量圖形 (Scalable Vector Graphics)
  • SVG 用於定義用於網路的基於向量的圖形
  • SVG 使用 XML 格式定義圖形
  • SVG 影象在放大或改變尺寸的情況下其圖形質量不會有損失
  • SVG 是全球資訊網聯盟的標準

SVG 的優勢

與其他影象格式相比(比如 JPEG 和 GIF),使用 SVG 的優勢在於:

  • SVG 影象可通過文字編輯器來建立和修改
  • SVG 影象可被搜尋、索引、指令碼化或壓縮
  • SVG 是可伸縮的
  • SVG 影象可在任何的解析度下被高質量地列印
  • SVG 可在影象質量不下降的情況下被放大

SVG

SVG 是一種使用 XML 描述 2D 圖形的語言。

SVG 基於 XML,這意味著 SVG DOM 中的每個元素都是可用的。您可以為某個元素附加 JavaScript 事件處理器。

在 SVG 中,每個被繪製的圖形均被視為物件。如果 SVG 物件的屬性發生變化,那麼瀏覽器能夠自動重現圖形。

Canvas

Canvas 通過 JavaScript 來繪製 2D 圖形。

Canvas 是逐畫素進行渲染的。

在 canvas 中,一旦圖形被繪製完成,它就不會繼續得到瀏覽器的關注。如果其位置發生變化,那麼整個場景也需要重新繪製,包括任何或許已被圖形覆蓋的物件。

兩者比較一覽

Canvas Svg
基於畫素的(動態png) 基於形狀的
單個html元素 多種多樣的形狀dom元素
只能通過script修改 script和css都可以修改
事件模型和使用者互動需要使用畫素(x, y) 事件模型和使用者互動抽象到元素(rect, path)
繪圖面積小或者物件大於10k時性也能很好 繪圖面積很大或者物件小於10k的時候效能很好

使用場景舉例

  • svg
    1.靜態影象
    2.高保真文件(用於展示和列印)
  • canvas
    1.處理視訊
    2.複雜場景、實時複雜數學動畫
    3.基於影象位置的快速計算處理

圖表和圖形

svg和canvas都可以表現圖表(如柱狀圖, 散點圖, 餅圖等等), 在選擇開源的第三方庫繪圖的時候應該要注意根據使用場景來選擇

以下情況使用svg為佳:

  • 資料來源是或者類似xml(svg)文件
  • 需要使用者互動
  • 使用到css就可以滿足大部分樣式需求

但是如果需要更高的速度, 那麼需要使用canvas:

  • 地圖互動: 查詢路徑
  • 複雜工程流程圖
  • 網頁遊戲

Canvas和SVG的不同:

Canvas

  • 依賴解析度
  • 不支援事件處理器
  • 弱的文字渲染能力
  • 能夠以 .png 或 .jpg 格式儲存結果影象
  • 最適合影象密集型的遊戲,其中的許多物件會被頻繁重繪
  • 是新出的html5標籤

SVG

  • 不依賴解析度
  • 支援事件處理器
  • 最適合帶有大型渲染區域的應用程式(比如谷歌地圖)
  • 複雜度高會減慢渲染速度(任何過度使用 DOM 的應用都不快)
  • 不適合遊戲應用
  • 是xml標籤,很早就已經有了

在HTML5中的直接使用

     <!--老版本的svg的用法-->
     <iframe src="01.svg" width="300" height="100"></iframe>
     <!-- H5 新增了svg的標籤-->
        <svg width="400px" height="400px">
            <rect x="10" y="10" width="100" height="100" fill="blue" stroke="black" stroke-width="10" />
            <rect x="120" y="120" width="100" height="100" style="fill:green;stroke:red;stroke-width: 20;"/>
        </svg>