SVG 标签 <use> 在 Firefox 的聚合物组件中不起作用
SVG tag <use> doesn't work within polymer component in Firefox
这是一个例子:http://miriti.ru/svgtest/
如果您在任何浏览器中查看此示例,您会看到内部有两个带有绿色圆圈(标记为 "Symbol")的灰色方块。除了 Firefox(我正在 windows 和 mac os x 上测试 Firefox 35.0.1
。
这些 SVG 完全相同,但第二个 SVG 位于聚合物组件内。
GitHub 上的代码:https://github.com/miriti/svgtest
关于导致此问题的原因有什么建议吗?
我似乎找到了解决您的问题的方法。首先,用 <div id="content">
包装你的 <svg>
元素。这是必须的,因为后面我们会重新初始化这个div.
的内部内容
<template>
<div id="content">
<svg width="400" viewBox="0 0 400 400">
...
</svg>
</div>
</template>
然后在脚本部分执行以下 woodoo-magic:
domReady: function() {
this.async(function() {
this.injectBoundHTML(this.$.content.innerHTML, this.$.content);
}, this);
}
请不要抱怨这招的诡异:)
大功告成:FF满意了
使用 SVG 精灵我 运行 解决了与您描述的问题相似但不相同的问题。因此,我提出的建议并不完全是您问题的解决方案,但是您可以通过使用 iron-iconset-svg (https://elements.polymer-project.org/elements/iron-icons?active=iron-iconset-svg) 来完全避免此类问题,我认为它提供了 cleaner/easier 解决方案。它只是 SVG sprite sheet 的包装器,因此您几乎可以用相同的方式定义图标并将它们与 iron-icon 一起使用。
定义自定义图标集(直接放入页面或将其包裹在元素中+设置描述图标的名称,此处:'your-iconset-name')
<iron-iconset-svg name="your-iconset-name" size="24">
<svg>
<defs>
<g id="your-icon-name">
<rect x="12" y="0" width="12" height="24" />
<circle cx="12" cy="12" r="12" />
</g>
</defs>
</svg>
</iron-iconset-svg>
如果将它们包装起来,比如说 'your-custom-iconset',您可以像这样包含图标集:
<your-custom-iconset></your-custom-iconset>
使用图标
当您需要一个图标时,您只需包含 iron-icons (https://elements.polymer-project.org/elements/iron-icons) 并像这样放置它:
<iron-icon icon="your-iconset-name:your-icon-name"></iron-icon>
然后您可以给它一个 class 来应用样式并且不需要使用 'fill' 作为它的颜色,只需使用 'color'。
我在 Polymer 1.0 中修复它是这样的:
attached: function () {
//Fix "svg-use" in Firefox!! -> Properly bad for Performance (Issue: https://github.com/Polymer/polymer/issues/1182)
this.async(function () {
this.$.content.innerHTML = this.$.content.innerHTML;
}, this);
}
但我还没有在我的组件中使用绑定
这是一个例子:http://miriti.ru/svgtest/
如果您在任何浏览器中查看此示例,您会看到内部有两个带有绿色圆圈(标记为 "Symbol")的灰色方块。除了 Firefox(我正在 windows 和 mac os x 上测试 Firefox 35.0.1
。
这些 SVG 完全相同,但第二个 SVG 位于聚合物组件内。
GitHub 上的代码:https://github.com/miriti/svgtest
关于导致此问题的原因有什么建议吗?
我似乎找到了解决您的问题的方法。首先,用 <div id="content">
包装你的 <svg>
元素。这是必须的,因为后面我们会重新初始化这个div.
<template>
<div id="content">
<svg width="400" viewBox="0 0 400 400">
...
</svg>
</div>
</template>
然后在脚本部分执行以下 woodoo-magic:
domReady: function() {
this.async(function() {
this.injectBoundHTML(this.$.content.innerHTML, this.$.content);
}, this);
}
请不要抱怨这招的诡异:)
大功告成:FF满意了
使用 SVG 精灵我 运行 解决了与您描述的问题相似但不相同的问题。因此,我提出的建议并不完全是您问题的解决方案,但是您可以通过使用 iron-iconset-svg (https://elements.polymer-project.org/elements/iron-icons?active=iron-iconset-svg) 来完全避免此类问题,我认为它提供了 cleaner/easier 解决方案。它只是 SVG sprite sheet 的包装器,因此您几乎可以用相同的方式定义图标并将它们与 iron-icon 一起使用。
定义自定义图标集(直接放入页面或将其包裹在元素中+设置描述图标的名称,此处:'your-iconset-name')
<iron-iconset-svg name="your-iconset-name" size="24">
<svg>
<defs>
<g id="your-icon-name">
<rect x="12" y="0" width="12" height="24" />
<circle cx="12" cy="12" r="12" />
</g>
</defs>
</svg>
</iron-iconset-svg>
如果将它们包装起来,比如说 'your-custom-iconset',您可以像这样包含图标集:
<your-custom-iconset></your-custom-iconset>
使用图标
当您需要一个图标时,您只需包含 iron-icons (https://elements.polymer-project.org/elements/iron-icons) 并像这样放置它:
<iron-icon icon="your-iconset-name:your-icon-name"></iron-icon>
然后您可以给它一个 class 来应用样式并且不需要使用 'fill' 作为它的颜色,只需使用 'color'。
我在 Polymer 1.0 中修复它是这样的:
attached: function () {
//Fix "svg-use" in Firefox!! -> Properly bad for Performance (Issue: https://github.com/Polymer/polymer/issues/1182)
this.async(function () {
this.$.content.innerHTML = this.$.content.innerHTML;
}, this);
}
但我还没有在我的组件中使用绑定