懸浮導航欄的實現以及導航跳轉


隨着頁面復雜程度的增加,導航欄的設計就顯得尤為重要。顧名思義,導航,就像航海中的指明燈一樣,要一直存在。實際中都是用戶把頁面卷進去一定高度的時候(此時導航欄可能已從頁面上消失),導航欄要始終固定在頁面的某一部分,一般都為最頂端。

先介紹用到的一些屬性offsetTop,scrollTop. 

offsetTop:獲取元素相對於頁面頂端的高度,只讀,返回的是Number型。

scrollTop:獲取或設置元素相對於垂直滾動條頂部的偏移,可讀寫,返回Number型。當一個元素的實際高度超過其顯示區域的高度時,在一定的設置下,瀏覽器會為該元素顯示相應的垂直滾動條。此時,scrollTop返回的就是該元素在可見區域之上被隱藏部分的高度。

a)懸浮導航欄 

 頁面結構:

 1 <div id="navigation">
 2     <a href="">1</a>
 3     <a href="">2</a>
 4     <a href="">3</a>
 5     <a href="">4</a>
 6 </div>
 7 <div class="model">1</div>
 8 <div class="model">2</div>
 9 <div class="model">3</div>
10 <div class="model">4</div>

 

(一)使用position屬性實現

1 #navigation{
2   position: relative;
3   top: 0;    
4 }

使用JS,當導航欄超出顯示區域時,即導航欄距頁面頂端的初始高度小於滾動條的垂直偏移時,把position屬性的值改為fixed.

var ele = document.getElementById("navigation");
var top1 = ele.offsetTop;
function scroll_nav1(){
    var top2 = document.documentElement.scrollTop || document.body.scrollTop;
    if(top2>=top1){
        ele.style.position = "fixed";  
    }else{
        ele.style.position = "relative";  
    }
}    
window.onscroll = scroll_nav1;

 

(二)改變元素的style.top屬性值(top可讀寫,返回string型)

因為offsetTop只讀,所以可以改變top的值實現。

 1 var ele = document.getElementById("navigation");
 2 var top1 = ele.offsetTop;
 3 function scroll_nav2(){
 4   var top2 = document.documentElement.scrollTop||document.body.scrollTop;
 5   if(top2>=top1){
 6      ele.style.top = (top2-top1)+"px";  
 7    }else{
 8      ele.style.top = 0;  
 9   }
10 }
11 window.onscroll = scroll_nav2;

b)導航跳轉

  點擊導航欄上的鏈接跳轉到指定區域,如果導航欄已經處於懸浮狀態,即脫離了正常的文檔流,那么對於arr2中元素的offsetTop屬性的計算就有影響(懸浮前后,該值有兩個結果),導致頁面顯示不統一。所以要在navigation外面再包一層占位(高度要設定)。

 1 <div id="h"> 
 2   <div id="navigation">
 3       <a href="">1</a>
 4       <a href="">2</a>
 5       <a href="">3</a>
 6       <a href="">4</a>
 7   </div>
 8 </div>
 9   <div class="model">1</div>
10   <div class="model">2</div>
11   <div class="model">3</div>
12   <div class="model">4</div>

 

 

 1 var arr1 = document.getElementById("navigation").getElementsByTagName("a");
 2 var arr2 = document.getElementsByName("model");
 3 var h1 = document.getElementById("h").offsetHeight;
 4 for(var i=0 ; i<arr1.length ; i++){
 5   arr1[i].onclick = (function(num){
 6       return function(){
 7          var obj = document.body || document.documentElement;
 8          obj.scrollTop = arr2[num].offsetTop - h1;
 9       }      
10    })(i)  
11 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM