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