当用户滚动到平滑滚动的部分时,如何添加活动 class?
How can I add an active class when the user scrolls to a section with smooth scroll?
我正在构建一个简单的 1 页网站并使用 JQuery 更改页面导航 link 的颜色。我已经实现了平滑滚动,可以很好地到达每个锚点。我还实现了一项功能,允许用户向下滚动页面,活动 class 被应用到导航中的锚点,改变颜色。
事情几乎正常工作...除了:
当您单击导航 link 时,活动 class 未应用于正确的 link.
到目前为止,我已尝试更改 classes 的应用方式以及直接 ID 的名称,但它仍然表现不完美。 $('.nav li').eq(i).find('a').addClass('active');
显然发生了一些不正确的事情
任何人都可以建议我如何解决这个问题吗?
这是与html的CP:
https://codepen.io/nolimit966/pen/aboqvOP
谢谢
JS:
$(window).on('scroll',function(){
var WindowTop = $(window).scrollTop();
$('section').each(function(i){
if(WindowTop > $(this).offset().top - 50 &&
WindowTop < $(this).offset().top + $(this).outerHeight(true)
){
$('.nav > li > a').removeClass('active');
$('.nav li').eq(i).find('a').addClass('active');
}
});
});
$('a[href*=#]:not([href=#])').click(function() {
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
if (target.length) {
$('html,body').animate({
scrollTop: target.offset().top
}, 1000);
return false;
}
}
});
});,
HTML:
<h1>Test</h1>
</header>
<nav id="c-primary-nav__list-1" class="c-primary-nav__list">
<ul class="nav">
<li class="c-primary-nav__item">
<a class="c-primary-nav__link" href="#about">About</a>
</li>
<li class="c-primary-nav__item">
<a class="c-primary-nav__link active" href="#reservations">Reservations</a>
</li>
<li class="c-primary-nav__item">
<a class="c-primary-nav__link" href="#contact">Contact</a>
</li>
<li class="c-primary-nav__item">
<a class="c-primary-nav__link" href="#offers">Offers</a>
</li>
</ul>
<div class="c-primary-nav__details">
</div>
</nav>
<div class="l-content-blocks">
<div class="l-content-blocks__wrapper">
<section class="cb-about" id="about">
<div class="cb-about__wrapper">
<div class="cb-about__container">
<div class="cb-about__intro-wrapper">
<h1 class="cb-about__h1" data-aos="fade-up">About </h1>
</div>
<div class="cb-about__image-showcase">
<div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
<div class="c-media" data-push-to-gallery-modal="">
</p>
</div>
</div>
<div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
<div class="c-media" data-push-to-gallery-modal="">
<p class="c-media__caption">Caption Header <em>Caption Copy</em>
</p>
</div>
</div>
<div class="cb-about__showcase-item cb-about__showcase-item--description">
<p data-aos="fade-up" class="cb-about__description">Description section 3 </p>
</div>
<div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
<div class="c-media" data-push-to-gallery-modal="">
<p class="c-media__caption">Caption Header <em>Caption copy</em>
</p>
</div>
</div>
</div>
<div class="cb-about__gallery-button-wrapper">
<div class="c-button ">
<a class="c-button__link" href="#" target="" data-toggle="c-modal"
data-target="#gallery-modal">Gallery CTA text</a>
</div>
</div>
</div>
</div>
</section>
<section class="cb-our-menus" id="menus">
<div class="cb-our-menus__wrapper">
<div class="cb-our-menus__container">
<div class="cb-our-menus__intro-wrapper">
<h1 class="cb-our-menus__h1">Our Menus</h1>
</div>
<div class="cb-our-menus__button-grid">
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
</div>
</div>
</div>
</section>
<section class="cb-offers" id="offers">
<div class="cb-offers__wrapper">
<div class="cb-offers__container">
<h1 class="cb-offers__h1">Offer Option Header</h1>
<p class="cb-offers__intro intro">Something cool</p>
<div class="cb-offers__button-grid">
<div class="cb-offers__button-item">
</div>
<div class="cb-offers__button-item">
</div>
</div>
<div class="cb-offers__image-wrapper">
<div class="c-media" data-push-to-gallery-modal="">
<p class="c-media__caption">Caption Title <em>Caption Description</em>
</p>
</div>
</div>
</div>
</div>
</section>
<section class="cb-reservations" id="reservations">
<div class="cb-reservations__wrapper">
<div class="cb-reservations__container">
<h1 class="cb-reservations__h1">Reservations</h1>
</div>
</div>
</section>
<section class="cb-contact" id="contact">
<div class="cb-contact__wrapper">
<div class="cb-contact__container">
Contact info here
</div>
</div>
<div class="cb-contact__map-wrapper">
</div>
</section>
<section class="cb-reservations" id="reservations">
<div class="cb-reservations__wrapper">
<div class="cb-reservations__container">
<h1 class="cb-reservations__h1">fdsfdsf</h1>
<p class="cb-reservations__booking-description">fdsfsdfds</p>
<div class="cb-reservations__button-wrapper cb-reservations__button-wrapper--book">
<div class="c-button ">
<a class="c-button__link highlight"
target="">Book Now</a>
</div>
</div>
</div>
</div>
</section>
</div>
<section class="cb-newsletter">
<div class="cb-newsletter__wrapper">
<div class="cb-newsletter__container">
<h1 class="cb-newsletter__h1"> Newsletter</h1>
</div>
</div>
</section>
<section class="cb-signature-dishes">
<div class="cb-signature-dishes__wrapper">
<div class="cb-signature-dishes__container">
<h1 class="cb-signature-dishes__h1"> Dishes</h1>
</div>
</div>
</section>
</div>
<footer>
©2019 Footer
</footer>```
您可以使用库来简化您的实现:
https://github.com/morr/jquery.appear
你所有的 javascript 看起来像这样:
var addClassOnScroll = function () {
$('section[id]').each(function (index, elem) {
if($(elem).is(':appeared')) {
const elemId = $(elem).attr('id');
$("nav ul li a.active").removeClass('active');
$("nav ul li a[href='#" + elemId + "']").addClass('active');
}
});
};
$(window).on('scroll', function () {
addClassOnScroll();
});
没有库的选项:
var addClassOnScroll = function () {
var windowTop = $(window).scrollTop();
$('section[id]').each(function (index, elem) {
var offsetTop = $(elem).offset().top;
var outerHeight = $(this).outerHeight(true);
if( windowTop > (offsetTop - 50) && windowTop < ( offsetTop + outerHeight)) {
var elemId = $(elem).attr('id');
$("nav ul li a.active").removeClass('active');
$("nav ul li a[href='#" + elemId + "']").addClass('active');
}
});
};
$(function () {
$(window).on('scroll', function () {
addClassOnScroll();
});
});
我正在构建一个简单的 1 页网站并使用 JQuery 更改页面导航 link 的颜色。我已经实现了平滑滚动,可以很好地到达每个锚点。我还实现了一项功能,允许用户向下滚动页面,活动 class 被应用到导航中的锚点,改变颜色。
事情几乎正常工作...除了: 当您单击导航 link 时,活动 class 未应用于正确的 link.
到目前为止,我已尝试更改 classes 的应用方式以及直接 ID 的名称,但它仍然表现不完美。 $('.nav li').eq(i).find('a').addClass('active');
任何人都可以建议我如何解决这个问题吗?
这是与html的CP: https://codepen.io/nolimit966/pen/aboqvOP
谢谢
JS:
$(window).on('scroll',function(){
var WindowTop = $(window).scrollTop();
$('section').each(function(i){
if(WindowTop > $(this).offset().top - 50 &&
WindowTop < $(this).offset().top + $(this).outerHeight(true)
){
$('.nav > li > a').removeClass('active');
$('.nav li').eq(i).find('a').addClass('active');
}
});
});
$('a[href*=#]:not([href=#])').click(function() {
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
var target = $(this.hash);
target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
if (target.length) {
$('html,body').animate({
scrollTop: target.offset().top
}, 1000);
return false;
}
}
});
});,
HTML:
<h1>Test</h1>
</header>
<nav id="c-primary-nav__list-1" class="c-primary-nav__list">
<ul class="nav">
<li class="c-primary-nav__item">
<a class="c-primary-nav__link" href="#about">About</a>
</li>
<li class="c-primary-nav__item">
<a class="c-primary-nav__link active" href="#reservations">Reservations</a>
</li>
<li class="c-primary-nav__item">
<a class="c-primary-nav__link" href="#contact">Contact</a>
</li>
<li class="c-primary-nav__item">
<a class="c-primary-nav__link" href="#offers">Offers</a>
</li>
</ul>
<div class="c-primary-nav__details">
</div>
</nav>
<div class="l-content-blocks">
<div class="l-content-blocks__wrapper">
<section class="cb-about" id="about">
<div class="cb-about__wrapper">
<div class="cb-about__container">
<div class="cb-about__intro-wrapper">
<h1 class="cb-about__h1" data-aos="fade-up">About </h1>
</div>
<div class="cb-about__image-showcase">
<div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
<div class="c-media" data-push-to-gallery-modal="">
</p>
</div>
</div>
<div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
<div class="c-media" data-push-to-gallery-modal="">
<p class="c-media__caption">Caption Header <em>Caption Copy</em>
</p>
</div>
</div>
<div class="cb-about__showcase-item cb-about__showcase-item--description">
<p data-aos="fade-up" class="cb-about__description">Description section 3 </p>
</div>
<div data-aos="fade-up" class="cb-about__showcase-item cb-about__showcase-item--image">
<div class="c-media" data-push-to-gallery-modal="">
<p class="c-media__caption">Caption Header <em>Caption copy</em>
</p>
</div>
</div>
</div>
<div class="cb-about__gallery-button-wrapper">
<div class="c-button ">
<a class="c-button__link" href="#" target="" data-toggle="c-modal"
data-target="#gallery-modal">Gallery CTA text</a>
</div>
</div>
</div>
</div>
</section>
<section class="cb-our-menus" id="menus">
<div class="cb-our-menus__wrapper">
<div class="cb-our-menus__container">
<div class="cb-our-menus__intro-wrapper">
<h1 class="cb-our-menus__h1">Our Menus</h1>
</div>
<div class="cb-our-menus__button-grid">
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
<div class="cb-our-menus__button-item">
</div>
</div>
</div>
</div>
</section>
<section class="cb-offers" id="offers">
<div class="cb-offers__wrapper">
<div class="cb-offers__container">
<h1 class="cb-offers__h1">Offer Option Header</h1>
<p class="cb-offers__intro intro">Something cool</p>
<div class="cb-offers__button-grid">
<div class="cb-offers__button-item">
</div>
<div class="cb-offers__button-item">
</div>
</div>
<div class="cb-offers__image-wrapper">
<div class="c-media" data-push-to-gallery-modal="">
<p class="c-media__caption">Caption Title <em>Caption Description</em>
</p>
</div>
</div>
</div>
</div>
</section>
<section class="cb-reservations" id="reservations">
<div class="cb-reservations__wrapper">
<div class="cb-reservations__container">
<h1 class="cb-reservations__h1">Reservations</h1>
</div>
</div>
</section>
<section class="cb-contact" id="contact">
<div class="cb-contact__wrapper">
<div class="cb-contact__container">
Contact info here
</div>
</div>
<div class="cb-contact__map-wrapper">
</div>
</section>
<section class="cb-reservations" id="reservations">
<div class="cb-reservations__wrapper">
<div class="cb-reservations__container">
<h1 class="cb-reservations__h1">fdsfdsf</h1>
<p class="cb-reservations__booking-description">fdsfsdfds</p>
<div class="cb-reservations__button-wrapper cb-reservations__button-wrapper--book">
<div class="c-button ">
<a class="c-button__link highlight"
target="">Book Now</a>
</div>
</div>
</div>
</div>
</section>
</div>
<section class="cb-newsletter">
<div class="cb-newsletter__wrapper">
<div class="cb-newsletter__container">
<h1 class="cb-newsletter__h1"> Newsletter</h1>
</div>
</div>
</section>
<section class="cb-signature-dishes">
<div class="cb-signature-dishes__wrapper">
<div class="cb-signature-dishes__container">
<h1 class="cb-signature-dishes__h1"> Dishes</h1>
</div>
</div>
</section>
</div>
<footer>
©2019 Footer
</footer>```
您可以使用库来简化您的实现:
https://github.com/morr/jquery.appear
你所有的 javascript 看起来像这样:
var addClassOnScroll = function () {
$('section[id]').each(function (index, elem) {
if($(elem).is(':appeared')) {
const elemId = $(elem).attr('id');
$("nav ul li a.active").removeClass('active');
$("nav ul li a[href='#" + elemId + "']").addClass('active');
}
});
};
$(window).on('scroll', function () {
addClassOnScroll();
});
没有库的选项:
var addClassOnScroll = function () {
var windowTop = $(window).scrollTop();
$('section[id]').each(function (index, elem) {
var offsetTop = $(elem).offset().top;
var outerHeight = $(this).outerHeight(true);
if( windowTop > (offsetTop - 50) && windowTop < ( offsetTop + outerHeight)) {
var elemId = $(elem).attr('id');
$("nav ul li a.active").removeClass('active');
$("nav ul li a[href='#" + elemId + "']").addClass('active');
}
});
};
$(function () {
$(window).on('scroll', function () {
addClassOnScroll();
});
});