当快速滚动到顶部时,jQuery addClass不起作用

时间:2016-10-14 13:21:01

标签: jquery scrollto

我想在页面上向下滚动时显示一些按钮,并且在点击锚点时我使用了scrollTo.js为滚动设置动画。

要显示和隐藏按钮,我只需添加并删除“隐藏”类。

一切都很好,除非你一次滚动到顶部很长的距离:当我这样做时,我可以看到,当到页面顶部的距离小于时,就会添加“隐藏”类。 282px,但在此之后立即再次删除此类,使按钮可见。如果我稍微滚动一下,则会再次正确添加该类。

可能导致此行为的原因是什么?

JS

var $nav = $('nav');
var $content = $('#content');
var $toTop = $('#to-top');

function scrollWindow(){
    var scrollTop = $(window).scrollTop();
    console.log(scrollTop);
    if (scrollTop > 282) {
        $nav.addClass('minimalized');
        $content.css('padding-top', $nav.height()+'px');
        showButtons();
    } else {
        $nav.removeClass('minimalized');
        $content.css('padding-top', '0px');
        hideButtons();
    }
}

function showButtons() {
    console.log('showing buttons');
    setTimeout(function(){
        $('#dutch').removeClass('hidden');
        $('#fixed-logo').removeClass('hidden');
    }, 300);
    setTimeout(function(){
        $('#english').removeClass('hidden');
    }, 400);
    setTimeout(function(){
        $('#to-top').removeClass('hidden');
    }, 500);
}

function hideButtons() {
    console.log('hiding buttons');
    $('#fixed-logo').addClass('hidden');
    $('#dutch').addClass('hidden');
    $('#english').addClass('hidden');
    //$('#to-top').addClass('hidden');
}

$(window).scroll(scrollWindow);

$toTop.click(function(event){
    event.preventDefault();
    $.scrollTo(0,500);
    hideButtons();
});

$('nav ul li:nth-child(2) a').click(function(event){
    event.preventDefault();
    var target = $('#references').offset().top - 80;
    $.scrollTo(target,500);
});

$('nav ul li:nth-child(3) a').click(function(event){
    event.preventDefault();
    var target = $('#contact').offset().top - 80;
    $.scrollTo(target,500);
});

SCSS

#to-top, #dutch, #english{
    width: 26px;
    height: 21px;
    position: fixed;
    border: 1px solid #559f99;
    text-align: center;
    text-decoration: none;
    top: 240px;
    right: 15%;
    padding: 1rem;
    border-radius: 50%;
    transition: all 0.3s;
    padding-top: 19px;
    text-transform: uppercase;
    font-family: $abel;
    font-size: 1.2rem;
    color: $bluegreen;
    background: none;
    &:hover{
        color: $white;
        background: $bluegreen;
        transition: all 0.3s;
    }
    &.hidden{
        right: -100px;
        transition: right 0.6s;
    }
}
#dutch{
    top: 100px;
    &.hidden{
        right: -100px;
        transition: right 0.6s;
    }
}
#english{
    top: 170px;
    &.hidden{
        right: -100px;
        transition: right 0.6s;
    }
}

HTML

<a id="dutch" class="hidden" href="#">NL</a>
<a id="english" class="hidden" href="#">EN</a>
<a id="to-top" class="hidden" href="#top">Top</a>

Codepen: http://codepen.io/Gwouten/pen/LRBzbo

1 个答案:

答案 0 :(得分:0)

您的setTimeouts互相重叠。我认为你应该删除它们或使你的代码更聪明,以便在尝试执行同一元素上的不同内容之前检测到活动超时:

http://codepen.io/anon/pen/ALgQPN

当您快速向上和向下滚动时,该类将被删除,然后再次添加。