【发布时间】:2012-03-15 03:27:06
【问题描述】:
我想以完全复制 CSS 线性渐变行为的方式指定 SVG 线性渐变。例如,在 CSS 渐变中,您可以指定渐变分别在框的左上角和右下角开始和结束。当框调整大小时,背景渐变会自动适应新的大小。
在我的第一次尝试中,我用 SVG 复制了一个 CSS 线性渐变,方法是指定一个角度并根据盒子大小计算 x1,y1,x2,y2 坐标。但是如果调整盒子的大小,渐变的角度不会改变并且不再正确。 (我必须重新计算所有坐标)。
我的下一个尝试是使用变换来旋转渐变。这是一些代码:
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
<linearGradient id="g1" gradientUnits="userSpaceOnUse"
gradientTransform="rotate(-45 150 50)">
<stop stop-color="#FF0000" offset="0"/>
<stop stop-color="#00FF00" offset="0.5"/>
<stop stop-color="#0000FF" offset="1"/>
</linearGradient>
<rect x="0" y="0" width="100%" height="100%" fill="url(#g1)" />
</svg>
现在,这适用于大小为 (300,100) 的盒子,但您会看到我必须指定旋转中心 (150,50) 的绝对值。
我可以用百分比来指定中心吗?最后我希望渐变的角度适应盒子的尺寸。
【问题讨论】:
-
是 gradientUnits="objectBoundingBox" gradientTransform="rotate(-45 0.5 0.5)" 你在找什么?
-
我想我已经尝试过了,因为我开始使用 objectBoundingBox 但我会再试一次......
-
我刚刚又试了一次,还是不行。它似乎做的是计算方形盒子上的旋转梯度,所以对于 -45,它从一个角到另一个角。然后它似乎拉伸了宽度,使渐变保持原样。如果盒子是 100x100,那么角度是正确的,但在我的示例中,角度最终是错误的。
-
有趣的是,当您在 SVG 中调整矩形大小时,您在第一次尝试时表示“渐变的角度不会改变”。这正是我想要做的,但无法完全弄清楚。你能分享你的代码吗?