如何使用 SVG.js 导入预生成的 SVG 图案?

How can I import pre-generated SVG patterns using SVG.js?

我想利用现有的 SVG 模式库(例如,https://philiprogers.com/svgpatterns)而不必重建它们。但我很难理解如何导入原始 SVG 字符串。文档展示了如何在 canvas 上放置一些东西,但是在 JSFiddle 中一个小时后,我就是无法让它加载模式。任何帮助将不胜感激。

最终答案

最终代码:

// initialize SVG.js
var draw = SVG('drawing')

// Define the patterns. Multiple `svg()` calls don't clobber each other.
draw.defs().svg("<pattern id='chevrons' patternUnits='userSpaceOnUse' width='60' height='30'><svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='60' height='30'><defs><rect id='r' width='30' height='15' fill='white' stroke-width='2.5' stroke='black'/><g id='p'><use xlink:href='#r'/><use y='15' xlink:href='#r'/><use y='30' xlink:href='#r'/><use y='45' xlink:href='#r'/></g></defs><use xlink:href='#p' transform='translate(0 -25) skewY(40)'/><use xlink:href='#p' transform='translate(30 0) skewY(-40)'/></svg></pattern>")
draw.defs().svg("<pattern id='microbial' patternUnits='userSpaceOnUse' width='20' height=20><svg xmlns='http://www.w3.org/2000/svg' width='20' height='20'><rect width='40' height='40' fill='white'/><circle r='9.2' stroke-width='1' stroke='black' fill='none'/><circle cy='18.4' r='9.2' stroke-width='1px' stroke='black' fill='none'/><circle cx='18.4' cy='18.4' r='9.2' stroke-width='1' stroke='black' fill='none'/></svg></pattern")

// Load the pattern by id
var pattern = SVG.get('chevrons')

// Apply it
draw.circle(100).move(100, 50).stroke({width: 1, color: "black"}).fill(pattern)

这是 fiddle:https://jsfiddle.net/fr84e5g9/

谢谢,@fuzzyma!

svg.js v2

当您使用 svg() 方法导入 svg 字符串时,您不会取回您导入的元素。想象一下你像这样导入了 2 个矩形:

draw.svg('<rect/><rect/>')

你无法取回 2 个矩形。这就是为什么您返回调用 svg 方法的元素,在您的示例中为 draw

所以,首先将模式导入 defs:

draw.defs().svg('<pattern id="someId">....</pattern>') 

然后通过其 id 检索它:

var pattern = SVG.get('someId')

并使用填充

rect.fill(pattern)

请确保查看生成的代码。您可以在打开每个浏览器的开发人员工具时简单地执行此操作。您会足够快地看到那里生成的内容以及如何使用它。

svg.jsv3

对于第 3 版,导入会产生一些不同的代码,但代码应该仍然有效。但是,要检索具有特定 id 的元素,请使用 SVG('#someId') 或类似的 css 选择器。