如何从外部样式表渐变填充 SVG?

How to gradient fill an SVG from an external stylesheet?

我喜欢外部样式sheet,并希望能够通过外部样式 sheet 设置任何 SVG 图形的样式。我可以为我的 SVG 徽标声明单色描边和填充,但我想要渐变填充。我已经尝试过查看内容,但无法正常工作。有人可以帮我弄清楚如何让它发挥作用吗?

考虑到我正在讨论 外部 代码,而不是 inline,我不确定如何放置代码片段,所以这里有一个link 到有问题的 SVG 徽标及其匹配的外部样式sheet。

我尝试在 SVG (PNG) 中重新创建的实际徽标:

SVG 徽标:http://www.cafenocturne.com/testpage/images/svg/CafeLogoSVG.svg

风格sheet:http://www.cafenocturne.com/testpage/css/CafeLogoSVG.css

有一些 commented-out 注释可确保我不会丢失我正在尝试实现的渐变代码,因此对于 CSS 文件一团糟,我深表歉意。一旦我可以让它正常工作,我将不需要在那里做笔记。

那么我该如何实现呢?

将渐变添加到您的 SVG 文件,并将停止色从 CSS:

更改为

#color1 {
  stop-color: red
}
#color2 {
  stop-color: blue
}
<svg>
  <linearGradient id="lg">
    <stop id="color1" offset="0" />
    <stop id="color2" offset="1" />
  </linearGradient>
  <circle cx="50" cy="50" r="45" fill="url(#lg)" />
</svg>

如果您需要更多地控制渐变,您可以在单独的文件中指定渐变(比如 'myGradients.svg')

<svg xmlns="http://www.w3.org/2000/svg">
  <linearGradient id="g1">
    <stop offset="0" stop-color="red"/>
    <stop offset="1" stop-color="blue"/>
  </linearGradient>
  <linearGradient id="g2">
    <stop offset="0" stop-color="green"/>
    <stop offset="1" stop-color="yellow"/>
  </linearGradient>
</svg>    

现在在您的css中您可以

.logo {fill: url('myGradients.svg#g2');}

不幸的是,这个 在 chrome 中不起作用:-(

或者,您可以在徽标文件或 html 中复制渐变集合,并仍然使用 css

设置样式

.color1 {
  stop-color: green
}
.color2 {
  stop-color: yellow
}
#logo1 {
  fill: url(#g1)
}
#logo2 {
  fill: url(#g2)
}
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="0" height="0">
  <linearGradient id="g1">
    <stop offset="0" class="color1" />
    <stop offset="1" class="color2" />
  </linearGradient>
  <radialGradient id="g2">
    <stop offset="0" class="color1" />
    <stop offset="1" class="color2" />
  </radialGradient>
</svg>

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
  <circle id="logo1" cx="50" cy="50" r="45" />
</svg>

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
  <circle id="logo2" cx="50" cy="50" r="45" />
</svg>