我目前有一个粘性滚动导航,可以在通过页面上的每个部分时更改活动类。虽然这是一个小小的车......
继承我的jquery代码:
var s = $("#page-nav"),
pos = s.position();
$(window).scroll(function() {
var windowpos = $(window).scrollTop();
if (windowpos >= pos.top) {
s.addClass("stick");
$('.main').css('margin-top', '60px');
} else {
s.removeClass("stick");
$('.main').removeAttr('style');
}
});
$(window).scroll(function() {
var y = $(this).scrollTop();
$('.linky').each(function (event) {
id = $(this).attr('href');
if (y >= $(id).offset().top) {
$('.linky').not(this).removeClass('active');
$(this).addClass('active');
}
});
});
//page nav
$("#page-nav li a").click(function(e) {
e.preventDefault();
$("#page-nav li a").removeClass('active');
$(this).addClass('active');
goToByScroll($(this).attr("href").replace("#", ""));
});
function goToByScroll(id){
$('html,body').animate({
scrollTop: $("#"+id).offset().top},
'slow');
}
以下是codepen
的实例如何改进我的javascript,使其运行得更顺畅。正如您在单击链接时所看到的那样,它仍然认为它在该部分内并且活动类闪烁。
答案 0 :(得分:1)
您的问题是您在单击链接时以及移动时设置了active
类。我所做的是从click
事件处理程序中删除类处理,让scroll
处理程序处理所有事情。这样,就没有闪烁。您在这里有一个更新的CodePen。
$("#page-nav li a").click(function(e) {
e.preventDefault();
goToByScroll($(this).attr("href").replace("#", ""));
});
如果这个解决方案不够好,请告诉我,我会认为更复杂。
新的工作解决方案here。
基本上,我创建了一个变量来指示您是否点击了链接。如果你有,那么scroll
处理程序不会改变CSS类(避免闪烁)。然后,在complete
函数的animate
处理程序中,我再次将其设置为false(允许在滚动时更改类):
var s = $("#page-nav"),
pos = s.position(),
linkClicked = false;
$(window).scroll(function() {
var windowpos = $(window).scrollTop();
if (windowpos >= pos.top) {
s.addClass("stick");
$('.main').css('margin-top', '60px');
} else {
s.removeClass("stick");
$('.main').removeAttr('style');
}
});
$(window).scroll(function() {
var y = $(this).scrollTop();
$('.linky').each(function (event) {
id = $(this).attr('href');
if (y >= $(id).offset().top) {
if (!linkClicked) {
$('.linky').not(this).removeClass('active');
$(this).addClass('active');
}
}
});
});
//page nav
$("#page-nav li a").click(function(e) {
e.preventDefault();
$("#page-nav li a").removeClass('active');
$(this).addClass('active');
linkClicked = true;
goToByScroll($(this).attr("href").replace("#", ""));
});
function goToByScroll(id){
$('html,body').animate({
scrollTop: $("#"+id).offset().top},
'slow', function() {
linkClicked = false;
});
}