【问题标题】:Clone root element retrieved by Snap.load()克隆由 Snap.load() 检索的根元素
【发布时间】:2017-07-28 14:36:46
【问题描述】:

我目前正在努力弄清楚如何重新使用加载的 SVG 文件,而不是每次需要时都加载它。

Snap.load('app/pages/map/desk.svg', function(svg) {
    desk = svg;
});

但是,当我附加这个桌面变量时,它只在第一次工作,我发现我需要克隆 svg 才能重新使用它。 (reusing snap.svg loaded svg into different elements)

不幸的是 svg.clone() 不存在,我无法执行类似 svg.select('whatever').clone() 的操作,因为我加载的 svg 是根元素。

我只是想要能够做到desk = svg.clone();

有谁知道我如何做到这一点?

【问题讨论】:

  • 您是否尝试在添加它之后克隆它?您也可以将 svg 放入 defs 元素中,并使用“use”元素来引用它,这样会更简洁。

标签: snap.svg


【解决方案1】:

我在 svg 周围放置了一个 <defs> 元素,然后我选择了嵌套的 svg,然后,每次我附加 svg 时,我都会在其上调用 clone。

我的 .svg 来自这个:

<svg>...</svg>

到这里:

<defs><svg>...</svg></defs>

我的代码现在看起来像这样:

// Load the .svg
Snap.load('app/pages/map/desk.svg', function(svg) {
    desk = svg.select('svg');
});

// Append it somewhere
group.append(desk.clone());

感谢您的帮助@Ian

【讨论】:

  • 如果它在 defs 语句中,我不确定您是否需要继续克隆它。您可能可以使用 toDefs()/use() 来引用它,例如 svg.dabbles.info/snaptut-todefs,它只有一个副本,但有 2 个单独的动画。否则,您最终会得到许多相同 svg 的副本。当然,如果您正在修改它们或其他东西,您可能需要很多副本。
  • 那它的性能有区别吗?有什么不同?另外,您是否参与了 ​​snap 的开发?为什么没有.toElement()selectRoot()这样的东西
  • 主要区别在于 DOM 中只有一个副本,因此假设您有 100 个复杂的 svg,那里的混乱会更少。至于它是否更高效,总是很难说,因为它通常取决于浏览器的实现。我不是 Snap 开发人员,但玩过它。不确定你想要 toElement 做什么,或者 selectRoot() 专门做什么,但通常有一种方法可以做任何不太难的事情。
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 2021-12-31
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2013-03-08
相关资源
最近更新 更多