将外部 SVG 图标加载到原生 JavaScript 代码中

Posted

技术标签:

【中文标题】将外部 SVG 图标加载到原生 JavaScript 代码中【英文标题】:Load external SVG icons into vanilla JavaScript code 【发布时间】:2022-01-09 03:39:20 【问题描述】:

我正在使用 OpenWeather API 在我客户的网站上显示当前和五天的预报。

我想使用一些自定义 SVG 图标来代替 OpenWeather 提供的图标。我已经实现了以下 switch 语句来根据天气情况显示不同的图标。

let dailyCondition = value.weather[0].description;
let dailyCondtionIcon = "";
    
switch (dailyCondition) 
  case "clear sky":
    dailyConditionIcon = `<svg>icon</svg>`;
    break;
  case "few clouds":
    dailyConditionIcon = `<svg>icon</svg>`;
    break;
  case "thunderstorm":
    dailyConditionIcon = `<svg>icon</svg>`;
    break;
  case "light rain":
    dailyConditionIcon = `<svg>icon</svg>`;
    break;

从模板文字代码访问图标是可行的,但是在 switch 语句中有很多天气条件,代码非常臃肿。我想将 SVG 图标存储在外部文件中并从那里加载。

如何将外部 SVG 图标加载到我的原生 javascript 文件中?

【问题讨论】:

【参考方案1】:

如果您更喜欢外部 svg 文件,可以将它们加载到 &lt;use&gt; 元素中。

另见SVG use with External Source

您可以将所有 svg 图标合并到一个 sprite/asset 库 svg 文件中,然后通过片段标识符单独加载每个图标:

你的 js 定义可能看起来像这样:

dailyConditionIcon = '<svg class="svgInline" fill="red" ><use href="sprite.svg#circle" /></svg>'

.svgAssets
    display:none
    
    
    
    .svgInline
            display:inline-block;
            width:1em;
            height:1em;
            font-size:32px;
        
<!-- this would be the content of your "sprite.svg" -->
<svg class="svgAssets" xmlns="http://www.w3.org/2000/svg">
  <symbol viewBox="0 0 100 100" id="circle">
    <circle cx="50%" cy="50%" r="50%"></circle>
  </symbol>
  <symbol viewBox="0 0 100 100" id="rect">
    <rect x="0" y="0"  ></rect>
  </symbol>
  <symbol viewBox="0 0 100 100" id="rectFixedStyle">
    <rect x="0" y="0"   fill="#ccc"></rect>
  </symbol>
  
</svg>

<!-- 
for demonstration the filenames are dropped.
The href of a hosted version would be e.g 
        <use href="sprite.svg#circle" />
-->
<p>
    <svg class="svgInline" fill="red" >
        <use href="#circle" />
    </svg>

    <svg class="svgInline" fill="green" >
        <use href="#rect" />
    </svg>
  
    <svg class="svgInline" fill="green" >
        <use href="#rectFixedStyle" />
    </svg>
  
</p>

如您所见,您还具有一些样式功能,例如更改填充颜色。 但是样式选项是有限的(与完全内联的 svg 相比)并且还取决于您的 svg 结构: 例如。以前在 svg 元素中定义的样式不能被 use/svg 标签中设置的样式覆盖。

我使用的精灵创建:svgsprit.es

【讨论】:

以上是关于将外部 SVG 图标加载到原生 JavaScript 代码中的主要内容,如果未能解决你的问题,请参考以下文章

SVG 进度条

如何从服务器加载SVG并将其插入内联

从指令 Angular 加载 Mat 图标

我可以使用动画 SVG 作为应用程序的加载图标吗(Apple iOS)

内容安全策略正在阻止 Firefox 中的 svg 图标精灵

更改通过背景图像加载的 SVG 图像的填充颜色 [重复]