网页定位导航特效

涉及技术点:

  1. 锚点(anchor):锚点是网页制作中超链接的一种,又叫命名锚记。锚点是一种页面内的超级链接。
  2. 关于滚动条定位的事件和方法(借助jQuery)
    • scoll([data],fn):当用户滚动指定的元素时,会发生scroll事件。scroll事件适用 于所有可滚动的元素和window对象(浏览器窗口)。例如 当页面滚动条发生变化时,执行函数……:
      $(window).scroll(function(){/*......*/};
    • scrollTop[vall]:获取/设置匹配元素相对滚动条顶部的偏移。
    • offset():获取匹配元素的相对偏移。返回对象包含两个整形属性:top和left,以像素计.

代码实现:

HTML代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<div id="menu">
<ul>
<li><a href="#item1" class="current">1F 男装</a></li>
<li><a href="#item2">2F 女装</a></li>
<li><a href="#item3">3F 美妆</a></li>
<li><a href="#item4">4F 数码</a></li>
<li><a href="#item5">5F 母婴</a></li>
</ul>
</div>
<div id="content">
<h1>地狗购物网</h1>
<div id="item1" class="item">
<h2>1F 男装</h2>
<ul>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
<li><a href="#"><img src="1F.jpg" alt=""/></a></li>
</ul>
</div>
<div id="item2" class="item">
<h2>2F 女装</h2>
<!-- 以下代码同上,省略 -->
</div>

jQuery代码部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$(document).ready(function () {
$(window).scroll(function () {
var items = $("#content").find(".item");
var menu = $("#menu");
var top = $(document).scrollTop(); //当前位置相对于垂直滚动条顶部的偏移
var currentId = ""; //滚动条现在所在位置的item id
// 以下实现让导航菜单在滚动条滚动的时候自动设置焦点
items.each(function () {
var m = $(this);
//注意:m.offset().top代表每一个item的顶部位置
if (top > m.offset().top - 300) {
currentId = "#" + m.attr("id");
} else {
return false;
}
});
//给相应楼层的a设置current样式,取消其他链接的current样式
var currentLink = menu.find(".current");
if (currentId && currentLink.attr("href") != currentId) {
currentLink.removeClass("current");
menu.find("[href=" + currentId + "]").addClass("current");
}
});
});

原生JS代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//定义getByClassName函数,让函数实现根据class name获取对象并返回
function getByClassName(obj, cls){
var elements = obj.getElementsByTagName("*");
var result = [];
for(var i = 0; i < elements.length; i++){
if(elements[i].className == cls){
result.push(elements[i]);
}
}
return result;
}
function hasClass( obj, cls ){
return obj.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
}
function removeClass( obj, cls ){
if( hasClass( obj, cls )){
//remove
var reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
obj.className = obj.className.replace(reg, "");
}
}
//定义getByClassName函数,让函数实现给对象增加class
function addClass(obj, cls){
if(!hasClass(obj, cls)){
obj.className += " " + cls;
}
}
window.onload = function(){
window.onscroll = function(){
var top = document.documentElement.scrollTop || document.body.scrollTop;
var menus = document.getElementById("menu").getElementsByTagName("a");
var items = getByClassName(document.getElementById("content"), "item");
var currentId = "";
for ( var i=0; i< items.length; i++ ){
var _item = items[i];
var _itemTop = _item.offsetTop;
if( top > _itemTop - 200 ){
currentId = _item.id;
} else {
break;
}
}
//请补充此处代码,给正确的menu下的a元素class赋值current
if(currentId){
for(var j = 0; j < menus.length; j++){
var _menu = menus[j];
var _href = _menu.href.split("#");
if(_href[_href.length - 1] != currentId){
removeClass(_menu, "current");
} else {
addClass(_menu, "current");
}
}
}
}
}

demo效果

Demo演示:演示效果

坚持原创技术分享,您的支持将鼓励我继续创作!