【发布时间】:2011-01-28 18:06:13
【问题描述】:
有没有办法在 SVG 中进行“角度渐变”?
(我不知道官方术语——它是你在颜色选择器中看到的那种渐变,它随角度而变化。)
SVG 似乎只支持线性和径向渐变,但我认为可能有某种方法可以使用变换来模拟我想要的。
谢谢!
【问题讨论】:
-
我认为您正在描述具有多种颜色的径向渐变。你能展示你正在尝试创建的图像吗?
有没有办法在 SVG 中进行“角度渐变”?
(我不知道官方术语——它是你在颜色选择器中看到的那种渐变,它随角度而变化。)
SVG 似乎只支持线性和径向渐变,但我认为可能有某种方法可以使用变换来模拟我想要的。
谢谢!
【问题讨论】:
没有标准支持做角(锥形)渐变。
但请参阅http://wiki.inkscape.org/wiki/index.php/Advanced_Gradients#Conical_gradient 了解一些近似方法(但不包括源代码)。该链接上的示例不起作用。
【讨论】:
【讨论】:
这里有一个可能的矢量锥形渐变,但只有VML(+IE)可以做到……:
【讨论】:
在我对这个类似问题的回答中,我使用了六个线性渐变来近似圆锥渐变。如果您只需要圆的笔触/周长的渐变,而不是填充,那么它应该是一个足够好的近似值。
【讨论】:
这是使用模式的方法:https://jsfiddle.net/prozoroff/8eodzrke/
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="800" width="800">
<defs>
<linearGradient id="Gradient1" gradientTransform="rotate(90)">
<stop offset="0%" stop-color="#ff0000"/>
<stop offset="100%" stop-color="#00ff00"/>
</linearGradient>
<linearGradient id="Gradient2" gradientTransform="rotate(90)">
<stop offset="0%" stop-color="#0000ff"/>
<stop offset="100%" stop-color="#00ff00"/>
</linearGradient>
<pattern id="Pattern" x="0" y="0" width="600" height="600" patternUnits="userSpaceOnUse">
<g transform="rotate(0, 300, 300)">
<rect shape-rendering="crispEdges" x="0" y="0" width="300" height="600" fill="url(#Gradient1)"/>
<rect shape-rendering="crispEdges" x="300" y="0" width="300" height="600" fill="url(#Gradient2)"/>
</g>
</pattern>
</defs>
<path id='arc5' style="stroke: url(#Pattern);" fill='transparent' stroke-width='60' d='M 364 58 A 250 250 0 1 1 235 58'/>
</svg>
【讨论】:
如果您深入研究this page,您会发现代码在 SVG 中通过将其绘制为一系列 1 度弧线来近似圆锥渐变。
【讨论】:
...10 年后...
CSS 现在支持锥形渐变,尽管在撰写本文时browser support is mixed。
您可以将<clipPath /> 应用到<foreignObject />,其内容使用CSS 锥形渐变来实现所需的效果。
【讨论】:
添加一个宽度和高度为 100% 的模式,因此它只是一个重复模式
<div style="width:100px">
<svg viewBox="0 0 35 35" style="transform: scale(1) rotate(-90deg)">
<defs>
<pattern
id="p1"
patternUnits="userSpaceOnUse"
width="100%"
height="100%"
patternTransform="rotate(90)"
>
<image href="https://blogs.igalia.com/dpino/files/2020/06/conic-gradient.png" width="36" height="36" />
</pattern>
</defs>
<g>
<circle
cx="50%"
cy="50%"
stroke-width="2"
r="15.915"
stroke-dasharray="89, 100"
stroke="url(#p1)"
fill="none"
/>
</g>
</svg>
</div>
【讨论】: