【问题标题】:How to gradient fill an SVG from an external stylesheet?如何从外部样式表渐变填充 SVG?
【发布时间】:2015-10-12 17:50:28
【问题描述】:

我喜欢外部样式表,并希望能够通过外部表设置任何 SVG 图形的样式。我可以为我的 SVG 徽标声明单色笔触和填充,但我想要一个渐变填充。我已经尝试过查看事物,但无法使其正常工作。有人可以帮我弄清楚如何让它工作吗?

考虑到我在讨论外部代码,而不是内联,我不确定如何放置代码 sn-p,所以这里有一个指向 SVG 徽标的链接问题及其匹配的外部样式表。

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

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

样式表:http://www.cafenocturne.com/testpage/css/CafeLogoSVG.css

有一些注释掉了,以确保我不会丢失我正在尝试实现的渐变代码,所以我很抱歉 CSS 文件是一团糟。一旦我可以让它正常工作,我就不需要在那里做笔记了。

那么我该如何实现呢?

【问题讨论】:

  • SVG 元素不支持背景 CSS 属性。您需要通过 SVG 模式来完成。

标签: html css svg radial-gradients


【解决方案1】:

将渐变添加到您的 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>

【讨论】:

  • 非常好!但除此之外,目前没有办法在 CSS 文件中从外部控制 SVG 的大小和颜色?
  • 我不确定您的意思,但您当然可以从外部样式表更改 SVG 的颜色。 SVG 的大小通常由其容器更改,因此设置这些样式...如果我完全弄错了,请考虑打开另一个问题并附上简化的测试用例或小提琴...
  • 我的具体意思是在外部文件中完全在 SVG 之外指定渐变,这样我就可以将基本形状移植到任何地方,并仅使用外部工作表来更改每个实例的颜色停止数量和类型.我可能希望我的徽标在一页上有 6 个色标,而在另一页上可能只有 2 个。我可能希望渐变的类型或起点和终点(如顶部或底部、左侧或右侧、哪个角等)在许多不同的地方都不同。如何完全摆脱 SVG 文件本身?
  • 好的,现在我明白了。我用第二个例子更新了我的答案。
  • 这看起来太棒了!因此,如果我在其 SVG 文件中有徽标的通用路径并链接到其外部 CSS 文件,并且有一个“紫色到黄色的径向渐变左上角”SVG 文件和一个“绿色到-blue left-to-right" SVG 文件,我可以只在 SVG 的 CSS 中详细说明,以调用我当时想要的特定渐变 SVG?比如,构建几个自定义渐变 SVG 文件并在我想要的地方调用它们?
猜你喜欢
  • 2023-03-27
  • 2021-12-05
  • 2019-03-19
  • 2016-09-16
  • 2018-06-15
  • 2015-12-21
  • 1970-01-01
  • 2017-10-29
  • 2021-10-24
相关资源
最近更新 更多