假设我有几个复合形状(<g>
)。我希望能够单击并拖动它们,但是我希望当前碰巧拖动的那个按Z顺序位于另一个的TOP上,因此,如果将其拖动到另一个,则另一个应该黯然失色。
假设我有几个复合形状(<g>
)。我希望能够单击并拖动它们,但是我希望当前碰巧拖动的那个按Z顺序位于另一个的TOP上,因此,如果将其拖动到另一个,则另一个应该黯然失色。
Answers:
SVG中的Z索引由元素在文档中出现的顺序定义。如果要在顶部显示特定形状,则必须更改元素顺序。
$('#thing-i-want-on-top').appendTo('#my-svg');
在树中移动元素的另一种方法是<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"
,使其显示为最顶部的元素。
见小提琴。
xlink:href
已弃用,现在只是href
这是个老问题,但是...
在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 ==替换自身==重绘
appendChild
首先从旧的父级(如果有)中删除(即使与新的父级相同),然后将其添加到新的父级的子级列表中。
未提及的另一种解决方案是将每个svg项目/项目集放入div。您可以轻松更改div的z索引。
...按按钮,将元素“推”到前面。(vs重新粉刷整个集合并将1个元素推到前面,但保持原始顺序与接受的解决方案中一样)
具有相对的z索引将非常好...
如果它是来自jsfiddle的链接,stackOverflow要我放代码吗?
是的,顺序是指定哪个对象将在另一个对象之前的顺序。要操纵顺序,您将需要移动有关DOM的内容。SVG Wiki上有一个很好的例子,网址为https://www.w3.org/TR/SVG11/render.html#RenderingOrder
如果使用svg.js库,则可以使用“ .front()”命令将任何元素移到顶部。