我在单页 Wordpress 站点中使用此脚本的略微修改版本: 更改页面滚动上的活动菜单项?
我改变的只是菜单 UL id、topMenuHeight 和滚动的持续时间。出于某种原因,前两个项目正在工作 - 从 about 滚动到 services 工作,但在那之后,什么也没有。我将“id”变量输出到控制台,它总是显示服务。不太清楚发生了什么。
我在单页 Wordpress 站点中使用此脚本的略微修改版本: 更改页面滚动上的活动菜单项?
我改变的只是菜单 UL id、topMenuHeight 和滚动的持续时间。出于某种原因,前两个项目正在工作 - 从 about 滚动到 services 工作,但在那之后,什么也没有。我将“id”变量输出到控制台,它总是显示服务。不太清楚发生了什么。
You got the navigation menu with the list items, you only need to give your ul an id (in this case: top-menu)
In your html place the next code:
<ul id="top-menu">
<li class="active"><a href="#">item1</li>
<li class=""><a href="#">item2</li>
<li class=""><a href="#">item3</li>
<li class=""><a href="#">item4</li>
<li class=""><a href="#">item5</li>
</ul>
Put in your jquery file the next code:
// 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(){
var item = $($(this).attr("href"));
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
}, 1000);
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");
}
});
and that's it. the id int the topmenu var is the same id as in your ul (in this case #top-menu) topMenu = $("#top-menu")
就我个人而言,我对必须更改菜单顺序的原因没有直接的答案,但如果你稍微改变 CSS 的设计方式,它可以解决你的问题。
如前所述,您需要确保所有“li”链接都按常规顺序列出。
从这一点开始,如果你修复了一些 CSS,你可以操纵它让它看起来一样。
如果将第 27-28 行更改为以下内容,请在 CSS 中:
#menu-main-menu {padding:30px 50px 0 0; float: right}
#menu-main-menu li {float: left; list-style: none outside none; margin-left: 30px; text-transform: uppercase;}
基本上,不是将#menu-main-menu li 设置为向右浮动,而是将菜单更改为向右浮动,将菜单更改为向左浮动以将其设置为正确的顺序。
在#menu-main-menu 里面我添加了
float:right;
在#menu-main-menu li 里面,我将 float:right 更改为
float:left;
如果你想在这里看到代码,你可以去:http: //jsfiddle.net/GpjMc/1/
你也可以让它显示 inline 而不是 float:left 。无论哪种格式最适合您。
#menu-main-menu {padding:30px 50px 0 0; float: right}
#menu-main-menu li {display: inline; list-style: none outside none; margin-left: 30px; text-transform: uppercase;}
你可以使用 jQuery 航点
http://imakewebthings.com/jquery-waypoints/
然后在滚动到特定元素时使用 jquery 更改活动类
$('.thing').waypoint(function(direction) {
jQuery("li.someItem").addClass("active");
});