我开始使用默认的Sunburst example并尝试在点击时添加动画 - 单击一个楔形使楔形成为中心元素。除了少数情况外,这种方法效果很好 - 看起来如果深度高于2(0基础),那么一些楔形物不能正确地生成动画;他们似乎在错误的地方开始动画,但最终到了正确的地方。
以下是我认为的相关代码,我希望它对其他人有用:
animate = function (d) {
var oldDs = [], topD, includeds;
if (animating)
return;
animating = true;
topD = (d == selected && d.parent) ? d.parent : d;
if (selected == topD) {
animating = false;
return;
}
selected = topD;
svg.selectAll("path").filter(function (f) {
return (!isDescendant(f, topD))
}).transition().duration(1000).style("opacity", "0").attr("pointer-events","none");
includeds = svg.datum(topD).selectAll("path").filter(function (f) {
return isDescendant(f, topD);
});
// step 1 - save the current arc settings
includeds.data().each(function (d) {
oldDs[d.ac_id] = {x: d.x, dx: d.dx, y: d.y, dy: d.dy};
});
// step 2 - recalculate arc settings and animate
includeds.data(partition.nodes) // recalculates
.transition().duration(1000).attrTween("d", function (d) {
var oldD = oldDs[d.ac_id],
interpolator = d3.interpolateObject(oldD, d);
return function (t) {
return arc(interpolator(t));
}
}).style("opacity", "1").attr("pointer-events","all");
setTimeout(function(){ animating = false; }, 1000);
};
因为我的代码与深度没有任何关系,所以我希望问题出在其他地方,但我一直无法找到它。这个故障似乎会影响所有浏览器(至少Chrome,Firefox和IE)。
所以,我的问题是:问题是什么,我该如何解决?