【发布时间】:2020-11-10 20:56:48
【问题描述】:
在 SVG 中是否有办法重用 <path> 的一部分,同时保持 <path> 的其他部分完好无损?
我正在尝试构建一个静态 SVG 文件(不允许使用 HTML 或 JS,尽管可以利用外部 CSS),它有 20 多个可变宽度水平花括号实例,如下所示:
所有实例的高度相同,但宽度不同,这意味着弧 (a) 相同,但每个实例的初始位置和水平线 (h) 将不同。这也意味着我不能使用<use> 然后水平缩放每个实例,因为缩放会导致看起来很糟糕的延伸弧。 (顺便说一句,在研究这个时我了解到vector-effect="non-scaling-stroke",如果不涉及曲线,如果与<use> 结合使用将是一个完美的解决方案。)
我知道我可以使用<use> 并覆盖每个属性中的d 属性,但是有没有比克隆相同的d 属性20 多次并编辑每个属性中的h 值更好的方法?一个理想的解决方案是能够重用子路径,例如d="${left} h 100 ${middle} h 100 ${left}" 如果允许 JS,我可以轻松做到这一点,但可惜我不能在这种情况下使用脚本。
有没有办法做类似下面的事情(在 SVG 中;我知道我可以在 HTML 中做到这一点),其中每个路径都在最后一个结束的地方拾取?
<use href="#left">
<path d="h 200">
<use href="#mid">
<path d="h 200">
<use href="#right">
如果没有,还有其他方法可以做我正在寻找的吗?
这是我现在拥有的 SVG:(https://codepen.io/justingrant/pen/rNLqQRo)
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3000 500" width="3000" height="500" fill="none" stroke-width="5" stroke="green" >
<path d="m 80,80
a 30 30 0 0 1 30,-30
h 100
a 30 30 0 0 0 30,-30
a 30 30 0 0 0 30,30
h 100
a 30 30 0 0 1 30,30"/>
<path d="m 500,80
a 30 30 0 0 1 30,-30
h 40
a 30 30 0 0 0 30,-30
a 30 30 0 0 0 30,30
h 40
a 30 30 0 0 1 30,30"/>
</svg>
我知道我可以通过构建步骤或预处理器运行原始代码,但我更喜欢原生 SVG 解决方案,然后再拼凑类似的东西。
【问题讨论】:
-
创建一个模板,然后运行 XSLT 进程(或类似进程)以在编译时而不是运行时生成您想要的所有静态文件。
标签: svg