jQuery悬停动画 - 如何在mouseout上正确停止

时间:2012-11-01 23:19:17

标签: jquery hover

我的问题是,当我将鼠标快速移动到方形元素上然后用光标移出时,它有时无法完成悬停功能的“鼠标输出”部分

我的HTML:

<div id="wrapper">
    <div id="o1" class="square"></div>
    <div id="o2" class="square"></div>
</div>

CSS

#wrapper {
    width: 100px;
    height: 100px;
    position: relative;
}
.square {
    width: 100px;
    height: 100px;
    position: absolute;
}
#o1 {
    background: red;
}
#o2 {
    background: blue;
    display:none;
}

使用Javascript:

$(function(){
    var o1 = $("#o1");
    var o2 = $("#o2");
    $('#wrapper').hover(function() {
        o1.fadeOut(400,function () {
            o2.fadeIn(400);
        });
    }, function() {
        o2.fadeOut(400,function () {
            o1.fadeIn(400);
        });
    });
});

jsFiddle:http://jsfiddle.net/TQ37t/

我尝试在代码中的不同位置使用stop()不同的参数,但没有成功。感谢

5 个答案:

答案 0 :(得分:2)

我提出的最简单的解决方案是在添加任何新动画之前确保所有队列都已停止:

var o1 = $("#o1");
var o2 = $("#o2");
$('#wrapper').hover(function() {
    o2.stop(true, true);
    o1.stop(true, true);
    o1.fadeOut(400,function () {
        o2.fadeIn(400);
    });
}, function() {
    o1.stop(true, true);
    o2.stop(true, true);
    o2.fadeOut(400,function () {
        o1.fadeIn(400);
    });
});

请注意,停止队列时顺序很重要。请考虑以下顺序:

    o1.fadeOut(400,function () {
        o2.fadeIn(400);
    });
    o2.stop(true, true); // at this point, o1 can still queue a new animation onto o2
        // at this point, o1 might finish fadeOut() and begin o2.fadeIn()
    o1.stop(true, true); // We should have stopped this one first

答案 1 :(得分:1)

让我们假设o1是可见的,o2是隐藏的。如果我们快速进出,则会发生以下情况:

  • o1开始淡出
  • o2开始淡出 - 立即完成,已隐藏
  • 由于o2淡出,
  • o1被告知淡入
  • 由于o1淡出,
  • o2被告知淡入

你得到的是两个形状同时可见。这会在以后导致进一步的不一致。

您需要做的是在mouseover / mouseout上设置一个标志,用于定义鼠标是否超过#wrapper。你也有类似的fadeIn / fadeOut指令,就像你现在一样。但是对于回调,运行一个读取标志的函数并确定哪个对象需要淡入。

$(function(){
    var o1 = $("#o1");
    var o2 = $("#o2");
    var over = false;
    choose = function() {
        if (over) {
            o2.fadeIn(400);
        } else {
            o1.fadeIn(400);
        }
    }
    $('#wrapper').hover(function() {
        over = true;
        o1.fadeOut(400,choose);
    }, function() {
        over = false;
        o2.fadeOut(400,choose);
    });
});

JSFiddle:http://jsfiddle.net/TQ37t/2/

答案 2 :(得分:1)

因为有两个不同的队列同时运行,所以让它们停止是一个问题。我提出的一个解决方案是创建一个可以控制,停止等的队列.Javascript看起来像这样:

var o1 = $("#o1");
var o2 = $("#o2");
var wrapper = $('#wrapper');

function funcToFadeInOutDequeue(jq, isIn) {
    if (isIn) {
        return function() {
            jq.fadeIn(400, function() {
                wrapper.dequeue();
            });
        };
    } else {
        return function() {
            jq.fadeOut(400, function() {
                wrapper.dequeue();
            });
        };
    }
}

wrapper.hover(function() {
    wrapper.stop(true);
    wrapper.queue( funcToFadeInOutDequeue(o1, false) );
    wrapper.queue( funcToFadeInOutDequeue(o2, true) );
}, function() {
    wrapper.stop(true);
    wrapper.queue( funcToFadeInOutDequeue(o2, false) );
    wrapper.queue( funcToFadeInOutDequeue(o1, true) );
});

请参阅fiddle ...

答案 3 :(得分:0)

以下链接可帮助您从某事开始:

http://archive.plugins.jquery.com/project/Pause-Resume-animation

答案 4 :(得分:0)

停止实际处理问题(如果这是您所追求的效果):

$(function(){
var o1 = $("#o1");
var o2 = $("#o2");
$('#wrapper').hover(function() {
    o1.fadeOut(400,function () {
        o2.fadeIn(400);
    });
}, function() {
    o1.stop();
    o2.fadeOut(400,function () {
        o1.fadeIn(400);
    });
});

});

http://jsfiddle.net/adam_gajzlerowicz/TQ37t/3/