<use> 标记以从外部网址加载 SVG



我想使用<use>标签从外部URL加载svg,这样我就可以对我的svg而不是<img>标签有更多的控制权。但当我在同一个页面上使用svg并使用<use>标签加载时,它的工作非常完美。但由于我正在将svg上传到外部URL并将URL放入<use>中,所以它不起作用。

工作示例代码

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display: none;">
<defs>
<g id="icon-image">
<path class="path1" d="M0 4v26h32v-26h-32zM30 28h-28v-22h28v22zM22 11c0-1.657 1.343-3 3-3s3 1.343 3 3c0 1.657-1.343 3-3 3-1.657 0-3-1.343-3-3zM28 26h-24l6-16 8 10 4-3z"></path>
</defs>
</svg>
<h1>
Photo Gallery
<svg viewBox="0 0 32 32">
<use fill="blue" xlink:href="#icon-image"></use>
</svg>
</h1>

但我想要这样的东西(不起作用(。我已经在外部URL上传了相同的svg图像,但它没有显示在页面上。

<h1>
Photo Gallery
<svg viewBox="0 0 32 32">
<use fill="blue" xlink:href="https://cdn.jsdelivr.net/gh/instanano/apparatus/test555.svg#icon-image"></use>
</svg>
</h1>

正如@Robert Longson已经指出的:
由于安全设置,您可能无法嵌入外部svg符号/defs引用。

如果外部主机允许对svg文件进行跨源访问,则可以使用以下polyfill:

  • polyfill by@thasmo
  • svgxuse by@Keyamoon(icomoon开发者(

jsdelivr等脚本库专用的CDN通常会添加合适的CORS头(或提供一些选项以允许跨源访问(。

另一方面:像svgshare这样的svg共享站点不允许远程访问(但它适用于<img>元素,但您将无法获取和解析svgDOM(。

示例1:使用@thasmo的外部svg-polyfill

由于某些原因,这个polyfill在iOs safari上的SO片段中不起作用

window.document.addEventListener('DOMContentLoaded', function() {
new ExternalSvgPolyfill();
});
svg {
display: inline-block;
width: 25%;
border: 1px solid #ccc
}
<!--  works! -->
<svg viewBox="0 0 32 32">
<use fill="blue" xlink:href="https://cdn.jsdelivr.net/gh/instanano/apparatus/test555.svg#icon-image" />
</svg>
<!--won't work -->
<svg viewBox="0 0 32 32">
<use fill="blue" xlink:href="https://svgshare.com/i/mJH.svg#icon-image" />
</svg>
<script src="https://cdn.jsdelivr.net/npm/@thasmo/external-svg-polyfill@2/browser/bundle.min.js"></script>

示例2:使用@Keyamoon的svgxuse

svg{
display:inline-block;
width:25%;
border: 1px solid #ccc
}
<svg viewBox="0 0 32 32">
<use fill="blue" href="https://cdn.jsdelivr.net/gh/instanano/apparatus/test555.svg#icon-image" />
</svg>
<svg viewBox="0 0 32 32">
<use fill="blue" xlink:href="https://svgshare.com/i/mJH.svg#icon-image" />
</svg>
<script src="https://cdnjs.cloudflare.com/ajax/libs/svgxuse/1.2.6/svgxuse.min.js"></script>

两个polyfill都获取外部svg内容,并将其作为隐藏的内联<svg>元素附加到DOM中。

另请参阅:(了解CORS和SVG(

最新更新