/** * Stuck navbar to the top on page scroll */ export default (() => { const navbar = document.querySelector('[data-sticky-navbar]') if (!navbar) return const navbarHeight = navbar.clientHeight /// Function to add classes to the header and referenced elements const handleStickyNavbar = () => { const {offset = 200} = JSON.parse(navbar.dataset.stickyNavbar || '{}') const offsetValue = parseInt(offset, 10) if ( window.scrollY >= offsetValue && !navbar.classList.contains('navbar-stuck') ) { // Add padding-top to the body to compensate for the height of navbar-stuck document.body.style.paddingTop = `${navbarHeight}px` navbar.classList.add('fixed-top', 'navbar-stuck') } else if ( window.scrollY < offsetValue && navbar.classList.contains('navbar-stuck') ) { // Remove padding-top from the body when navbar is no longer stuck document.body.style.paddingTop = '0' navbar.classList.remove('fixed-top', 'navbar-stuck') } } // Function to debounce the scroll event const debounce = (func, wait) => { let timeout return (...args) => { const later = () => { timeout = null func(...args) } clearTimeout(timeout) timeout = setTimeout(later, wait) } } // Attach the debounced scroll event handler window.addEventListener('scroll', debounce(handleStickyNavbar, 5)) // Initial call to handleStickyNavbar to set initial state based on page load position handleStickyNavbar() })()