/** * Scroll Header — adapted from Profice WebSite * Handles sticky header state changes on scroll. */ document.addEventListener("DOMContentLoaded", function () { const topBanner = document.querySelector('.top-banner'); if (!topBanner) return; const scrollThreshold = 50; const rafDelay = 8; let isScrolled = false; let lastScrollY = 0; let rafId = null; let lastUpdateTime = 0; let lastScrollTime = 0; function calculateVelocity(currentScrollY, currentTime) { if (lastScrollTime === 0) { lastScrollTime = currentTime; return 0; } const timeDelta = currentTime - lastScrollTime; const scrollDelta = Math.abs(currentScrollY - lastScrollY); lastScrollTime = currentTime; return scrollDelta / timeDelta; } function updateHeaderState(scrolled, velocity = 0) { if (scrolled === isScrolled) return; if (velocity > 5) { topBanner.classList.add('fast-scroll'); } else { topBanner.classList.remove('fast-scroll'); } requestAnimationFrame(() => { if (scrolled) { topBanner.classList.add('scrolled'); } else { topBanner.classList.remove('scrolled'); } }); isScrolled = scrolled; } function handleScroll(currentTime) { if (currentTime - lastUpdateTime < rafDelay) { rafId = requestAnimationFrame(handleScroll); return; } lastUpdateTime = currentTime; const currentScrollY = window.pageYOffset || document.documentElement.scrollTop; const velocity = calculateVelocity(currentScrollY, currentTime); updateHeaderState(currentScrollY > scrollThreshold, velocity); lastScrollY = currentScrollY; rafId = null; } window.addEventListener('scroll', () => { if (!rafId) rafId = requestAnimationFrame(handleScroll); }, { passive: true }); // Initial state if (window.pageYOffset > scrollThreshold) updateHeaderState(true); });