悬浮导航栏的实现以及导航跳转
随着页面复杂程度的增加,导航栏的设计就显得尤为重要。顾名思义,导航,就像航海中的指明灯一样,要一直存在。实际中都是用户把页面卷进去一定高度的时候(此时导航栏可能已从页面上消失),导航栏要始终固定在页面的某一部分,一般都为最顶端。
先介绍用到的一些属性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 }