<svg width="600" height="200" viewBox="0 190 600 200" xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
<linearGradient id="e" x1="40" y1="210" x2="460" y2="290" gradientUnits="userSpaceOnUse">
<stop stop-color="steelblue" offset="0" />
<stop stop-color="red" offset="1" />
</linearGradient>
</defs>
<line x1="40" y1="210" x2="460" y2="290" stroke="url(#e)" stroke-width="30"/>
</svg>
在第一个案例中,关键是使线的x1 y1,x2 y2匹配线性渐变的x1 y1,x2 y2坐标。对于第二个案例,涉及到更多的数学知识。您需要创建一条垂直于第一条线的线,并且具有所需线宽的长度,并从其中一个点的一半宽度开始。
因此,在您的情况下(伪代码!):
步骤1:
获取方向
dx=x2-x1;
dy=y2-y1;
dx,dy现在是从点1到点2的方向。
步骤2:
通过将dx和dy除以线段长度来将方向标准化为长度为1。
len=Math.sqrt(dx*dx+dy*dy);
dx=dx/len;
dy=dy/len;
当然,如果长度为0是不起作用的,但因为你给了我坐标,所以现在我不必担心这个问题。
步骤3:
找到垂直方向。这其实非常简单,但从逻辑上讲可能有两个方向。我只选择其中一个。
temp=dx;
dx=-dy;
dy=temp;
如果您想要另一个方向,只需否定dx和dy。在此过程之后。
dx=-dx;
dy=-dy;
dx,dy现在保持垂直方向。
步骤4:
将dx和dy乘以所需的线宽,例如30。我称其为w。
dx=w*dx;
dy=w*dy;
步骤5:
要找到梯度的p1和p2,请从该线中获取p1,并加上或减去dx的一半。
gradient_x1=x1+dx*0.5;
gradient_y1=y1+dx*0.5;
gradient_x2=x1-dx*0.5;
gradient_y2=y1-dx*0.5;
现在您可以重新建立您的线路。为了让您更好地理解,我已经输入了您的数值并完成了整个过程,结果如下:
Your case: (x1="40" y1="210" x2="460" y2="290" w=30)
dx: 420 dy:80
dx: 0.9823385664224747 dy:0.1871121078899952
dx: -0.1871121078899952 dy:0.9823385664224747
dx: -5.613363236699856 dy:29.47015699267424
gradient_x1=37.19331838165007
gradient_y1=224.7350784963371
gradient_x2=42.80668161834993
gradient_y2=195.2649215036629
所以将其插入到您的示例中:
<svg width="600" height="200" viewBox="0 190 600 200" xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
<linearGradient id="e" x1="37.19331838165007" y1="224.7350784963371" x2="42.80668161834993" y2="195.2649215036629" gradientUnits="userSpaceOnUse">
<stop stop-color="steelblue" offset="0" />
<stop stop-color="red" offset="1" />
</linearGradient>
</defs>
<line x1="40" y1="210" x2="460" y2="290" stroke="url(#e)" stroke-width="30"/>
</svg>
总结
幸运的是,我们不需要进行所有这些计算,因为我们有计算机并且可以通过JavaScript轻松地操作SVG元素。
如果它们有一个id,用JavaScript访问svg元素会更方便。
你的渐变具有id="e",让我们给你的线条一个id="l"。
之后只需在页面中插入一小段脚本,
从线条("l")获取x1 y1,x2 y2,计算出所有内容并将其放入渐变("e"),然后你就会得到这样的结果:
<svg width="600" height="200" viewBox="0 190 600 200" xmlns="http://www.w3.org/2000/svg" version="1">
<defs>
<linearGradient id="e" x1="0" y1="0" x2="1" y2="1" gradientUnits="userSpaceOnUse">
<stop stop-color="steelblue" offset="0" />
<stop stop-color="red" offset="1" />
</linearGradient>
</defs>
<line id="l" x1="40" y1="270" x2="450" y2="210" stroke="url(#e)" stroke-width="30"/>
</svg>
<script>
var line=document.getElementById("l");
var x1=parseFloat(l.getAttribute("x1"));
var y1=parseFloat(l.getAttribute("y1"));
var x2=parseFloat(l.getAttribute("x2"));
var y2=parseFloat(l.getAttribute("y2"));
var w=parseFloat(l.getAttribute("stroke-width"));
var dx=x2-x1;
var dy=y2-y1;
len=Math.sqrt(dx*dx+dy*dy);
dx=dx/len;
dy=dy/len;
var temp=dx;
dx=-dy;
dy=temp;
dx=w*dx;
dy=w*dy;
var gradient_x1=x1+dx*0.5;
var gradient_y1=y1+dy*0.5;
var gradient_x2=x1-dx*0.5;
var gradient_y2=y1-dy*0.5;
document.getElementById("e");
e.setAttribute("x1",gradient_x1);
e.setAttribute("y1",gradient_y1);
e.setAttribute("x2",gradient_x2);
e.setAttribute("y2",gradient_y2);
</script>
您可以自由编辑线条的起点和终点,甚至可以调整笔画宽度,脚本将实时修复您的渐变。为了向您“证明”这一点,这正是我所做的。 :)
希望这有所帮助。
gradientTransform
是旋转渐变最简单的方法。 - ashleedawggradientUnits = userSpaceOnUse
,现在它运行得非常好! - Olli