2012-03-03 74 views
3

我有下面的代码示例:我的HTML5 Canvas代码可以转换为SVG吗?

function drawCanvas() { 
     var canvas = document.getElementById("logoText"); 
     var c = canvas.getContext('2d'); 
     c.lineWidth = 1; 
     c.lineStyle = "#FFFFFF"; 
     c.fillRect(10, 10, 150, 40); 
     c.fillStyle = "#FFFFFF"; 
     c.font = "22px 'HelveticaNeue-Light','Helvetica Neue Light','Helvetica Neue',sans-serif" 
     c.fillText("Test", 20, 45); 
     hexstring1 = "\u2610"; 
     c.fillText(hexstring1, 20, 70); 
    } 

如果我想使用的同时支持SVG和Canvas然后我怎么可能把这段代码转换为使用SVG浏览器。

另外在画布上使用SVG会有什么优势或劣势?

+0

另请参阅http://stackoverflow.com/questions/8571294/method-to-convert-html5-canvas-to-svg和http://stackoverflow.com/questions/6918597/convert-canvas-or - 控制点到svg – 2012-03-05 12:20:24

回答

8

SVG是基于标记的,如HTML本身。所以你必须在SVG标签内插入DOM节点。你的例子大致转换为下面的代码。

您可以像使用其他任何节点一样使用JavaScript创建它,但请确保使用document.createElementNS('http://www.w3.org/2000/svg', 'rect');插入节点,而不是通常的document.createElement('div');

<svg xmlns="http://www.w3.org/2000/svg" 
    version="1.1" 
    viewbox="0 0 100 100"> 
    <rect x="10" y="10" width="150" height="40" style="stroke: #FFFFFF; stroke-width: 1px" /> 
    <text x="20" y="45" style="fill: #FFFFFF; font-family: 'HelveticaNeue-Light','Helvetica Neue Light','Helvetica Neue',sans-serif; font-size: 22px">Test</text> 
    <text x="20" y="70" style="fill: #FFFFFF; font-family: 'HelveticaNeue-Light','Helvetica Neue Light','Helvetica Neue',sans-serif; font-size: 22px">&#9744;</text> 

</svg> 

有使用SVG在画布的两大优势:

  • 你能缩放好得多。如果放大图像,则会出现更少的伪影。
  • 你可以让你的元素“可点击”。将HTML中的相同事件附加到SVG中的任何元素。因此,您可以使用SVG制作某种自定义按钮,附加一个点击处理程序并将其用作提交按钮。
1

您无法直接从画布转换为svg。您可以将画布绘图命令存储在堆栈中,然后可以生成路径数据字符串或使用DOM接口。查看路径数据结构here

+0

对不起。我的意思是转换只是在SVG中重新编码。也许我没有解释得很好。 – 2012-03-03 16:33:26

+0

这是一个好主意,使用这个库就是这样做的:http://jonobr1.github.io/two.js/ – michelpm 2013-05-31 21:17:35

+0

@michelpm看起来像一个很好的图书馆,因为统一apis可能是一个痛苦的后面。另一方面,我几乎总是只使用其中一种技术,所以处理一个API就足够了...... – philipp 2013-06-01 07:04:06

相关问题