我对此完全感到困惑。我在http://bl.ocks.org/mbostock/raw/3808234/上查看了带有字母的示例,其中更新的元素根据数据集中字母的位置改变了它们的位置。
现在我想重现类似的东西,但使用 div 元素 ( '.item's
)。到目前为止,我有:
var displayData = function() {
// DATA JOIN
var items = d3.select('#data').selectAll('.item');
items = items.data(data);
// UPDATE
items.transition().duration(500)
.style('left', function(d, i) {
return positions[i].left + "px";
}).style('top', function(d, i) {
return positions[i].top + "px";
});
// ENTER
var div = items.enter().append('div')
.attr('class', 'item')
.style('left', function(d, i) {
return positions[i].left + "px";
}).style('top', function(d, i) {
return positions[i].top + "px";
})
.style('opacity', 1e-6)
.transition().duration(TRANSITION_DURATION)
.style('opacity', 1);
// EXIT
items.exit().transition().duration(500).style('opacity', 0).remove();
}
positions
是一个简单的对象数组,具有预先计算好的位置(它们根据屏幕大小而变化),例如:
positions =
[{left: 0, top: 0},
{left: 240, top: 0},
{left: 0, top: 360},
{left: 240, top: 360}]
因此,给定一个包含四个数据对象的数组,上面的代码在第一次调用时data = [{a},{b},{c},{d}]
会生成一个 2x2 网格。div.item
现在,当我更改数据以data = [{b},{a}]
使我感到困惑时会发生什么。数据连接后,items
如下所示:
[Array[2]
0: div.item
1: div.item
length: 2
parentNode: div#data
__proto__: Array[0]
]
__data__
of div.item
0 指向 object ,我认为这是正确的{b}
,但是我不能使第一个和第二个元素交换位置,因为它们“忘记”了它们的旧位置。
另一种情况:假设我将原始数据更改为data = [{b},{a},{e}]
,即我引入了一个新元素{e}
。然后我想交换前两个元素(带有过渡)并首先删除第三个元素({c}
)并淡入新的第三个元素({e}
)。这甚至可能吗?我做错了什么/我误解了什么?