5

我正在构建一个将 svg 图标呈现到 Shadow Dom 页面上的 Web 组件。IE

<ba-icon i="airplane"></ba-icon>

我有一个外部 svg sprite 文件,其中包含大量 SVG 图标。

Web 组件的内部将以下内容渲染到 Shadow Dom 中:

<svg>
    <use xlink:href="i.dist.svg#i-airplane"></use>
<svg>

一切都在屏幕上正确呈现,但我在寻找嵌入在 SVG 中的一些信息,特别是 , 中包含的信息viewbox(例如:)viewBox="0 0 32 32"

我知道在 中渲染的use内容也会输入到 Shadow Dom 中。但我试图找到另一种方法来获取嵌入到use. 我试图对 svg 的内容进行 ajax 处理,但这对于页面上的多个图标来说变成了一个大问题,因为 Web 组件的每个实例现在都在进行该调用。我还能怎么做?

以供参考:

在此处输入图像描述

4

2 回答 2

3

实际上有很多方法可以实现这一点,具体取决于您使用的 SVG 文件的结构以及您想要做什么。

使用 SVG sprites 作为外部文件,您可以利用HTML Imports技术来解析文件:

<head>
...
  <link id="ic" rel="import" href="i.dist.svg">

  <script>
    document.registerElement( "ba-icon", { 
        prototype:  Object.create( HTMLElement.prototype, {
            createdCallback: {
                value: function () 
                {
                    var name = "i-" + this.getAttribute( 'i' )
                    var sh = this.createShadowRoot()
                    sh.innerHTML = '<svg><use xlink:href="i.dist.svg#' + name + '"/>'
                    this.setAttribute( "i-viewBox", ic.import.querySelector( 'svg#' + name ).getAttribute( "viewBox" ) )
                }
            }
        } )
    } )
  </script>
</head>

SVG 文件不会被导入两次,因为它被浏览器缓存。

注意:此解决方案(使用<use>)可能不是最快的,但它是最简单的编码和理解。这取决于您真正想要对属性做什么(以及何时)。

于 2016-07-15T15:56:58.390 回答
0

Chrome 80中删除了 HTML 导入。

使用Fetch() 之类的替代方法。

于 2020-06-17T18:28:26.627 回答