jQuery .hide() -- 向左滑动元素

jQuery .hide() -- sliding elements left

我正在将导航固定到页面顶部。我正在使用 Bootstrap(仅限 CSS)。我正在使用 jQuery 隐藏一个徽标 (img class .logo) 并显示另一个 (img class .logo-sm) , 在滚动中。

基本上一切正常,除了一件事。隐藏功能在淡出时将主徽标向左滑动,但我希望它向上滑动。我很确定这不是 .hide() 函数的默认行为,但我不太了解 jQuery 所以我不确定如何更改它。

我构建了一个 JSFiddle 来演示该行为。由于某种原因,它不能始终如一地工作(它在本地工作),但您可以在第一次向下滚动时看到徽标向左滑动。

JSFiddle

剧本:

$(document).ready(function() {
// nav fixing
$(window).scroll(function() {
    if ($(this).scrollTop() > 1){
        $(".logo").hide(100);
        $(".logo-sm").show(200);
    } else {
        $(".logo").show(100);
        $(".logo-sm").hide(200);
    }
});
});

$.hide() 仅将元素的 display 设置为 none。它没有动画。该行为可能是由于 CSS.

中的转换引起的

如果要使用 jQuery 为元素设置动画,可以使用 .slideUp().slideDown()

$(document).ready(function() {
    // nav fixing
    $(window).scroll(function() {
        if ($(this).scrollTop() > 1){
            $(".logo").slideUp(100);
            $(".logo-sm").slideDown(200);
        } else {
            $(".logo").slideUp(100);
            $(".logo-sm").slideDown(200);
        }
    });
});

但是您的 fiddle 中还有一些其他事情正在发生,这导致了一些奇怪的事情,所以这不会更好。我建议不要使用 jQuery 设置动画,而是使用它来更改元素上的 classes 并使用 CSS 过渡处理动画。像这样:

$(document).ready(function() {
    // nav fixing
    $(window).scroll(function() {
        if ($(this).scrollTop() > 1){
            $(".logo").removeClass("showing");
            $(".logo-sm").addClass("showing");
        } else {
            $(".logo-sm").removeClass("showing");
            $(".logo").addClass("showing");
        }
    });
});

然后使用过渡设计 .showing class。

这是因为 .show() 正在应用 display: inline-block 而你需要的是 display: block.

要解决此问题,您需要找到将 header .logo css 显示值设置为内联并将其更改为块的原因。从 jquery api 开始,show 会将显示 属性 设置为最初设置的值。在本例中,它是 inline-block,这就是您的徽标向左移动的原因。