Home > database >  remove active class by scrolling in android
remove active class by scrolling in android

Time:08-20

I would like to ask how can I remove active class when scrolling? Everything works fine on desktop size, it removes the active class when I'm scrolling, even if I click on any nav menu, when I'm continue scrolling it removes the active class from that nav menu. But it gets weird on mobile device, if I'm just scrolling it works fine, but if I click (touch) on any nav menu and after that I'm scrolling then the previously clicked nav menu stay still active. You can see here https://portfolio-6t5.pages.dev/

const navItems = [
    {
        name: "Home",
        link: "#",
        icons: "fa-house",
        class: "active"
    },
    {
        name: "Section",
        link: "#project",
        icons: "fa-briefcase",
        class: ""
    },
    {
        name: "About",
        link: "#skill",
        icons: "fa-book",
        class: ""
    },
    {
        name: "Contact",
        link: "#about",
        icons: "fa-user",
        class: ""
    }
];

const nav_list = document.querySelector('.nav_list');

window.addEventListener('DOMContentLoaded', () => {
    let displayNav = navItems.map((item) => {
        return `
        <li >
            <a href="${item.link}" >${item.name}</a>
            <a href="${item.link}" >
                <i ></i>
            </a>
        </li>`;
    }).join("");

    displayNav  = `
    <li >
        <a href="#hire" >
            <button  aria-label="btn">Footer</button>
        </a>
        <a href="#hire" >
            <i ></i>
        </a>
    </li>`
    nav_list.innerHTML = displayNav;
    
    // Add active state to nav 
    const nav_lists = document.querySelectorAll('.nav_list-item');

    nav_lists.forEach(e => {
        e.addEventListener('click', () => {
            nav_lists.forEach(e => e.classList.remove('active'));
            e.classList.add('active');
        });
    });
});

// Add active state to nav while scrolling
function addActiveOnScroll() {
    const navListItem = document.querySelectorAll('.nav_list-item')
    const btnItem = document.querySelector('.hire-btn');
    const sections = document.querySelectorAll("section");
    const scrollY = window.pageYOffset

    sections.forEach((current, key) => {
        const sectionHeight = current.offsetHeight,
        sectionTop = current.offsetTop - 100;

        if (scrollY > sectionTop && scrollY <= sectionTop   sectionHeight) {
            navListItem[key].classList.add('active')
        } else {
            navListItem[key].classList.remove('active')
        }
    })
    if ((window.innerHeight   window.pageYOffset) >= document.body.offsetHeight) {
        navListItem.forEach(e => e.classList.remove('active'));
        btnItem.classList.add('active');
    }
}
window.addEventListener('scroll', addActiveOnScroll)

Sorry, there's some noise in the js code, but pls just ignore it

CodePudding user response:

By looking in the inspector, it seems that on mobile, when you tap on any given menu item, it triggers the hover state. There is no .active class to that menu item. The reason a bar is shown is because in the stylesheet you are changing the width when the menu item is active or hovered.

.nav_list-item.active a, 
.nav_list-item.active:after, 
.nav_list-item:hover:after {
    color: rgb(209, 209, 209);
    width: 100%;
    font-weight: 500;
}
  • Related