【发布时间】:2021-08-16 02:18:44
【问题描述】:
我有以下 d3 代码,用于在图表的所有其他元素下方绘制底层:
const rectsEnter = vis.g.selectAll('rect.bottomLayer').data(data).enter()
const rectsUpdate = vis.g.selectAll('rect.bottomLayer').data(data)
vis.g.selectAll('rect.bottomLayer').data(data).exit().remove()
rectsEnter.append('rect')
.attr('class', 'bottomLayer')
.attr('fill', 'grey')
.attr('x', x)
.attr('y', (d, i) => i*size)
.attr('width', 0)
.attr('height', height)
.lower()
.transition()
.attr('width', newWidth)
rectsUpdate
.lower()
.transition()
.attr('x', x)
.attr('y', (d, i) => i*size)
.attr('width', width)
.attr('height', height)
.attr('fill', newColor)
问题在于 d3 在输入或更新图表的任何其他元素时重新排列这些矩形。似乎如果应用于数组(提供的数据包含或超过 1 个元素),d3 会获取顶部的所有元素并将它们放在底部。
如果数据数组包含许多元素,有什么办法可以避免这种重新洗牌?
PS。我正在尝试模仿 svg 元素的 z-index 属性。显然,svg 没有 z-index,因此必须做出一些牺牲才能实现所需的功能。
【问题讨论】:
标签: javascript svg d3.js