जवाबों:
यह कंटेनर के स्क्रॉल इवेंट (आमतौर पर विंडो) के लिए बाइंडिंग द्वारा किया जाता है ।
त्वरित उदाहरण:
// Cache selectors
var 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 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 : "";
// Set/remove active class
menuItems
.parent().removeClass("active")
.end().filter("[href='#"+id+"']").parent().addClass("active");
});
स्क्रॉल एनीमेशन सहित jsFiddle पर कार्रवाई में ऊपर देखें ।
बस मेरे कोड और निशानची और डेमो लिंक की जाँच करें:
// Basice Code keep it
$(document).ready(function () {
$(document).on("scroll", onScroll);
//smoothscroll
$('a[href^="#"]').on('click', function (e) {
e.preventDefault();
$(document).off("scroll");
$('a').each(function () {
$(this).removeClass('active');
})
$(this).addClass('active');
var target = this.hash,
menu = target;
$target = $(target);
$('html, body').stop().animate({
'scrollTop': $target.offset().top+2
}, 500, 'swing', function () {
window.location.hash = target;
$(document).on("scroll", onScroll);
});
});
});
// Use Your Class or ID For Selection
function onScroll(event){
var scrollPos = $(document).scrollTop();
$('#menu-center a').each(function () {
var currLink = $(this);
var refElement = $(currLink.attr("href"));
if (refElement.position().top <= scrollPos && refElement.position().top + refElement.height() > scrollPos) {
$('#menu-center ul li a').removeClass("active");
currLink.addClass("active");
}
else{
currLink.removeClass("active");
}
});
}
बस @Marcus Ekwall के जवाब के पूरक के लिए। इस तरह करने से केवल लंगर लिंक मिलेंगे। और अगर आपके पास लंगर लिंक और नियमित लोगों का मिश्रण है तो आपको समस्या नहीं होगी।
jQuery(document).ready(function(jQuery) {
var topMenu = jQuery("#top-menu"),
offset = 40,
topMenuHeight = topMenu.outerHeight()+offset,
// All list items
menuItems = topMenu.find('a[href*="#"]'),
// Anchors corresponding to menu items
scrollItems = menuItems.map(function(){
var href = jQuery(this).attr("href"),
id = href.substring(href.indexOf('#')),
item = jQuery(id);
//console.log(item)
if (item.length) { return item; }
});
// so we can get a fancy scroll animation
menuItems.click(function(e){
var href = jQuery(this).attr("href"),
id = href.substring(href.indexOf('#'));
offsetTop = href === "#" ? 0 : jQuery(id).offset().top-topMenuHeight+1;
jQuery('html, body').stop().animate({
scrollTop: offsetTop
}, 300);
e.preventDefault();
});
// Bind to scroll
jQuery(window).scroll(function(){
// Get container scroll position
var fromTop = jQuery(this).scrollTop()+topMenuHeight;
// Get id of current scroll item
var cur = scrollItems.map(function(){
if (jQuery(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 : "";
menuItems.parent().removeClass("active");
if(id){
menuItems.parent().end().filter("[href*='#"+id+"']").parent().addClass("active");
}
})
})
मूल रूप से मैं बदल दिया
menuItems = topMenu.find("a"),
द्वारा
menuItems = topMenu.find('a[href*="#"]'),
लंगर के साथ सभी लिंक का मिलान करने के लिए, और सभी को बदल दिया कि इसके साथ काम करने के लिए क्या आवश्यक था
इसे jsfiddle पर कार्रवाई में देखें
यदि आप JQuery 3 में काम करने के लिए स्वीकृत उत्तर चाहते हैं तो कोड को इस तरह बदलें:
var scrollItems = menuItems.map(function () {
var id = $(this).attr("href");
try {
var item = $(id);
if (item.length) {
return item;
}
} catch {}
});
मैंने उस आईडी द्वारा कोई तत्व नहीं होने पर जावास्क्रिप्ट को दुर्घटनाग्रस्त होने से बचाने के लिए एक ट्राइ-कैच जोड़ा। इसे और भी बेहतर बनाने के लिए स्वतंत्र महसूस करें;)
menuItems = topMenu.find("a"),करने के लिएmenuItems = topMenu.find("a").slice(0,4),, की जगह4के साथ [- 1 आपके ऑन-पृष्ठ लिंक]।