2016-02-05 76 views
0

我試圖讓頁面像幻燈片一樣工作,每個部分都以幻燈片的形式出現。該HTML是4節的元素,每個ID約爲,約2等我使用jQuery使他們在窗口高度加載時。在向下滾動時,我激活了從一張幻燈片到另一張幻燈片的功能。scrollTop()和幻燈片狀的動畫

它在第一張幻燈片上效果很好,但之後卡在它上面。如果我重新加載頁面並在該位置重新加載,它將一直運行,直到下一張幻燈片再次停留。看看這個值,我可以看到激活下一個動畫的條件(例如,動畫到#about3),但它拒絕移動(當滾動時總是動畫到#about2)。

我在這裏做錯了什麼?

function scrollDown(){ 
    $height = window.innerHeight; 
    $scroll = $(window).scrollTop(); 
    console.log($scroll+' and '+$height); 
    if ($scroll > 0 && $scroll < $height) { 
     $('html, body').animate({scrollTop: $("#about2").offset().top}, 1000);  
    } else if ($scroll > $height && $scroll < 2*$height) { 
     $('html, body').animate({scrollTop: $("#about3").offset().top}, 1000);  
    } else if ($scroll > 2*$height && $scroll < 3*$height) { 
     $('html, body').animate({scrollTop: $("#about4").offset().top}, 1000);  
    } 
} 

這裏是我的代碼的jsfiddle:https://jsfiddle.net/9b8s6pna/

+0

jsfiddle會有幫助 – phenxd

+0

好主意@phenxd,我只是加了它 – Skaddict

+0

爲什麼不使用fullpage.js插件?它很容易設置,跨瀏覽器,並響應不同的設備。你可以在這裏找到它http://alvarotrigo.com/fullPage/#firstPage –

回答

0

你接近,但只是缺少了一兩件事。由於調用了scrollDown函數的次數,它似乎並沒有將它傳遞到下一節。每創建一次滾動就創建一個事件,然後通知窗口做更多的滾動操作,這將引發更多的滾動事件來創建長鏈。實質上,一大羣動畫請求正在排隊。最終,如果您讓頁面坐得夠長,它會向下滾動到about3部分。

我添加了一個布爾值來跟蹤窗口滾動的時間,並將其添加到您的邏輯檢查中。這應該有助於防止過多的動畫調用:]當窗口滾動到特定部分的條件滿足時,布爾型「isScrolling」設置爲true。動畫完成後,該布爾值將重置爲false,並可以進行另一個滾動動畫。

var isScrolling = false; 

function scrollDown(){ 
    $height = window.innerHeight; 
    $scroll = $(window).scrollTop(); 
    console.log($scroll+' and '+$height); 
    if ($scroll > 0 && $scroll < $height && isScrolling === false) { 
      console.log('about1'); 
      isScrolling = true; 
      $('html, body').animate({ 
       scrollTop: $("#about2").offset().top 
      }, 1000, function(){ isScrolling = false; } 
     );  
    } else if ($scroll > $height && $scroll < $height * 2 && isScrolling === false) { 
      console.log('about2'); 
      isScrolling = true; 
      $('html, body').animate({ 
          scrollTop: $("#about3").offset().top 
          }, 1000, 
      function(){ isScrolling = false; } 
     );  
    } else if ($scroll > 2*$height && $scroll < $height * 3 && isScrolling === false) { 
      console.log('about3'); 
      isScrolling = true; 
      $('html, body').animate({ 
       scrollTop: $("#about4").offset().top 
       }, 1000, 
       function(){ isScrolling = false; } 
     );  
    } 
} 

此外,請注意,我有一個小調整添加到CSS到身體上的邊距設置爲0。這是在比較中產生的問題,並會使頁面認爲這是滾動進一步下跌比實際情況要好,因此在整個頁面上開始滾動到下一部分。通過滾動一次,它會創建一個連鎖反應,一次滾動整個網站。要看到這個動作,只需刪除邊距:0;在這個jsfiddle的身體標記上。

+0

非常感謝您的解釋!由於時間的限制,我使用了Fullpage插件,但我明白了scroll()方式現在更好的方式。下次我必須寫出類似的功能時,我會記住這一點。 – Skaddict