0

我在单页 Wordpress 站点中使用此脚本的略微修改版本: 更改页面滚动上的活动菜单项?

我改变的只是菜单 UL id、topMenuHeight 和滚动的持续时间。出于某种原因,前两个项目正在工作 - 从 about 滚动到 services 工作,但在那之后,什么也没有。我将“id”变量输出到控制台,它总是显示服务。不太清楚发生了什么。

http://inspirawebdesign.us/

4

3 回答 3

0

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")

于 2014-04-14T13:02:07.613 回答
0

就我个人而言,我对必须更改菜单顺序的原因没有直接的答案,但如果你稍微改变 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;}
于 2013-03-11T23:56:33.930 回答
0

你可以使用 jQuery 航点

http://imakewebthings.com/jquery-waypoints/

然后在滚动到特定元素时使用 jquery 更改活动类

$('.thing').waypoint(function(direction) {
  jQuery("li.someItem").addClass("active");
});
于 2013-03-11T23:59:56.900 回答