這個在Change Active Menu Item on Page Scroll?有詳細的討論。對應的代碼在http://jsfiddle.net/mekwall/up4nu/。javascript
下面是代碼,我作了些小的改動。css
<html> <head> <style> #top-menu { position: fixed; z-index: 1; background: white; left: 0; right: 0; top: 0; } #top-menu li { float: left; list-style: none; } #top-menu a { display: block; padding: 5px 25px 7px 25px; width: 4em; text-align: center; -webkit-transition: .5s all ease-out; -moz-transition: .5s all ease-out; transition: .5s all ease-out; border-top: 3px solid white; color: #aaa; text-decoration: none; } #top-menu a:hover { color: #000; } #top-menu li.active a { border-top: 3px solid #333; color: red; } #foo { position: absolute; top: 400px; } #bar { position: absolute; top: 800px; } #baz { position: absolute; top: 1200px; } </style> <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js" type="text/javascript"></script> </head> <body> <ul id="top-menu"> <li class="active"> <a href="#">Top</a> </li> <li> <a href="#foo">Foo</a> </li> <li> <a href="#bar">Bar</a> </li> <li> <a href="#baz">Baz</a> </li> </ul> <a id="foo">Foo</a> <a id="bar">Bar</a> <a id="baz">Baz</a> <script type="text/javascript"> // Cache selectors var lastId, topMenu = $("#top-menu"), topMenuHeight = topMenu.outerHeight()+15, // All list items menuItems = topMenu.find("a"), // Anchors corresponding to menu items scrollItems = menuItems.map(function(){ // 即<a id="foo">Foo</a>,等 var item = $($(this).attr("href")); console.log($(this).attr("href")); // debug console.log(item); // debug console.log(item.length); // debug if (item.length) { return item; } }); // Bind click handler to menu items // so we can get a fancy scroll animation menuItems.click(function(e){ var href = $(this).attr("href"), offsetTop = href === "#" ? 0 : $(href).offset().top-topMenuHeight+1; $('html, body').stop().animate({ scrollTop: offsetTop }, 300); e.preventDefault(); }); // Bind to scroll $(window).scroll(function(){ // Get container scroll position var fromTop = $(this).scrollTop()+topMenuHeight; // Get id of current scroll item var cur = scrollItems.map(function(){ if ($(this).offset().top < fromTop) return this; }); // Get the id of the current element cur = cur[cur.length-1]; var id = cur && cur.length ? cur[0].id : ""; if (lastId !== id) { lastId = id; // Set/remove active class menuItems .parent().removeClass("active") .end().filter("[href=#"+id+"]").parent().addClass("active"); } }); </script> </body> </html>
效果以下:html
firebug控制檯輸出以下:java
jquery stop函數:http://www.w3school.com.cn/jquery/jquery_stop.aspjquery
jquery outerHeight()函數:http://www.w3schools.com/jquery/html_outerheight.aspweb
jquery scrollTop()函數:http://www.w3school.com.cn/jquery/css_scrolltop.aspajax
jquery animate()函數:http://www.w3school.com.cn/jquery/jquery_animate.asp函數
jquery animate+scrollTop:http://stackoverflow.com/questions/4034659/is-it-possible-to-animate-scrolltop-with-jquerythis
jquery offset函數:http://www.w3school.com.cn/jquery/css_offset.asp.net