Mouse:over事件在Fabric.js

时间:2015-12-10 16:52:37

标签: javascript fabricjs

我正在尝试在画布上写一个简单的纸牌游戏+ Fabricjs。当鼠标在它上面时需要制作更大的玩家卡,如果鼠标在外面则需要恢复正常尺寸。 这是我的js代码:

  canvas.on('mouse:over', function(e) {
  if(e.target.mytype && e.target.mytype=='card'){
    e.target.animate({
      top:352,
      left: e.target.left - (max_width - min_width)/2,
      scaleX:0.4,
      scaleY:0.4
    } , {
      duration: 500,
      onChange: function(value) { 
        canvas.renderAll.bind(canvas);
      },
      easing: fabric.util.ease.easeInOut
    }); 
    canvas.renderAll();
  }

});

canvas.on('mouse:out', function(e) {
    if(e.target.mytype && e.target.mytype=='card'){
      e.target.animate({
          top:385,
          left: e.target.left + (max_width - min_width)/2,
          scaleX:0.3,
          scaleY:0.3
        } , {
          duration: 500,
          onChange: function(value) { 
            canvas.renderAll.bind(canvas);
          },
          easing: fabric.util.ease.easeInOut
        });
      canvas.renderAll();
    }
  });

如果玩家将卡片悬停200毫秒(动画持续时间为500毫秒)并移出,则动画冻结并且卡片保持在新位置。再次徘徊将从这个新位置开始动画。 这是fiddle

只是尝试在对象上移动/移出鼠标,你就会看到错误。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

问题在于您的代码在动画操作中具有相对定位更改的方式 - 在jsFiddle中," top"值,在上面的代码中,在" left"值。

每个人做的是将元素+ X或-X 从事件开始的位置移动到。如果动画在mouseout事件被触发之前结束,那很好,因为它向后移动的数量与它在mouseover事件中移动的数量相等(但相反)。

但是,如果鼠标输出的动画开始在第一个完成之前,则会获取当前位置,而不是它在此时的位置完成动画。这导致元件偏离其原始位置的情况。这肯定是JSFiddle中的问题,我从你的评论中理解,这是你自己的代码中的相同问题。

如何解决?只要您在mouseout事件中使用固定的相对位置值,您可能无法做到。您可以尝试在mouseover函数中记录初始定位(即" left / top"您开始时的值),并专门返回mouseout事件中的那一点。