diff options
Diffstat (limited to 'src/scripts/lib/siteHeader.ts')
| -rw-r--r-- | src/scripts/lib/siteHeader.ts | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/scripts/lib/siteHeader.ts b/src/scripts/lib/siteHeader.ts new file mode 100644 index 0000000..0d9ec43 --- /dev/null +++ b/src/scripts/lib/siteHeader.ts | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | export function mountSiteHeader() { | ||
| 2 | const headerEl = document.querySelector<HTMLElement>(".c-site-header"); | ||
| 3 | |||
| 4 | if (headerEl) { | ||
| 5 | const navbarEl = headerEl?.querySelector(".o-navbar--static-white"); | ||
| 6 | const logoEl = headerEl?.querySelector(".c-logo--static-white"); | ||
| 7 | const buttonEls = headerEl?.querySelectorAll(".o-button--static-white"); | ||
| 8 | |||
| 9 | let settings: IntersectionObserverInit; | ||
| 10 | |||
| 11 | const boundingRect = headerEl.getBoundingClientRect(); | ||
| 12 | |||
| 13 | if (boundingRect.top > 0) { | ||
| 14 | settings = { | ||
| 15 | rootMargin: "1px 0px -100% 0px", | ||
| 16 | }; | ||
| 17 | } else { | ||
| 18 | settings = { | ||
| 19 | root: document.documentElement, | ||
| 20 | rootMargin: "-1px 0px 0px 0px", | ||
| 21 | threshold: [1], | ||
| 22 | }; | ||
| 23 | } | ||
| 24 | |||
| 25 | const observer = new IntersectionObserver(([e]) => { | ||
| 26 | const scroll = e?.isIntersecting; | ||
| 27 | headerEl.classList.toggle("is-scroll", scroll); | ||
| 28 | navbarEl?.classList.toggle("o-navbar--static-white", !scroll); | ||
| 29 | logoEl?.classList.toggle("c-logo--static-white", !scroll); | ||
| 30 | for (const buttonEl of buttonEls) { | ||
| 31 | buttonEl.classList.toggle("o-button--static-white", !scroll); | ||
| 32 | } | ||
| 33 | }, settings); | ||
| 34 | |||
| 35 | observer.observe(headerEl); | ||
| 36 | } | ||
| 37 | } | ||
