正如这里的其他人所说,z索引是由元素在DOM中出现的顺序定义的。如果手动重新排序 html 不是一个选项或很困难,则可以使用 D3 对 SVG 组/对象进行重新排序。
使用 D3 更新 DOM 顺序和模拟 Z 索引功能
使用 D3 更新 SVG 元素 Z 索引
在最基本的级别(如果您没有将 ID 用于其他任何内容),则可以使用元素 ID 作为 z 索引的替代项,并随这些 ID 重新排序。除此之外,你几乎可以让你的想象力疯狂。
代码片段中的示例
var circles = d3.selectAll('circle')
var label = d3.select('svg').append('text')
.attr('transform', 'translate(' + [5,100] + ')')
var zOrders = {
IDs: circles[0].map(function(cv){ return cv.id; }),
xPos: circles[0].map(function(cv){ return cv.cx.baseVal.value; }),
yPos: circles[0].map(function(cv){ return cv.cy.baseVal.value; }),
radii: circles[0].map(function(cv){ return cv.r.baseVal.value; }),
customOrder: [3, 4, 1, 2, 5]
}
var setOrderBy = 'IDs';
var setOrder = d3.descending;
label.text(setOrderBy);
circles.data(zOrders[setOrderBy])
circles.sort(setOrder);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 100">
<circle id="1" fill="green" cx="50" cy="40" r="20"/>
<circle id="2" fill="orange" cx="60" cy="50" r="18"/>
<circle id="3" fill="red" cx="40" cy="55" r="10"/>
<circle id="4" fill="blue" cx="70" cy="20" r="30"/>
<circle id="5" fill="pink" cx="35" cy="20" r="15"/>
</svg>
基本思想是:
-
使用 D3 选择 SVG DOM 元素。
var circles = d3.selectAll('circle')
-
创建一些与 SVG 元素(要重新排序)具有 1:1 关系的 z 索引数组。以下示例中使用的 Z 索引数组是 ID、x 和 y 位置、半径等。
var zOrders = {
IDs: circles[0].map(function(cv){ return cv.id; }),
xPos: circles[0].map(function(cv){ return cv.cx.baseVal.value; }),
yPos: circles[0].map(function(cv){ return cv.cy.baseVal.value; }),
radii: circles[0].map(function(cv){ return cv.r.baseVal.value; }),
customOrder: [3, 4, 1, 2, 5]
}
-
然后,使用 D3 将 z 索引绑定到该选择。
circles.data(zOrders[setOrderBy]);
-
最后,调用 D3.sort 以根据数据对 DOM 中的元素重新排序。
circles.sort(setOrder);
例子
- 或者指定一个数组来为特定排序应用 z 索引 - 在我的示例代码中,数组移动/重新排序第 3 个圆圈(以原始 HTML 顺序)在 DOM 中为 1st,第 4 个为 2nd,1st 为 3rd,依此类推...
[3,4,1,2,5]