2015-10-09 196 views
0

我試圖做一個全屏部分滾動頁面。我已經能夠阻止默認的用戶滾動。現在,以取代我用下面的代碼:jQuery動畫完成功能

var isAutoScrolling = false; 
$(window).off('scroll.fullscreen'); 
$(window).on('scroll.fullscreen', function() { 
    if (isAutoScrolling === false) { 
     isAutoScrolling = true; 
     $('html, body').animate({ 
      scrollTop: $(nextDiv).offset().top 
     }, '400', 'linear', function() { 
      console.log('animated'); 
      isAutoScrolling = false; 
     }); 
    } 
}); 

可惜的console.log寫「動畫」每次滾動的2倍。這怎麼可能?上面的代碼應該至少在2個console.logs之間做出400ms的中斷,對吧?任何人都在捕捉這個錯誤?

+0

缺少')'的'上()'; – Tushar

+0

你能分享一個演示來重現這種行爲嗎? –

+0

@ A.Wolff有趣。你對我有好感。 :) –

回答

3

問題來自你對兩個元素HTML,身體結合事件。一些 瀏覽器然後將它發射兩次(其他一些具有這些可滾動的 元素中的一個,因此只發射一次)。

您可以使用promise接口和相關方法在瀏覽器中對其進行規範化。

$(window).on('scroll.fullscreen', function() { 
    if (isAutoScrolling === false) { 
     isAutoScrolling = true; 
     $('html, body').animate({ 
      scrollTop: $(nextDiv).offset().top 
     }, '400', 'linear').promise().done(function() { 
      console.log('animated'); 
      isAutoScrolling = false; 
     }); 
    } 
}); 

這是說,我想,而不是使用一個標誌,你可以使用 :animated僞選擇:

$(window).on('scroll.fullscreen', function() { 
    $('html, body').filter(':not(:animated)').animate({ 
     scrollTop: $(nextDiv).offset().top 
    }, '400', 'linear').promise().done(function() { 
     console.log('animated'); 
    }); 
}); 

(見@下面尼卡比曹的評論)

+1

每次從性能的角度來看,滾動性太差時,不會調用'$('html,body')。filter(':not(:animated)') –

+1

@IonicăBizău我會說雅,這將是非常消耗,所以一個國旗確實似乎是一個更好的方法 –

+0

作品像一個魅力!謝謝。 – SoBiT