SVG `use` 与外部源

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您的旅程每个阶段提供云产品。 立即开始使用 $200 免费信用!

还有一篇关于此主题的 较新的文章,涵盖了一些较新的信息。

内联 SVG 是一种使用 SVG 的绝佳方式,因为除了其他原因之外,构成图形的各个形状都可以被脚本化和设置样式。 这些形状就在 DOM 中。 但这是否意味着我们必须在每个页面上的 HTML 中定义这些形状? 不,我们可以使用 <use> 从其他地方引用它们。 理想情况下,这个“其他地方”应该是一个外部文件,**因为这意味着该文件可以被浏览器缓存**,效率!

这就是我的意思

<!-- `<use>` shape defined ON THIS PAGE somewhere else -->
<svg viewBox="0 0 100 100">
   <use xlink:href="#icon-1"></use>
</svg>

<!-- `<use>` shape defined in an EXTERNAL RESOURCE -->
<svg viewBox="0 0 100 100">
   <use xlink:href="defs.svg#icon-1"></use>
</svg>

所以,是的:外部资源 = 最佳选择。

但是,外部资源的方式在任何版本的 Internet Explorer(测试过 11 个版本)中都不起作用。 即使是那些支持内联 SVG 的版本:9、10、11。

幸运的是,Jon Neal 有一个巧妙的解决方案。 它是一个名为 SVG for Everybody 的小脚本。 想法是:就像它起作用一样使用 <use>,该脚本将在 IE 9、10、11 中处理它。 一个 polyfill,只是针对这种情况(它不会在任何不支持内联 SVG 使用的地方起作用)。

它的工作原理是这样的

  1. 如果浏览器是 IE 9、10 或 11(用户代理嗅探,但这是这里的主要目的)。
  2. 针对引用的 SVG 文件执行 Ajax 操作
  3. 根据引用的 ID(例如 #icon-1)查找所需的位
  4. 将该内容注入到页面上的 <svg>

它完全可以工作。

我认为内联 SVG 非常有用,而这个(微型)脚本意味着你可以以更负责任(可缓存)的方式使用它。