我在我的项目中使用svg圆圈,像这样,

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 120">
    <g>
        <g id="one">
            <circle fill="green" cx="100" cy="105" r="20" />
        </g>
        <g id="two">
            <circle fill="orange" cx="100" cy="95" r="20" />
        </g>
    </g>
</svg>

我在g标签中使用z索引来显示第一个元素。在我的项目中,我只需要使用z-index值,但我不能使用我的svg元素的z-index。我在谷歌上搜了很多,但没有找到相关的东西。 所以请帮助我在我的svg中使用z-index。

这里是DEMO。


当前回答

规范

在SVG规范1.1版本中,呈现顺序是基于文档顺序的:

first element -> "painted" first

参考SVG 1.1。规范

3.3渲染顺序 SVG文档片段中的元素有一个隐式的绘制顺序,SVG文档片段中的第一个元素首先“绘制”。后续的元素被绘制在先前绘制的元素之上。


解决方案(cleaner-faster)

你应该把绿色的圆圈作为最近要绘制的对象。交换这两个元素。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="30 70 160 120"> <!首先画一个橙色的圆——> <circle fill="orange" cx="100" cy="95" r="20"/> <!——然后在当前画布上绘制绿色圆圈——> <圆填充="绿色" cx="100" cy="105" r="20"/> < / svg >

这里是jsFiddle的fork。

解决方案(选择)

该标记与属性xlink:href(对于SVG 2只是href)一起使用,并将元素的id作为值。请记住,这可能不是最好的解决方案,即使结果看起来很好。有一点时间,这里是规范SVG 1.1“use”元素的链接。

目的: 避免要求作者修改所引用的文档以向根元素添加ID。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="30 70 160 120"> <!——首先画一个绿色的圆——> <圆id =“1”填补=“绿色”残雪= " 100 " cy = " 105 " r = " 20 " / > <!——然后在当前画布上绘制橙色圆圈——> <圆id = "两个“填补=“橙色cx”=“100”cy = " 95 " r = " 20 " / > <!——最后在当前画布上再次绘制绿色圆圈——> <使用xlink: href = " # 1 " / > < / svg >


关于SVG 2的说明

SVG 2规范是下一个主要版本,仍然支持上述特性。

3.4. Rendering order Elements in SVG are positioned in three dimensions. In addition to their position on the x and y axis of the SVG viewport, SVG elements are also positioned on the z axis. The position on the z-axis defines the order that they are painted. Along the z axis, elements are grouped into stacking contexts. 3.4.1. Establishing a stacking context in SVG ... Stacking contexts are conceptual tools used to describe the order in which elements must be painted one on top of the other when the document is rendered, ...

SVG 2支持Mozilla -绘画 我如何知道我的浏览器是否支持svg 2.0 我可以使用SVG吗? 对于SVG 2,使用href代替额外的已弃用名称空间XLink:href(感谢G07cha)

其他回答

干净,快速,简单的解决方案张贴在这个答案的日期是不令人满意的。它们是基于SVG文档缺乏z顺序这一错误语句构建的。库也不是必需的。一行代码就可以执行大多数操作来操纵对象的z顺序或对象组,这可能是开发在x-y-z空间中移动2D对象的应用程序所需要的。

SVG文档片段中绝对存在Z顺序

所谓的SVG文档片段是派生自基本节点类型SVGElement的元素树。SVG文档片段的根节点是SVGSVGElement,它对应于HTML5 < SVG >标记。SVGGElement对应于<g>标记,并允许聚合子元素。

像在CSS中那样在SVGElement上使用z-index属性将会破坏SVG呈现模型。W3C SVG推荐v1.1第二版的3.3和3.4节指出,SVG文档片段(SVGSVGElement的子代树)是使用所谓的深度优先搜索树来呈现的。这个方案在任何意义上都是z阶的。

Z顺序实际上是一种计算机视觉的快捷方式,以避免对光线追踪的复杂性和计算需求的真正3D渲染的需求。SVG文档片段中元素的隐式z索引的线性方程。

z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty

这很重要,因为如果你想把一个在正方形下面的圆移动到它上面,你只需要把正方形插入到圆前面。这可以在JavaScript中轻松完成。

支持方法

SVGElement实例有两个方法支持简单的z顺序操作。

parent.removeChild(孩子) 的父母。方法(孩子,childRef)

不会造成混乱的正确答案

因为SVGGElement (<g>标记)可以像SVGCircleElement或任何其他形状一样轻松地删除和插入,所以可以使用SVGGElement轻松实现Adobe产品和其他图形工具的典型图像层。这个JavaScript实际上是一个Move Below命令。

parent.insertBefore(parent.removeChild(gRobot), gDoorway)

如果作为SVGGElement gRobot的子元素绘制的机器人层在作为SVGGElement g门口的子元素绘制的门口层之前,那么机器人现在在门口的后面,因为门口的z阶现在是1加上机器人的z阶。

“移动到上方”命令几乎同样简单。

parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())

只要考虑a=a和b=b就能记住。

insert after = move above
insert before = move below

使DOM处于与视图一致的状态

这个答案是正确的,因为它是最小和完整的,并且像Adobe产品或其他设计良好的图形编辑器的内部一样,使内部表示处于与呈现所创建的视图一致的状态。

替代但有限的方法

另一种常用的方法是将CSS z-index与多个SVG文档片段(SVG标签)结合使用,除了底部的部分,其余部分的背景都是透明的。这再次破坏了SVG呈现模型的优雅性,使得在z顺序上向上或向下移动对象变得困难。


注:

(https://www.w3.org/TR/SVG/render.html v 1.1, 2nd Edition, 16 August 2011) 3.3 Rendering Order Elements in an SVG document fragment have an implicit drawing order, with the first elements in the SVG document fragment getting "painted" first. Subsequent elements are painted on top of previously painted elements. 3.4 How groups are rendered Grouping elements such as the ‘g’ element (see container elements) have the effect of producing a temporary separate canvas initialized to transparent black onto which child elements are painted. Upon the completion of the group, any filter effects specified for the group are applied to create a modified temporary canvas. The modified temporary canvas is composited into the background, taking into account any group-level masking and opacity settings on the group.

试着颠倒# 1和# 2。看看这个小提琴:http://jsfiddle.net/hu2pk/3/

更新

在SVG中,z-index由元素在文档中出现的顺序定义。如果你愿意,你也可以看看这个页面:https://stackoverflow.com/a/482147/1932751

将SVG元素推到最后,这样它的z索引就会在上面。在SVG中,没有称为z-index的属性。尝试下面的javascript把元素放在顶部。

var Target = document.getElementById(event.currentTarget.id);
var svg = document.getElementById("SVGEditor");
svg.insertBefore(Target, svg.lastChild.nextSibling);

目标:是一个我们需要把它放在顶部的元素 是元素的容器

一个更好的例子,我已经用过了。

<svg>
  <defs>
    <circle id="one" fill="green" cx="40" cy="40" r="20" /> 
    <circle id="two" fill="orange" cx="50" cy="40" r="20"/> 
  </defs>
  <use href="#two" />
  <use href="#one" />
</svg>

为了控制顺序,你可以改变这些use元素的href属性值。这对动画制作很有用。

多亏了defs,圆圈元素只绘制一次。

jsfiddle.net/7msv2w5d

使用D3:

如果你想以相反的顺序将元素添加到数据中,使用:

.insert(“g”、”:第一个孩子”)

而不是。append('g')

将一个元素添加到组元素的顶部