bob*_*zzo 5 javascript vis.js angular
我正在使用vis.js库,并通过svg标签使用自定义 HTML 呈现节点。
我的在线项目位于:https : //stackblitz.com/edit/visjs-with-angular
我遇到的问题是,当我试图将图像添加到div,这是内部的svg。
您可以vis.component.ts在我的项目的“app\app\vis”文件夹中看到 及其关联的 HTML 视图文件。
在drawSvgNetwork()函数中,您将看到我构建 SVG 的位置。我想我可以添加一个<i>带有的标签background-image url,但是当 vis.js 渲染节点时它似乎没有渲染:
var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="390" height="65">' +
'<rect x="0" y="0" width="100%" height="100%" fill="#7890A7" stroke-width="20" stroke="#ffffff" ></rect>' +
'<foreignObject x="15" y="10" width="100%" height="100%">' +
'<div xmlns="http://www.w3.org/1999/xhtml" style="font-family:Arial; font-size:30px">' +
' <em>I</em> am' +
'<span style="color:white; text-shadow:0 0 20px #000000;">' +
' HTML in SVG!</span>' +
// * THIS IMAGE IS NOT RENDERING *
'<i style="background-image: url(https://openclipart.org/download/280615/July-4th-v2B.svg);"></i>' +
'</div>' +
'</foreignObject>' +
'</svg>';Run Code Online (Sandbox Code Playgroud)
即这是您在运行我的在线项目时将看到的内容。
*以供参考:
完整的在线示例在:https : //visjs.github.io/vis-network/examples/ 具体的演示页面在这里(查看源代码查看js代码):https : //visjs.github.io/vis -network/examples/network/nodeStyles/HTMLInNodes.html
看起来visjs不可能在 SVG 中加载外部图像,也不可能<foreignObject>在<Image>标签中。这是 github 上问题的一个未解决的问题:图像标签未加载到 svg 中
存储库的维护者回答说这是不可能的。
可以在同一个线程中找到解决方法(但它可能不适合您):想法是单独加载图像并将其呈现为 dataUrl
加载 svg 图像并将其转换为 dataUrl:
loadImage(url) {
const img = new Image();
img.crossOrigin = "anonymous";
img.src = url;
return Observable.fromEvent(img, 'load')
.map((e: Event) => {
const canvas = document.createElement('canvas');
canvas.getContext('2d').drawImage(e.target as HTMLImageElement, 0, 0);
const dataURL = canvas.toDataURL();
return dataURL;
})
}
Run Code Online (Sandbox Code Playgroud)
使用获取的 dataUrl 作为背景而不是直接的 svg 文件 url:
'<i style="background-image: url(' + dataUrl + '); display: inline-block; width: 40px; height: 20px; background-size: contain;"></i>' +
Run Code Online (Sandbox Code Playgroud)
这是更正后的项目https://stackblitz.com/edit/visjs-with-angular-m63jme(我还用另一个任意 svg 替换了原始项目中使用的 svg 文件,该文件包含美国国旗,以避免出现问题在FF中,见下文)
Firefox拥有与在画布上绘制一个SVG文件,当文件包含了一些问题width和height属性以百分比指定。有关更多详细信息,请参阅 SO 问题:1 , 2。所以一定要使用 svgwidth和height不是百分比的属性。