使用Raphael JS,有一种方法可以在鼠标悬停期间使圆圈向右移动(或任何方向),然后在光标不再位于圆圈时暂停/停止移动。
我尝试了几种不同的方法,但它们有bug。其中一个主要问题是:如果鼠标光标在进入圆圈后没有移动,一旦圆圈移动到鼠标光标不再位于圆圈顶部的位置,就不会触发“mouseout”。
你会在这些不同的尝试中看到我的意思:
1)暂停/恢复动画:
jsfiddle.net/fKKNt /
2)使用鼠标悬停重新定位& .attr( “CX”):
jsfiddle.net/c4BFt /
3)使用setInterval(如下所示: An "if mouseover" or a "do while mouseover" in JavaScript/jQuery):
jsfiddle.net/9bBcm /
jsfiddle.net/STruB /
答案 0 :(得分:1)
我确信有一种更优雅的方式可以做到这一点,但是我可以尝试这样的事情:http://jsfiddle.net/D6Ps4/2/
如果由于某种原因消失,我已经包含下面的代码。该解决方案只是启动动画,然后检查鼠标光标(注意e.offsetX / e.offsetY)是否在某个设定的时间间隔内在Raphael对象(Element.getBBox())的边界框内。如果是,则不执行任何操作并使用setTimeout在某个时间再次检查,如果不是,则暂停动画。
var paper = Raphael("holder");
var animObject = Raphael.animation({cx: 400}, 5000);
circle = paper.circle(90, 90, 45).attr({fill: "#0E4"});
var timer;
circle.mouseover(function(e) {
var anim = function(shouldAnim) {
if (shouldAnim) {
circle.animate(animObject);
}
if (!mouseInsideCircle(e, circle)) {
circle.pause();
return;
} else {
timer = setTimeout(function() {anim(false)}, 20);
}
}
anim(true);
});
circle.mouseout(function() {
this.pause();
clearTimeout(timer);
});
var mouseInsideCircle = function(e, c) {
var bb = c.getBBox();
if (e.offsetX > bb.x && e.offsetY > bb.y) {
return true;
}
return false;
}
我确定解决方案存在缺陷(它正在检查boundBox,而不是圆圈本身;它还假设圆圈向右移动)并且可能并不理想,但它似乎工作得相当顺利,希望能让你在右边路径。