我正在尝试移动一些条形以创建一些空间,然后出现条形图(事件A)。我这样做有一个规则:与悬停栏相邻的栏将根据它们的接近程度而移动。他们将在mouseout(事件B)回到原来的位置。两个事件都通过获取当前位置并添加或减去它来计算新位置。
我已经掌握了基础知识。但是有一个棘手的情况:从BAR1和Mouseover到BAR2的Mouseout可能会发生得太快。它如下:
事件A1从DOM获取当前位置(如here所述),这意味着条形图将以不需要的方式移动,例如标签和条形不再对齐。
以下是我尝试这样做的方法:
svg.selectAll('rect')
.on('mouseover', function() {
var curr = this;
var rects = d3.selectAll('.rect.FinalRank')
.transition().duration(500);
var ind = rects[0].indexOf(this);
var arrLen = rects[0].length;
rects.attr('y', function(d, i) {
var gScale = d3.scale.pow().range([5, 0]);
if (0 <= i && i < ind) {
gScale.domain([0, ind])
// //debugger
return (+d3.select(this).attr('y') + gScale(ind - i))
} else if (arrLen > i && i > ind) {
gScale.domain([0, arrLen - ind - 1])
return (+d3.select(this).attr('y') - gScale(i - ind))
} else {
return (d3.select(this).attr('y'))
}
});
var dataObj = d3.select(this).datum();
})
.on('mouseout', function() {
var curr = this;
var rects = d3.selectAll('.rect.FinalRank')
.transition('out').duration(500);
var ind = rects[0].indexOf(this);
var arrLen = rects[0].length
var spaceGrad = d3.scale.pow().range([5, 0])
rects.attr('y', function(d, i) {
var gScale = d3.scale.pow().range([5, 0]);
if (0 <= i && i < ind) {
gScale.domain([0, ind])
//debugger
return (+d3.select(this).attr('y') - gScale(ind - i))
} else if (arrLen > i && i > ind) {
gScale.domain([0, arrLen - ind - 1])
return (+d3.select(this).attr('y') + gScale(i - ind))
} else {
return (d3.select(this).attr('y'))
}
});
这是JSFiddle。在这里创建/观察问题相当困难。你只需要上下刷光标一段时间。
我尝试过:
非常感谢任何解决方案的方法!