標籤:

SVG 與 HTML5 的 canvas 各有什麼優點,哪個更有前途?


Canvas是使用JavaScript程序繪圖(動態生成),SVG是使用XML文檔描述來繪圖。

從這點來看:SVG更適合用來做動態交互,而且SVG繪圖很容易編輯,只需要增加或移除相應的元素就可以了。

同時SVG是基於矢量的,所有它能夠很好的處理圖形大小的改變。Canvas是基於點陣圖的圖像,它不能夠改變大小,只能縮放顯示;所以說Canvas更適合用來實現類似於Flash能做的事情(當然現在Canvas與Flash相比還有一些不夠完善的地方)。

關於最後一點二者誰更有前途:從上面我們可以知道二者是有不同用途的,作為一個開發者,你應該做的是理解應用程序的具體需求並選擇正確的技術來實現它。


這兩種技術都搞過,幾年前寫過SVG,最近研究Canvas,兩者各有各的適用範圍:

Canvas適用場景

Canvas提供的功能更原始,適合像素處理,動態渲染和大數據量繪製

SVG適用場景

SVG功能更完善,適合靜態圖片展示,高保真文檔查看和列印的應用場景

下面的內容引自:HTML5之圖形繪製技術(Canvas Vs SVG)

Canvas和SVG是HTML5中主要的2D圖形技術,前者提供畫布標籤和繪製API,後者是一整套獨立的矢量圖形語言,成為W3C標準已經有十多年(2003.1至今),總的來說,Canvas技術較新,從很小眾發展到廣泛接受,注重柵格圖像處理,SVG則歷史悠久,很早就成為國際標準,複雜,發展緩慢(Adobe SVG Viewer近十年沒有大的更新)

Canvas vs SVG

&和&都是HTML5推薦使用的圖形技術,Canvas基於像素,提供2D繪製函數,是一種HTML元素類型,依賴於HTML,只能通過腳本繪製圖形;SVG為矢量,提供一系列圖形元素(Rect, Path, Circle, Line …),還有完整的動畫,事件機制,本身就能獨立使用,也可以嵌入到HTML中,SVG很早就成為了國際標準,目前的穩定版本是1.1 – Scalable Vector Graphics (SVG) 1.1 (Second Edition),兩者的主要特點見下面的表格:

SVG與Canvas主要特點

根據兩者的不同特點,Canvas和SVG有各自的適用範圍

Canvas適用場景

Canvas提供的功能更原始,適合像素處理,動態渲染和大數據量繪製

SVG適用場景

SVG功能更完善,適合靜態圖片展示,高保真文檔查看和列印的應用場景


存在意味著合理 不如問兩者分別適合什麼場景 canvas是個像素庫 繪製完了基本不記錄過程 更快 svg建立了一大堆可交互對象 本性長於交互 但性能會弱些 但這種界限也在被一些js庫打破 如fabric.js 以及百度林峰的zRender 這些庫在canvas上構建一層mvc層 可以如svg一樣操作和交互 性能上往往比原生svg要好一些 正如此 在基於zRender的可視化庫可以繪製數萬個點 倘使用svg 早掛了。而webgl-canvas實時繪點是百萬級的 所以看你的場景 如果pc端強交互少元素 svg勝出 | pc端弱交互而強性能 用canvas | pc端超強性能 webgl-canvas | 移動端弱交互 原生canvas挺好(木有ie的世界真好) | 移動端強交互 剛才提到的一些基於canvas的庫不錯(svg性能很挫) sorry這是個設備和需求的二維表 偷懶了。 個人的經驗 有誤請拍


http://msdn.microsoft.com/zh-cn/library/ie/gg193983(v=vs.85).aspx


對於開發人員而言,最直觀的區別在於:

1.對於畫在Canvas上的部件,你需要處理重繪。而SVG則不用,你修改svg dom則系統會自動幫你重繪

2.Hittest,即canvas不負責幫你偵測滑鼠/觸摸事件發生在哪一個圖形元件上;而svg可以。

3.Canvas效率高得多

如果還不夠直觀,可以找一些類比:

canvas的工作方式就像傳統的2d圖形引擎比如GDI;而SVG的工作方式更像WPF(XAML)、HTML/CSS這類由標記控制的繪圖引擎


不說優點,兩者都可以完成對方不能完成的動畫。各具優點,本人推薦使用 SVG 來做一下小 LOGO,Canvas 則主要針對比較複雜的動畫。SVG 更多可以參考:

SVG 動畫精髓

TL;DR

本文主要是講解關於 SVG 的一些高級動畫特效,比如 SVG 動畫標籤,圖形漸變,路徑動畫,線條動畫,SVG 裁剪等。

例如:路徑動畫

http://demo.icanbecreative.com/animate-along-svg-path/svg-animate-along-path-600.gif

圖形漸變:

http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2014/08/1407310358spinner-cropped.gif

線條動畫:

以及,相關的動畫的矩陣知識,這個也是現在 CSS 動畫裡面最重要,同時也是最為欠缺的知識點:

文章會先從基本語法入手,然後,慢慢深入。介紹一些動畫基本原理和對應的數學原理知識點。並且文章後面,還附有相關語法的介紹,當你在遇到不熟悉語法的時候可以參考參考。

前面一篇文章,主要介紹了一些 SVG 的基本概念和基本圖形。接下來我們需要了解一下,SVG 處理矢量這個特性之外,還有啥內容吸引我們,能讓 SVG 現在普及度這麼高?

完整版可以關於我的公眾號:前端小吉米。

分享吉米的前端路,後面也會定期推出當前熱門的前端技術~ 比如,直播,VR

文章詳細目錄為:

  • SVG Animation
  • animate morph
  • animateMotion
  • set
  • 矩陣動畫
  • 矩陣高級用法
  • 線條動畫
  • SVG 文字
  • text-anchor
  • tspan
  • 在 Path 展示 text
  • Clip


Canvas

  • 依賴解析度
  • 不支持事件處理器
  • 弱的文本渲染能力
  • 能夠以 .png 或 .jpg 格式保存結果圖像
  • 最適合圖像密集型的遊戲,其中的許多對象會被頻繁重繪

SVG

  • 不依賴解析度
  • 支持事件處理器
  • 最適合帶有大型渲染區域的應用程序(比如谷歌地圖)
  • 複雜度高會減慢渲染速度(任何過度使用 DOM 的應用都不快)
  • 不適合遊戲應用

總結來w3shool.


我是這樣理解的:瀏覽器就是一個自動化的canvas 實時渲染svg格式圖形

以canvas為基礎開發的圖表插件 也是對內部矢量圖形格式進行渲染

做圖表

想要折騰就用canvas

簡單美觀

就用svg

另外svg當然不適合做遊戲

萬一哪天 瀏覽器直接進化為3d渲染引擎 直接拖個3d格式文件進來就能看 也未嘗不可

現階段只是用canvas來做渲染引擎


手機上可能還是SVG更合適一些。


我覺得SVG在"遙遠"的將來更有前途


SVG跟Canvas的關係就像幾何與美術

So,你覺得哪個更有前途?


看了 @sand no 的答案我覺得Canvas與SVG的區別可能可以類比為Word和PDF的區別,場景上、功能上都應該比較形象,哈哈。

-----------------------------------------------------------------------

Canvas 和 SVG 都允許您在瀏覽器中創建圖形,但是它們在根本上是不同的。

SVG

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

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

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

Canvas

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

Canvas 是逐像素進行渲染的。

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

Canvas 與 SVG 的比較

下表列出了 canvas 與 SVG 之間的一些不同之處。

Canvas

  • 依賴解析度
  • 不支持事件處理器
  • 弱的文本渲染能力
  • 能夠以 .png 或 .jpg 格式保存結果圖像
  • 最適合圖像密集型的遊戲,其中的許多對象會被頻繁重繪

SVG

  • 不依賴解析度
  • 支持事件處理器
  • 最適合帶有大型渲染區域的應用程序(比如谷歌地圖)
  • 複雜度高會減慢渲染速度(任何過度使用 DOM 的應用都不快)
  • 不適合遊戲應用

引用自w3School


svg,圖像保真更適合網站頁面視覺傳達。


就我現在所看見的canvas的應用率要比svg高處很多 個人覺得canvas比較有前途吧


如果是只能挑一樣來學,還是建議svg,別問為什麼.


推薦閱讀:

TAG:HTML5 | Canvas | SVG |