Skip to content

Commit 78e590f

Browse files
committed
Reveal navbar when scrolling up
1 parent df72fdc commit 78e590f

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

src/components/layout/Header.astro

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
---
44

55
<header
6-
class='mb-12 flex w-full flex-wrap pb-3 text-sm sm:flex-nowrap sm:justify-start'
6+
id='main-header'
7+
class='fixed top-0 z-50 mb-12 flex w-full flex-wrap bg-background/100 px-6 pb-3 pt-3 text-sm transition-transform duration-300 ease-in-out sm:flex-nowrap sm:justify-start sm:px-10 lg:px-10'
78
>
89
<nav
910
class='relative mx-auto flex w-full items-center justify-between'
@@ -130,6 +131,57 @@
130131
});
131132
</script>
132133

134+
<script>
135+
// Header scroll behavior
136+
let lastScrollTop = 0;
137+
let scrollThreshold = 50; // Minimum scroll distance to trigger
138+
let isScrolling = false;
139+
140+
const header = document.getElementById("main-header");
141+
142+
function handleScroll() {
143+
if (!isScrolling) {
144+
window.requestAnimationFrame(() => {
145+
const currentScrollTop =
146+
window.pageYOffset || document.documentElement.scrollTop;
147+
148+
// Show header when at top of page
149+
if (currentScrollTop <= 0) {
150+
header?.classList.remove("-translate-y-full");
151+
isScrolling = false;
152+
return;
153+
}
154+
155+
// Only trigger on significant scroll movement
156+
if (Math.abs(currentScrollTop - lastScrollTop) < scrollThreshold) {
157+
isScrolling = false;
158+
return;
159+
}
160+
161+
if (currentScrollTop > lastScrollTop) {
162+
// Scrolling down - hide header
163+
header?.classList.add("-translate-y-full");
164+
} else {
165+
// Scrolling up - show header
166+
header?.classList.remove("-translate-y-full");
167+
}
168+
169+
lastScrollTop = currentScrollTop;
170+
isScrolling = false;
171+
});
172+
}
173+
isScrolling = true;
174+
}
175+
176+
// Add scroll event listener with throttling
177+
window.addEventListener("scroll", handleScroll, { passive: true });
178+
179+
// Ensure header is visible on page load
180+
document.addEventListener("DOMContentLoaded", () => {
181+
header?.classList.remove("-translate-y-full");
182+
});
183+
</script>
184+
133185
<script>
134186
function getCurrentTheme() {
135187
return localStorage.getItem("theme");

src/layouts/BaseLayout.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const {
3030
<body class='flex justify-center bg-background'>
3131
<ThemeProvider />
3232
<main
33-
class='max-w-screen flex min-h-screen w-screen flex-col items-center px-6 pb-10 pt-7 font-sans text-[0.92rem] leading-relaxed sm:px-10 lg:px-10'
33+
class='max-w-screen flex min-h-screen w-screen flex-col items-center px-6 pb-10 pt-20 font-sans text-[0.92rem] leading-relaxed sm:px-10 lg:px-10'
3434
>
3535
<Header />
3636
<slot />

0 commit comments

Comments
 (0)