Better handle navbar scrolling
All checks were successful
Build and Deploy to Web Server / deploy (push) Successful in 13m27s

This commit is contained in:
2025-08-12 12:59:08 +09:30
parent f107a30048
commit d22dc9374f

View File

@@ -118,104 +118,111 @@ const { navbarDisplay = "normal" } = Astro.props as Props;
> >
</div> </div>
<script>
const toggleMenu = () => {
const toggle = document.getElementById("menu-toggle");
const mobileMenu = document.getElementById("mobile-menu");
const navbar = document.getElementById("navbar-lg");
if (toggle && mobileMenu) {
toggle.addEventListener("click", () => {
mobileMenu.classList.toggle("hidden");
if (navbar) {
const menuIsShowing = !mobileMenu.classList.contains("hidden");
const shouldBeTransparent = navbar.classList.contains(
"should-be-transparent"
);
if (!shouldBeTransparent) {
return;
}
if (menuIsShowing) {
navbar.classList.remove("bg-transparent", "border-gray-500");
navbar.classList.add(
"bg-white",
"border-white",
"dark:bg-gray-700",
"dark:border-gray-700",
"dark:text-white"
);
} else {
navbar.classList.add("bg-transparent", "border-gray-500");
navbar.classList.remove(
"bg-white",
"border-white",
"dark:bg-gray-700",
"dark:border-gray-700",
"dark:text-white"
);
}
}
});
}
};
document.addEventListener("astro:page-load", toggleMenu);
</script>
<script define:vars={{ navbarDisplay }} data-astro-rerun> <script define:vars={{ navbarDisplay }} data-astro-rerun>
window.navbarDisplay = navbarDisplay || "normal"; window.navbarDisplay = navbarDisplay || "normal";
</script> </script>
<script> <script>
let menuIsShowing = false;
const toggleMenu = () => {
const toggle = document.getElementById("menu-toggle")!;
const mobileMenu = document.getElementById("mobile-menu")!;
const navbar = document.getElementById("navbar-lg")!;
toggle.addEventListener("click", () => {
mobileMenu.classList.toggle("hidden");
menuIsShowing = !mobileMenu.classList.contains("hidden");
const shouldBeTransparent = navbar.classList.contains(
"should-be-transparent"
);
if (shouldBeTransparent) {
if (menuIsShowing) {
navbar.classList.remove("bg-transparent", "border-gray-500");
navbar.classList.add(
"bg-white",
"border-white",
"dark:bg-gray-700",
"dark:border-gray-700",
"dark:text-white"
);
}
}
checkScroll();
});
};
const checkScroll = () => { const checkScroll = () => {
const navbar = document.getElementById("navbar-lg"); const navbar = document.getElementById("navbar-lg")!;
const navbarDesktopLinks = document.getElementsByClassName( const navbarDesktopLinks = document.getElementsByClassName(
"navbar-desktop-link" "navbar-desktop-link"
); );
if (navbar) {
if (window.scrollY === 0 && window.navbarDisplay === "transparent") {
// At top - make navbar transparent
navbar.classList.remove(
"bg-white",
"border-white",
"dark:bg-gray-700",
"dark:border-gray-700",
"dark:text-white"
);
navbar.classList.add(
"bg-transparent",
"border-gray-500",
"should-be-transparent"
);
for (let i = 0; i < navbarDesktopLinks.length; i++) { if (menuIsShowing) {
navbarDesktopLinks[i].classList.remove("dark:text-white"); navbar.classList.remove(
} "bg-transparent",
} else { "border-gray-500",
// Scrolled down - add background color "should-be-transparent"
navbar.classList.remove( );
"bg-transparent", navbar.classList.add(
"border-gray-500", "bg-white",
"should-be-transparent" "border-white",
); "dark:bg-gray-700",
navbar.classList.add( "dark:border-gray-700",
"bg-white", "dark:text-white"
"border-white", );
"dark:bg-gray-700", return;
"dark:border-gray-700", }
"dark:text-white"
);
for (let i = 0; i < navbarDesktopLinks.length; i++) { if (window.scrollY === 0 && window.navbarDisplay === "transparent") {
navbarDesktopLinks[i].classList.add("dark:text-white"); navbar.classList.remove(
} "bg-white",
"border-white",
"dark:bg-gray-700",
"dark:border-gray-700",
"dark:text-white"
);
navbar.classList.add(
"bg-transparent",
"border-gray-500",
"should-be-transparent"
);
for (let i = 0; i < navbarDesktopLinks.length; i++) {
navbarDesktopLinks[i].classList.remove("dark:text-white");
}
} else {
navbar.classList.remove(
"bg-transparent",
"border-gray-500",
"should-be-transparent"
);
navbar.classList.add(
"bg-white",
"border-white",
"dark:bg-gray-700",
"dark:border-gray-700",
"dark:text-white"
);
for (let i = 0; i < navbarDesktopLinks.length; i++) {
navbarDesktopLinks[i].classList.add("dark:text-white");
} }
} }
}; };
window.addEventListener("scroll", checkScroll); document.addEventListener("astro:page-load", () => {
// Sync menuIsShowing with actual menu state on load
const mobileMenu = document.getElementById("mobile-menu");
if (mobileMenu) {
menuIsShowing = !mobileMenu.classList.contains("hidden");
}
toggleMenu();
checkScroll();
});
document.addEventListener("astro:page-load", checkScroll); window.addEventListener("scroll", checkScroll);
</script> </script>