在HTML5画布上绘制带有CSS样式的SVG

在HTML5画布上绘制带有CSS样式的SVG,css,html,canvas,svg,nvd3.js,Css,Html,Canvas,Svg,Nvd3.js,我正在使用NVD3在web应用程序中生成图表。所有图表都是SVG 我想通过在画布对象上绘制这些图表来将它们转换为图像。但是,由于图表的外观取决于CSS样式(包含在NVD3中),因此生成的图像与应用程序中呈现的图表不同 在将SVG绘制到画布时,有什么方法可以保留CSS样式吗?这可以通过在SVG定义本身中为CSS文件提供CDATA标记来实现。例如: <svg xmlns="http://www.w3.org/2000/svg"> <style type="text/css"&

我正在使用NVD3在web应用程序中生成图表。所有图表都是SVG

我想通过在画布对象上绘制这些图表来将它们转换为图像。但是,由于图表的外观取决于CSS样式(包含在NVD3中),因此生成的图像与应用程序中呈现的图表不同


在将SVG绘制到画布时,有什么方法可以保留CSS样式吗?

这可以通过在SVG定义本身中为CSS文件提供
CDATA
标记来实现。例如:

<svg xmlns="http://www.w3.org/2000/svg">

  <style type="text/css">
    <![CDATA[
        .some-class {
            opacity: 1;
        }
    ]]>
  </style>

</svg>

这可以通过在SVG定义本身中为CSS文件提供
CDATA
标记来实现。例如:

<svg xmlns="http://www.w3.org/2000/svg">

  <style type="text/css">
    <![CDATA[
        .some-class {
            opacity: 1;
        }
    ]]>
  </style>

</svg>


可能将其绘制到隐藏的画布上,然后使用HTML2Image?-我不知道一个简单的解决方案,但可能有一个。如果你有多个源,并且取决于你的CSS规则是如何设置的,那就有点复杂了。例如,您可以在将样式的cssText呈现到画布之前将其复制到svg元素中,但是如果您有类似于
body>svg
的规则,那么在画布上绘制所需的
img
元素中,该规则将不再匹配。我甚至不谈论你甚至无法解析的外部CSS样式表(来自其他服务器)。。。因此,另一种解决方案是内联所有svg节点的非默认
getComputedStyle(svgElement)
。可以是内存消耗者。该注释假设您确实使用
drawImage
在画布上绘制svg。否则,您也可以尝试一些类似canvg的东西,但我不知道它们现在在CSS规则方面有多好,我记得它们有一些问题。@kaido内联这些样式看起来确实很有希望,因为它们非常简单,并且直接作用于SVG节点本身。假设它们可以作为字符串使用,那么应该在SVG树本身的什么位置包含它们?通常位于defs节点中SVG根的顶部。我以前写过一些可能对你有帮助的东西,但我一直在努力解决这个问题,从来没有花时间去解决它。但在您的特定情况下,它可能会有所帮助:可能会将其绘制到隐藏的画布上,然后使用HTML2Image?-我不知道一个简单的解决方案,但可能有一个。如果你有多个源,并且取决于你的CSS规则是如何设置的,那就有点复杂了。例如,您可以在将样式的cssText呈现到画布之前将其复制到svg元素中,但是如果您有类似于
body>svg
的规则,那么在画布上绘制所需的
img
元素中,该规则将不再匹配。我甚至不谈论你甚至无法解析的外部CSS样式表(来自其他服务器)。。。因此,另一种解决方案是内联所有svg节点的非默认
getComputedStyle(svgElement)
。可以是内存消耗者。该注释假设您确实使用
drawImage
在画布上绘制svg。否则,您也可以尝试一些类似canvg的东西,但我不知道它们现在在CSS规则方面有多好,我记得它们有一些问题。@kaido内联这些样式看起来确实很有希望,因为它们非常简单,并且直接作用于SVG节点本身。假设它们可以作为字符串使用,那么应该在SVG树本身的什么位置包含它们?通常位于defs节点中SVG根的顶部。我以前写过一些可能对你有帮助的东西,但我一直在努力解决这个问题,从来没有花时间去解决它。但在您的特殊情况下,它可能会有所帮助: