0

I have a project where i'm trying to set the classes as active from a dynamically created nav bar.

 <main>
    <header class="main__hero">
        <h1>Landing Page </h1>
    </header>
    <!-- Each Section has an ID (used for the anchor) and 
a data attribute that will populate the li node.
Adding more sections will automatically populate nav.
The first section is set to active class by default -->
    <section id="section1" data-nav="Section 1" class="your-active_class">
        <div class="landing__container">
            <h2>Section 1</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi fermentum metus faucibus lectus pharetra dapibus. Suspendisse potenti. Aenean aliquam elementum mi, ac euismod augue. Donec eget lacinia ex. Phasellus imperdiet porta orci
                eget mollis. Sed convallis sollicitudin mauris ac tincidunt. Donec bibendum, nulla eget bibendum consectetur, sem nisi aliquam leo, ut pulvinar quam nunc eu augue. Pellentesque maximus imperdiet elit a pharetra. Duis lectus mi, aliquam
                in mi quis, aliquam porttitor lacus. Morbi a tincidunt felis. Sed leo nunc, pharetra et elementum non, faucibus vitae elit. Integer nec libero venenatis libero ultricies molestie semper in tellus. Sed congue et odio sed euismod.
            </p>

            <p>Aliquam a convallis justo. Vivamus venenatis, erat eget pulvinar gravida, ipsum lacus aliquet velit, vel luctus diam ipsum a diam. Cras eu tincidunt arcu, vitae rhoncus purus. Vestibulum fermentum consectetur porttitor. Suspendisse imperdiet
                porttitor tortor, eget elementum tortor mollis non.</p>
        </div>
    </section>
    <section id="section2" data-nav="Section 2">

        <div class="landing__container">
            <h2>Section 2</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi fermentum metus faucibus lectus pharetra dapibus. Suspendisse potenti. Aenean aliquam elementum mi, ac euismod augue. Donec eget lacinia ex. Phasellus imperdiet porta orci
                eget mollis. Sed convallis sollicitudin mauris ac tincidunt. Donec bibendum, nulla eget bibendum consectetur, sem nisi aliquam leo, ut pulvinar quam nunc eu augue. Pellentesque maximus imperdiet elit a pharetra. Duis lectus mi, aliquam
                in mi quis, aliquam porttitor lacus. Morbi a tincidunt felis. Sed leo nunc, pharetra et elementum non, faucibus vitae elit. Integer nec libero venenatis libero ultricies molestie semper in tellus. Sed congue et odio sed euismod.
            </p>

            <p>Aliquam a convallis justo. Vivamus venenatis, erat eget pulvinar gravida, ipsum lacus aliquet velit, vel luctus diam ipsum a diam. Cras eu tincidunt arcu, vitae rhoncus purus. Vestibulum fermentum consectetur porttitor. Suspendisse imperdiet
                porttitor tortor, eget elementum tortor mollis non.</p>
        </div>
    </section>
    <section id="section3" data-nav="Section 3">
        <div class="landing__container">
            <h2>Section 3</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi fermentum metus faucibus lectus pharetra dapibus. Suspendisse potenti. Aenean aliquam elementum mi, ac euismod augue. Donec eget lacinia ex. Phasellus imperdiet porta orci
                eget mollis. Sed convallis sollicitudin mauris ac tincidunt. Donec bibendum, nulla eget bibendum consectetur, sem nisi aliquam leo, ut pulvinar quam nunc eu augue. Pellentesque maximus imperdiet elit a pharetra. Duis lectus mi, aliquam
                in mi quis, aliquam porttitor lacus. Morbi a tincidunt felis. Sed leo nunc, pharetra et elementum non, faucibus vitae elit. Integer nec libero venenatis libero ultricies molestie semper in tellus. Sed congue et odio sed euismod.
            </p>

            <p>Aliquam a convallis justo. Vivamus venenatis, erat eget pulvinar gravida, ipsum lacus aliquet velit, vel luctus diam ipsum a diam. Cras eu tincidunt arcu, vitae rhoncus purus. Vestibulum fermentum consectetur porttitor. Suspendisse imperdiet
                porttitor tortor, eget elementum tortor mollis non.</p>
        </div>
    </section>
    <section id="section4" data-nav="Section 4">
        <div class="landing__container">
            <h2>Section 4</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi fermentum metus faucibus lectus pharetra dapibus. Suspendisse potenti. Aenean aliquam elementum mi, ac euismod augue. Donec eget lacinia ex. Phasellus imperdiet porta orci
                eget mollis. Sed convallis sollicitudin mauris ac tincidunt. Donec bibendum, nulla eget bibendum consectetur, sem nisi aliquam leo, ut pulvinar quam nunc eu augue. Pellentesque maximus imperdiet elit a pharetra. Duis lectus mi, aliquam
                in mi quis, aliquam porttitor lacus. Morbi a tincidunt felis. Sed leo nunc, pharetra et elementum non, faucibus vitae elit. Integer nec libero venenatis libero ultricies molestie semper in tellus. Sed congue et odio sed euismod.
            </p>

            <p>Aliquam a convallis justo. Vivamus venenatis, erat eget pulvinar gravida, ipsum lacus aliquet velit, vel luctus diam ipsum a diam. Cras eu tincidunt arcu, vitae rhoncus purus. Vestibulum fermentum consectetur porttitor. Suspendisse imperdiet
                porttitor tortor, eget elementum tortor mollis non.</p>
        </div>
    </section>

Right now here is the code for my javascript that is creating the nav bar

const sections = document.querySelectorAll('section');
const ul = document.createElement('ul');
document.getElementById('navbar__list').appendChild(ul);

 //loop through elements to grab the data-nav elements
 for (let i = 0; i < sections.length; i++) {
  const section = sections[i];

const li = document.createElement('li');
li.addEventListener('click', function clickHandler() {
    location.hash = section.id;

    // add class to section
    // remove class from sibling sections

    // add class to section links
    // remove class from sibling section links
});
li.textContent = section.dataset.nav;
ul.appendChild(li);

And I have a tiny piece of jquery to set the li elements as active

$(document).on('click', 'ul li', function() { $(this).addClass('active').siblings().removeClass('active')

How do I get the classes as active only when they are in the viewport?

  • Hi, could you clarify the question perhaps? – IronMan Dec 06 '19 at 00:36
  • Take a look here, try it out, if it doesn't work, edit your question with what you tried, what you expected, and what you got. -> https://stackoverflow.com/questions/20791374/jquery-check-if-element-is-visible-in-viewport – Rodger Dec 06 '19 at 01:11
  • Take a look here. https://stackoverflow.com/questions/21840686/show-element-when-class-is-in-viewport – Santosh Aryal Dec 06 '19 at 01:23

0 Answers0