html - LinearGradient 不适用于 SVG Sprite

标签 html svg sprite linear-gradients sprite-sheet

我正在尝试将所有 svg 图标合并到一个 sprite 文件中 like this用于组织、缓存和其他目的。但由于某种原因,linearGradient未应用

  <?xml version="1.0" encoding="utf-8"?>
  <svg version="1.1" id="icons" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
   y="0px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
    <!-- other icons -->
    <!-- ... -->
    <g id="toggle">
      <path d="M4,7.992c-2.206,0-4-1.794-4-4c0-2.206,1.794-4,4-4h10c2.206,0,4,1.794,4,4c0,2.206-1.794,4-4,4H4z"/>
      <circle fill="url('#toggle-linear-gradient')" cx="14" cy="3.992" r="3"/>
      <defs>
        <linearGradient id="toggle-linear-gradient" gradientUnits="userSpaceOnUse" x1="14" y1="0.9922" x2="14" y2="6.9922">
          <stop offset="0" stop-color="#FFFFFF"/>
          <stop offset="1" stop-color="#8C8C8B"/>
        </linearGradient>
      </defs>
    </g>
  </svg>

现在,在文件预览中,我可以正确看到应用了渐变的圆圈

in svg file preview

当我尝试将其导入到我的 HTML 中时,如下所示

<svg>
  <use href="#toggle" xlink:href="#toggle"></use>
</svg>

圆圈未使用定义的渐变进行着色

in the page

当我搬家时<linearGradient>在 svg 文件之外,它可以工作,但为什么呢?

<svg>
  <linearGradient id="toggle-linear-gradient" gradientUnits="userSpaceOnUse" x1="14" y1="0.9922" x2="14" y2="6.9922">
    <stop offset="0" stop-color="#FFFFFF"/>
    <stop offset="1" stop-color="#8C8C8B"/>
  </linearGradient>
  <use href="#toggle" xlink:href="#toggle"></use>
</svg>

with linearGradient outside svg file

即使它有效,问题是,如果某些样式只能从外部定义,则这会破坏将所有图标保留在一个文件中的目的。显示相同的图标将迫使我多次定义相同的渐变。希望将所有内容都放在同一个文件中。有什么想法或见解吗?

附注导入为<img>正确显示圆形渐变。

最佳答案

非常确定,您已通过 display:none 隐藏了主 svg 资源文件。

如果将其更改为 visibility:hidden 它应该可以工作:

function unhide(){
  document.querySelector('.dsp-non').classList.remove('dsp-non');
}
.svgAssetHidden{
  visibility:hidden;
  position:absolute;
  width:0px;
  height:0px;
  overflow:hidden;
}

.svgIcon{
  display:inline-block;
  width:10em;
}

.dsp-non{
  display:none;
}
<button onclick="unhide()">remove display:none</button>

<h3>visibility:hidden</h3>
<svg class="svgIcon" viewBox="0 0 50 20">
  <use href="#toggle" href="#toggle"></use>
</svg>

<h3>display:none</h3>
<svg class="svgIcon" viewBox="0 0 50 20">
  <use href="#toggle2" href="#toggle"></use>
</svg>

<svg class="svgAssetHidden" id="icons" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
   y="0px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
    <!-- other icons -->
    <!-- ... -->
    <g id="toggle">
      <path d="M4,7.992c-2.206,0-4-1.794-4-4c0-2.206,1.794-4,4-4h10c2.206,0,4,1.794,4,4c0,2.206-1.794,4-4,4H4z"/>
      <circle fill="url('#toggle-linear-gradient')" cx="14" cy="3.992" r="3"/>
      <defs>
        <linearGradient id="toggle-linear-gradient" gradientUnits="userSpaceOnUse" x1="14" y1="0.9922" x2="14" y2="6.9922">
          <stop offset="0" stop-color="#FFFFFF"/>
          <stop offset="1" stop-color="#8C8C8B"/>
        </linearGradient>
      </defs>
    </g>
  </svg>


<svg class="svgAssetDspNon dsp-non" id="icons" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
   y="0px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
    <!-- other icons -->
    <!-- ... -->
    <g id="toggle2">
      <path d="M4,7.992c-2.206,0-4-1.794-4-4c0-2.206,1.794-4,4-4h10c2.206,0,4,1.794,4,4c0,2.206-1.794,4-4,4H4z"/>
      <circle fill="url('#toggle-linear-gradient2')" cx="14" cy="3.992" r="3"/>
      <defs>
        <linearGradient id="toggle-linear-gradient2" gradientUnits="userSpaceOnUse" x1="14" y1="0.9922" x2="14" y2="6.9922">
          <stop offset="0" stop-color="#FFFFFF"/>
          <stop offset="1" stop-color="#8C0000"/>
        </linearGradient>
      </defs>
    </g>
  </svg>

通过 display:none 隐藏 svg 也会破坏其他一些功能,例如过滤器。

关于html - LinearGradient 不适用于 SVG Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70663671/

相关文章:

javascript - jQuery 通过其中包含多个标识符的数据属性选择 DOM 元素

javascript - 如何预填充下拉字段

javascript - jQuery SVG 插件 : how to display a predefined SVG image

javascript - getSVGDocument 在 Chrome 中返回 NULL

c++ - 添加 Sprite 时窗口关闭

css - 两个内联 block (右侧固定)

html - 如何在图像 div 下获取文本 div?

javascript - 对导出为 React 组件的 SVG 使用随机颜色

javascript - FireFox 3.5 重复获取图像 Sprite - 如何防止?

java - 如何让 Sprite 跳起来并返回到原始位置 GDXLib