单页面网页内容较多,页面长度较大,需要方便快速的在页面的不同位置进行定位,所以浮动菜单逐渐流行了起来,如下图 男装、女装、美妆等。
这种菜单功能分为两部分:
1、点击菜单项,网页滚动到对应位置,可简单通过锚点实现;
2、滚动页面的时候,菜单项的选中状态要跟着改变,这就需要监听网页的滚动事件并通过一点计算来实现了;
计算 scrollTop 和 各个 div 的 offsetTop 的大小关系,判断现在网页显示的位置在什么地方,再根据计算的结果给对应的菜单项添加样式。比如第二个 div 的 offset().top = 300, 第三个 div 的offset().top = 600,此时的 scrollTop = 400,说明现在显示的大部分是第二个 div 的位置,700 则是第三个 div。下面是一个简单的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
< 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 = "" alt = "" /></ a ></ li > <!-- 若干个li --> </ ul > </ div > <!-- 若干个item--> </ div > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
* { margin : 0 ; padding : 0 ;} body { font-size : 12px ; line-height : 1.7 ;} li { list-style : none ;} #content { width : 800px ; margin : 0 auto ; padding : 20px ;} #content h 1 { color : #0088bb ;} #content .item { padding : 20px ; margin-bottom : 20px ; border : 1px dotted #0088bb ;} #content .item h 2 { font-size : 16px ; font-weight : bold ; border-bottom : 2px solid #0088bb ; margin-bottom : 10px ;} #content .item li { display : inline ; margin-right : 10px ;} #content .item li a img { width : 230px ; height : 230px ; border : none ;} #menu{ position : fixed ; left : 50% ; margin-left : 400px ; top : 100px ;} #menu ul li a { display : block ; margin : 5px 0 ; font-size : 14px ; font-weight : bold ; color : #333 ; width : 80px ; height : 50px ; line-height : 50px ; text-decoration : none ; text-align : center ; } #menu ul li a:hover,#menu ul li a.current { color : #fff ; background : #0088bb ;} |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$( function (){ $(window).scroll( function (){ var scrollTop = $(document).scrollTop(); var contentItems = $( "#content" ).find( ".item" ); var currentItem = "" ; contentItems.each( function (){ var contentItem = $( this ); var offsetTop = contentItem.offset().top; if (scrollTop > offsetTop-200){ //此处的200视具体情况自行设定,因为如果不减去一个数值,在刚好滚动到一个div的边缘时,菜单的选中状态会出错,比如,页面刚好滚动到第一个div的底部的时候,页面已经显示出第二个div,而菜单中还是第一个选项处于选中状态 currentItem = "#" + contentItem.attr( "id" ); } }); if (currentItem&¤tItem!=$( "#menu" ).find( ".current" ).attr( "href" )){ $( "#menu" ).find( ".current" ).removeClass( "current" ); $( "#menu" ).find( "[href=" + currentItem + "]" ).addClass( "current" ); } }); }); |