|
1 | 1 | <script> |
2 | | - import { onMount } from 'svelte' |
| 2 | + import { onMount, tick } from 'svelte' |
3 | 3 | import { Router, Route } from 'svelte-routing' |
4 | 4 |
|
5 | 5 | // Components |
|
21 | 21 | */ |
22 | 22 | let hasScrolled = false |
23 | 23 | let header |
| 24 | + let headerEl |
| 25 | + let main |
| 26 | + let mainY |
24 | 27 |
|
25 | 28 | const onScroll = ev => { |
26 | 29 | const y = window.scrollY |
27 | 30 | if (!hasScrolled && y > 50) { |
28 | 31 | hasScrolled = true |
29 | 32 | document.documentElement.style.setProperty('--color-active-bg', 'var(--color-light)') |
30 | | -
|
31 | 33 | } else if (hasScrolled && y < 50) { |
32 | 34 | hasScrolled = false |
33 | 35 | document.documentElement.style.setProperty('--color-active-bg', 'var(--color-salmon)') |
34 | 36 | } |
35 | 37 |
|
36 | | - // if (hasScrolled && y > 300) { |
37 | | - // header.classList.add('scrolled') |
38 | | - // } else { |
39 | | - // header.classList.remove('scrolled') |
40 | | - // } |
| 38 | + if (hasScrolled && mainY && y > mainY) { |
| 39 | + header.moveForward() |
| 40 | + } else { |
| 41 | + header.moveBack() |
| 42 | + } |
| 43 | + } |
| 44 | +
|
| 45 | + const remToPx = (rem) => { |
| 46 | + return rem * parseFloat(getComputedStyle(document.documentElement).fontSize) |
41 | 47 | } |
42 | 48 |
|
43 | | - onMount(() => { |
| 49 | + const setHeaderTransition = () => { |
| 50 | + const scrollOffset = window.scrollY |
| 51 | + const mainPos = main.getBoundingClientRect().top |
| 52 | + const headerHeight = remToPx(5.3) |
| 53 | +
|
| 54 | + mainY = scrollOffset + mainPos - headerHeight |
| 55 | + } |
44 | 56 |
|
45 | | - window.addEventListener('scroll', onScroll) |
| 57 | + onMount(async () => { |
| 58 | + window.addEventListener('scroll', onScroll, { passive: true }) |
| 59 | + window.addEventListener('resize', setHeaderTransition, { passive: true }) |
| 60 | + await tick() |
| 61 | + setHeaderTransition() |
46 | 62 | }) |
47 | 63 | </script> |
48 | 64 |
|
49 | 65 | <div class="root" class:scrolled={hasScrolled}> |
50 | 66 | <Router url={url}> |
51 | | - <AppHeader bind:header={header} /> |
| 67 | + <AppHeader bind:header={headerEl} bind:this={header}/> |
52 | 68 |
|
53 | | - <main> |
| 69 | + <main bind:this={main}> |
54 | 70 | <Route path="about" component={About}/> |
55 | 71 | <Route path="contribute" component={Contribute}/> |
56 | 72 | <Route path="license" component={License}/> |
|
0 commit comments