本篇文章主要介绍了Javascript实现页面滚动时导航智能定位,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
常见的开发页面中可能会有这么一个需求,页面中会有多个模块,每个模块对应一个导航,当页面滚动到某个模块时,对应的模块导航需要加上一个类用于区分当前用户所浏览区域。
假设结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
< p class = "container" >
< p class = "wrapper" >
< p class = "section" id = "section1" >section1</ p >
< p class = "section" id = "section2" >section2</ p >
< p class = "section" id = "section3" >section3</ p >
< p class = "section" id = "section4" >section4</ p >
< p class = "section" id = "section5" >section5</ p >
</ p >
< nav >
< a href = "#section1" rel = "external nofollow" class = "current" >section1</ a >
< a href = "#section2" rel = "external nofollow" >section2</ a >
< a href = "#section3" rel = "external nofollow" >section3</ a >
< a href = "#section4" rel = "external nofollow" >section4</ a >
< a href = "#section5" rel = "external nofollow" >section5</ a >
</ nav >
</ p >
|
页面滚动时导航定位
js代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
var $navs = $( 'nav a' ), // 导航
$sections = $( '.section' ), // 模块
$window = $(window),
navLength = $navs.length - 1;
$window.on( 'scroll' , function () {
var scrollTop = $window.scrollTop(),
len = navLength;
for (; len > -1; len--) {
var that = $sections.eq(len);
if (scrollTop >= that.offset().top) {
$navs.removeClass( 'current' ).eq(len).addClass( 'current' );
break ;
}
}
}); |
效果如下:
不难看出,基本原理就是在window滚动的时候,依次将模块从后向前遍历,如果window的滚动高度大于或等于当前模块的距页面顶部的距离,则将当前模块对应的导航突出显示,并且不再继续遍历
点击导航定位页面
除了这种需求外,还有另一种需求,就是点击导航定位到导航所对应模块的顶部。
代码如下:
1
2
3
4
5
6
|
$navs.on( 'click' , function (e) {
e.preventDefault();
$( 'html, body' ).animate({
'scrollTop' : $($( this ).attr( 'href' )).offset().top
}, 400);
}); |
效果如下: