0

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

我的 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()在代码中的不同位置使用不同的参数,但没有成功。谢谢

4

4 回答 4

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
于 2012-11-02T00:26:00.130 回答
1

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

  • o1 开始淡出
  • o2 开始淡出 - 立即结束,已经隐藏
  • o1 被告知淡入,因为 o2 淡出
  • 由于 o1 淡出,o2 被告知淡入

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

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

$(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/

于 2012-11-01T23:36:30.470 回答
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) );
});

小提琴...

于 2012-11-02T00:18:02.227 回答
0

Stop 实际上解决了问题(如果这是您想要的效果):

$(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);
    });
});

}); ​</p>

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

于 2012-11-01T23:38:23.640 回答