【问题标题】:D3 transition stop in the middle of dragend eventD3 过渡在 dragend 事件中间停止
【发布时间】:2014-02-19 15:21:13
【问题描述】:

任何人都可以帮助解决这种情况吗? 我有两个圆圈,一个在另一个圆圈内,当我拖动外部圆圈时应该一起移动。 只有当鼠标悬停在外圈上时,内圈才会出现。 拖动完成后,两个圆圈都应该回到原点位置。 这是一个example的小提琴。 这是它的代码:

    var deg90 = Math.PI / 2,
ptOuter = [200, 250],
rOuter = 70,
rInner = 10;

var ptInner = innerCircleXY(ptOuter[0],ptOuter[1],rOuter,rInner);

var drag = d3.behavior.drag()
.on("drag", function () {
    var c2NewX=parseInt(outerCircle.attr("cx"),10) + d3.event.dx;
    var c2NewY=parseInt(outerCircle.attr("cy"),10) + d3.event.dy;
    var icNewX=parseInt(innerCircle.attr("cx"),10) + d3.event.dx;
    var icNewY=parseInt(innerCircle.attr("cy"),10) + d3.event.dy;

    outerCircle.attr({
        "cx": c2NewX,
        "cy": c2NewY
    });
    innerCircle.attr({"cx":icNewX, "cy":icNewY});
})
.on("dragend",function() {
    innerCircle.transition().attr({"cx": ptInner[0],"cy": ptInner[1]});
    outerCircle.transition().attr({"cx": ptOuter[0],"cy": ptOuter[1]});
});

var svg = d3.select('body').append('svg');

var outerCircle = svg.append('circle').attr({
    cx: ptOuter[0],
    cy: ptOuter[1],
    r: rOuter,
    fill: '#FFA300',
    stroke: '#FFA300',
    "stroke-width": 0})
    .style({'cursor': 'pointer'})
    .call(drag);

var innerCircle = svg.append('circle').attr({
    "id":"clicks",
    cx: ptInner[0],
    cy: ptInner[1],
    r: rInner,
    fill: 'white',
    stroke: '#666666',
    "stroke-width": 1,
    "stroke-opacity": 0.9})
    .style({'cursor': 'pointer', 'opacity':'0.0'});

outerCircle.on("mouseover", function(){innerCircle.transition().style({'opacity':'1.0'}).duration(300);});
outerCircle.on("mouseout", function(){innerCircle.transition().style({'opacity':'0.0'}).duration(300);});

函数 innerCircleXY(oX, oY, oR, iR) { var rDiff = Math.abs(oR - iR); 变量角度 = Math.PI/3; // 60度 var x = oX + rDiff*Math.sin(角度); var y = oY + rDiff*Math.cos(角度); 返回([x,y]); }

问题是当我拖动外圈放开时,内圈并没有一直往回走,而是停在了中间。 我不确定我做错了什么。

--> 更新 这是任意发生的,可能是特定操作系统或浏览器的情况(对我来说,它是带有 chrome 或 safari 的 OSX)。

这是我电脑上发生的事情的screencast

【问题讨论】:

  • 你的 jsfiddle 对我来说很好用。
  • 尝试拖动几次。问题是否仅存在于特定的操作系统或浏览器中?
  • 可能,它在 Chrome 中对我来说一直很好。
  • 出现问题时,我添加了我电脑的截屏视频。请参阅底部的更新。

标签: javascript svg d3.js data-visualization


【解决方案1】:

截屏视频对我不起作用,但我认为问题出在这条线(还有鼠标悬停线,但不太可能发生)...

outerCircle.on("mouseout", function(){innerCircle.transition().style({'opacity':'0.0'}).duration(300);});

我认为可能发生的情况是,如果您移动鼠标,过渡与之前发生的过渡冲突,所以感觉是断断续续的,因为这并不总是发生。

因此,您可能需要考虑在这种情况下您希望发生什么。如果您注释掉这条线,我认为它应该可以正常工作(不改变不透明度)。

【讨论】:

  • 我相信你是对的,但我希望一旦我释放按钮,圆圈就会回到原来的位置,一旦鼠标不在外圈上,内圈就会消失。我该怎么做?
  • 也许我想重新调整一下,这样你就有一个包含两个圆圈的组元素(其中也有处理程序),然后转换该 circleGroup。因此,您对圆形组进行变换,因此它们将始终粘在一起。然后您可以通过单独的过渡淡入/淡出较小的圆圈?
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2016-12-23
  • 2013-03-28
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
相关资源
最近更新 更多