【问题标题】:Reordering svg dom with d3js使用 d3js 重新排序 svg dom
【发布时间】:2014-01-13 05:23:58
【问题描述】:

我正在使用 d3 来渲染 svg。我有一个对象数组,每个对象都有一个颜色属性,如下所示:

data = [{'color': 'red'}, {'color': 'blue'}];

我有一个更新函数可以用这些颜色绘制圆圈,如下所示:

function update(data) {
    var circle = svg.selectAll('circle').data(data, function(d) {return d.color})
        .enter()
        .append('circle').attr('r', 50)
        .attr('cx', function (d, i) {return 50 + (i * 50)}).attr('cy', 50)
        .attr('fill', function (d) {return d.color});
    circle.order();
}

我的理解是函数中的最后一行,circle.order(),应该重新排序 svg dom 中的节点以匹配数据的顺序。但是,我改变了数组顺序,再次调用了更新函数,它似乎并没有做任何事情。

jsfiddle 演示:http://jsfiddle.net/du7mh/

我需要控制 dom 顺序以将某些元素带到前台,因为 svg 中没有 z-index。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 您需要使用 enter-exit-update 选择。请参阅 Mike 的this tutorial。或者作弊方法是在您发布的小提琴中的更新功能顶部仅selectAll("circles").remove()。在 svg 2.0 中有一个用于 z-index 方法的占位符,但我不知道这是否已经发生 - 请参阅谷歌组中的 this discussion

标签: svg d3.js


【解决方案1】:

更新运行一次后,附加选择中没有任何内容。将circle 设置为等于当前元素和新元素都有效:

function update(data) {
    var circle = svg.selectAll('circle').data(data, function(d) {return d.color});
    circle.enter()
        .append('circle').attr('r', 50)
        .attr('cx', function (d, i) {return 50 + (i * 50)}).attr('cy', 50)
        .attr('fill', function (d) {return d.color});
    circle.order();
}

http://jsfiddle.net/du7mh/3/

【讨论】:

  • 糟糕,我猜这只是连锁事故!感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2011-05-08
  • 2021-10-06
  • 2013-09-11
  • 2011-09-27
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多