我想創建一個包含所有子頁面的多個(html5)部分的1頁網站。有一個固定的導航。這裏有幾個要求:jQuery單頁網頁滾動/散列問題
- 當點擊導航鏈接(如#home,#約-ME),我希望它平穩地滾動到部分
- 我想在URL中使用哈希like domain.com/#about-me
- 我希望用戶能夠使用瀏覽器的後退/前進按鈕,並在使用時順利滾動到該部分
- 當URL domain.com/#about -me被直接加載,我希望它能夠平滑地滾動到頂部的#about-me部分。
我一直想弄明白這幾天。我試圖從零開始,並使用諸如BBQ插件等大量不同的插件。我無法弄清楚。但是我學到了一點,所以我決定從頭開始。我更喜歡自己寫插件,因爲它很輕便。不過,如果使用插件的話,如果自己編寫它太麻煩,我一點問題都沒有。
現在我有這樣的HTML,一個簡單的導航:
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about-me">About me</a></li>
<li><a href="#portfolio">Portfolio</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
和部分:
<div id="content-wrapper">
<section id="home">
<div>content...</div>
</section>
<section id="about-me">
<div>content...</div>
</section>
etc...
</div>
現在的jQuery的一部分:
// Function to check if section exists
function isSection(section){
if($('section'+section).length > 0){
return true;
}
else{
return false;
}
}
// Scroll function
function scrollToSection(section){
var offset = $(section).offset().top;
$('html, body').stop().animate({
scrollTop: offset
}, 600);
}
// The Click() function
$('nav ul a').click(function(){
var section = $(this).attr('href');
if(isSection(section)){
scrollToSection(section);
}
})
馬上我遇到一個問題。哈希值會改變,但它會立即跳轉到該部分,然後一秒鐘後它會執行滾動動畫(從它的上一個起始位置開始)。我可以使用preventDefault()(這會導致一個完美的平滑動畫),但散列不會改變。很好,它改變散列以便瀏覽器歷史記錄工作,但當歷史按鈕被按下時不會發生滾動。
我該如何從這裏開始考慮最高要求?任何建議和最好的例子?
我聽說BBQ hashchange插件對所有這些工作都很好嗎?我將如何實現這一點?文檔不完全考慮我的要求。
很好的建議。但是這會導致同樣的問題。它立即跳轉到該部分,然後一秒鐘之後它就會執行滾動動畫。 – Bob
@Bob我認爲我通過僅在動畫完成時更改哈希來解決該問題。 – Adam
啊,是的,謝謝你的例子!我沒有做錯誤的回報,我認爲這是造成奇怪的跳躍問題。我認爲preventDefault()會照顧到這一點。但是那部分是被覆蓋的!謝謝!要求3和4對我來說仍然是一個謎。 – Bob