将img.src设置为动态svg元素

Pat*_*lug 7 html svg

我知道我可以将svg文件设置为srcHTML img元素,如下所示:

<img src="mySVG.svg"/>
Run Code Online (Sandbox Code Playgroud)

但我不知怎么设置动态SVG元素作为srcimg

<svg id="mySVGElement">
    ...
</svg>

<img src="?"/>
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 15

你可以用JavaScript做到这一点:

var svg = document.querySelector('svg'),
    img = document.querySelector('img');

setImageToSVG(img,svg);

function setImageToSVG(img,svg){
  var xml = (new XMLSerializer).serializeToString(svg);
  img.src = "data:image/svg+xml;charset=utf-8,"+xml;
}?
Run Code Online (Sandbox Code Playgroud)

如果您的SVG元素是动态的(更改),那么每次SVG元素更改时您都需要重新运行此代码.

演示:http://jsfiddle.net/3PfcC/


或者,这是一个演示@ Robert的答案的演示,使用另一个<svg>元素来引用第一个,live:

演示:http://jsfiddle.net/3PfcC/3/

<svg id="src" xmlns="http://www.w3.org/2000/svg" …>
  <!-- Your SVG here -->
</svg>

<svg xmlns="http://www.w3.org/2000/svg" xmlns:x="http://www.w3.org/1999/xlink" …>
  <use x:href="#src" x="80" y="30" width="100" height="100" />
</svg>
Run Code Online (Sandbox Code Playgroud)

该演示还显示您可以调整大小并以其他方式转换引用的SVG文档,并且引用实时的:对原始的更改会立即反映在<use>.

  • FireFox 似乎对带有主题标签的 SVG 存在问题(如此处,fill="#900"),因为它将其读取为 svg 的末尾,我们需要将其替换为“%23”。这适用于 Chrome 和 FireFox:http://jsfiddle.net/taaf9ah7/2/ (2认同)
  • 在您的演示中,图像是损坏的图像。这曾经有效,现在在 Chrome 中无效。似乎 Chrome 将 SVG 的某些内容更改为 new Image().src,它曾经触发我的 .onload 处理程序,现在改为触发我的 .onerror 处理程序......不知道为什么会突然改变 (2认同)
  • @EzraSteinmetz您的演示此时仍能正常工作 (2认同)
  • 2020 年,该解决方案不适用于 Chrome 或 Firefox img.src = "data:image/svg+xml;base64,"+btoa(xml); 修复它(作为下面的问题添加) (2认同)

tru*_*ru7 8

这更新了 Phrogz 接受的答案(8 年后!)

该示例在 Chrome 或 Firefox 上不起作用(图像显示已损坏)更改为

  img.src = "data:image/svg+xml;base64,"+btoa(xml);
Run Code Online (Sandbox Code Playgroud)

我不确定原件停止工作的原因,但这可能有助于有人登陆这里。