2013-03-09 2 views
-2

Я использую этот код, который нашел в этом ответе Change Active Menu Item on Page Scroll?, но не могу заставить его работать ... вот что я вставляю из примера jsFiddle.jquery scroll over anchor item item highlight

<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 
<script> 
// 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 
    }, 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> 
<style> 
body { 
    height: 6000px; 
    font-family: Helvetica, Arial; 
} 

#top-menu { 
    position: fixed; 
    z-index: 1; 
    background: white; 
    left: 0; 
    right: 0; 
    top: 0; 
} 

#top-menu li { 
    float: left; 
} 

#top-menu a { 
    display: block; 
    padding: 5px 25px 7px 25px; 
    -webkit-transition: 1s all ease; 
    -moz-transition: 1s all ease; 
    transition: 1s all ease; 
    border-top: 3px solid white; 
    color: #666; 
    text-decoration: none; 
} 

#top-menu a:hover { 
    color: #000; 
} 

#top-menu li.active a { 
    border-top: 3px solid #333; 
    color: #333; 
    font-weight: bold; 
} 

#foo { 
    position: absolute; 
    top: 400px; 
} 

#bar { 
    position: absolute; 
    top: 800px; 
} 

#baz { 
    position: absolute; 
    top: 1200px; 
} 
</style> 
</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> 
</body> 
+1

Укажите, что не работает, пожалуйста. –

+0

пункт меню не выделяется при прокрутке вниз по странице – Breezy

+0

, но если вы нажмете на пункт меню, он доставит вас к якорю, но не закроет объект – Breezy

ответ

1

Перемещайте Javascript в нижней части или обернуть его в document.ready заявление:

$(function() { 
    // Handler for .ready() called. 
}); 

.ready() - jQuery

Вы пытаетесь прикрепить события к элементам, которые еще не существуют ,

+0

совершенным ... спасибо за помощь – Breezy

+0

@Breezy Нет проблем , Если бы это сработало для вас, вы можете принять его в качестве ответа? :) – Syon

0

В ответ на новый вопрос BREEZY в КОММЕНТАРИИ:

scrollTop должен идти мимо Анкер для того, чтобы переместить выделение, и 1px дополнительный прирост не совсем это сделать.

Изменить это:

offsetTop = href === "#" ? 0 : $(href).offset().top-topMenuHeight+1; 

Для этого:

offsetTop = href === "#" ? 0 : $(href).offset().top-topMenuHeight+2; //<== note the 2 

или это:

offsetTop = href === "#" ? 0 : $(href).offset().top-topMenuHeight+5; //<== note the 5