使用JavaScript,是否可以更改SVG <g>元素的Z索引/层?


Answers:


113

SVG中的Z索引由元素在文档中出现的顺序定义。如果要在顶部显示特定形状,则必须更改元素顺序。


1
文档末尾的@theonlygusti元素位于顶部。如果您使用的是jQuery,则应该可以使用类似的东西$('#thing-i-want-on-top').appendTo('#my-svg');
Adam Bradley

因此,基本上,没有办法将形状悬停在顶部(z轴)上吗?
chharvey 2015年

jQuery不支持更改SVG路径的顺序。
Senthe '16

4
@chharvey,您可以通过重新排序-重新添加将它们浮动到顶部。这是一个优雅的示例:codepen.io/osublake/pen/YXoEQe
Frazer Kirkman

36

在树中移动元素的另一种方法是<use>在更改xlink:href属性的地方使用元素,以便它为您提供所需的z顺序。

这是svg-developers邮件列表上的一个旧线程,它是在希望对某些形状进行动画处理的情况下讨论该主题的。

更新:

<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink"
     style="width:100%; height: 100%">
    <circle id="c1" cx="50" cy="50" r="40" fill="lime" />
    <rect id="r1" x="4" y="20" width="200" height="50" fill="cyan" />
    <circle id="c2" cx="70" cy="70" r="50" fill="fuchsia" />
    <use id="use" xlink:href="#c1" />
</svg>

在此示例中,<use>元素是最后一个元素,这使其成为最前面的元素。我们只需更改xlink:href属性即可选择其他任何元素作为最前面的元素。在上面的示例中,我们使用选了一个圆圈id="c1",使其显示为最顶部的元素。

小提琴


1
这个答案会是多少更多有用的一个例子,或者从邮件列表的信息(这是进行分选)。
Kyeotic

3
可行,但可以适当地增加使用。如果您使用翻译,则<use>对其
一无所知

@JochenBedersdorfer不确定您的意思,翻译与z顺序有什么关系?
ErikDahlström2015年

这不是很清楚。如果在转换中使用嵌套的<g> -tags,则需要使用getTransformToElement(..)转换坐标。(请参阅SVG文档)
Jochen Bedersdorfer,2015年

3
xlink:href已弃用,现在只是href
osvein

22

这是个老问题,但是...

在FireFox(7+)和Chrome(14+)上,您可以将svg_element拉到顶部。这并不能给您完全z轴控制的自由,但是总比没有好;)

只需再次添加该元素。

var svg = doc.createElemNS('svg');
var circle = doc.createElemNS('circle');
var line = doc.createElemNS('line');

svg.appendChild(circle); // appends it
svg.appendChild(line);   // appends it over circle
svg.appendChild(circle); // redraws it over line now

我认为这会引发错误或其他错误。

appendChild ==替换自身==重绘


3
完全没有错误;appendChild首先从旧的父级(如果有)中删除(即使与新的父级相同),然后将其添加到新的父级的子级列表中。
Potatoswatter

5

未提及的另一种解决方案是将每个svg项目/项目集放入div。您可以轻松更改div的z索引。

小提琴:SVG元素以z-index为容器循环

...按按钮,将元素“推”到前面。(vs重新粉刷整个集合并将1个元素推到前面,但保持原始顺序与接受的解决方案中一样)

具有相对的z索引将非常好...

如果它是来自jsfiddle的链接,stackOverflow要我放代码吗?




3

SVG使用渲染的“画家模型”。在连续的操作中将油漆施加到输出设备,以使每个操作都在输出设备的某些区域上进行油漆。当该区域与先前绘制的区域重叠时,新的油漆会部分或完全遮盖旧的油漆。-链接到此


3

在SVG中,要获得更大的Z索引,您应该在DOM树中向下移动元素。您可以使用jQuery进行此操作,选择SVG元素,将其删除并将其再次附加到所需位置:

$('g.element').remove().appendTo('svg');

2

亚当·布拉德利(Adam Bradley)对山姆(Sam)的回答的观点恰到好处。它仅使用jQuery而不是CSS,但是他这样说:

$('#thing-i-want-on-top').appendTo('#my-svg');

但是,对于我正在创建的内容,我需要我的SVG路径在悬停时的任何其他路径之上,但仍在我的SVG文本之下。所以这是我想出的:

$('#thing-i-want-on-top').insertBefore('#id-for-svg-text');

appendTo和insertBefore都会将您的元素移动到新位置,允许您随意更改SVG元素的深度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.