Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions assets/css/navigation.css
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@ header {
backdrop-filter: blur(12px);
}

/* When mobile nav is open, disable header backdrop-filter to avoid
creating a containing block that traps fixed-position children. */
body.nav-open header {
-webkit-backdrop-filter: none;
backdrop-filter: none;
}

.nav-container {
width: min(var(--container-width), 94%);
margin-inline: auto;
Expand Down Expand Up @@ -96,7 +103,7 @@ header {
transition:
opacity var(--transition-speed) ease,
visibility var(--transition-speed) ease;
z-index: 998;
z-index: 1001;
}

.nav-overlay.active {
Expand Down Expand Up @@ -125,7 +132,7 @@ header {
padding: 5.5rem 1rem 1.25rem;
border-left: 1px solid var(--border-color);
background: var(--bg-darker);
z-index: 999;
z-index: 1002;
}

.nav-links.active {
Expand Down
28 changes: 28 additions & 0 deletions assets/js/components/navigation.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,28 @@
this.navLinks.setAttribute("id", "site-navigation");
this.menuButton.setAttribute("aria-controls", "site-navigation");

// remember original position so we can restore on large screens
this._originalParent = this.navLinks.parentElement;
this._originalNextSibling = this.navLinks.nextSibling;

// ensure nav is positioned in the correct container for current viewport
const placeNavForViewport = () => {
if (window.innerWidth <= 960) {
if (this.navLinks.parentElement !== document.body) {
document.body.appendChild(this.navLinks);
}
} else {
// restore into original parent for desktop layout
if (this._originalParent && this.navLinks.parentElement !== this._originalParent) {
if (this._originalNextSibling && this._originalNextSibling.parentElement === this._originalParent) {
this._originalParent.insertBefore(this.navLinks, this._originalNextSibling);
} else {
this._originalParent.appendChild(this.navLinks);
}
}
}
};

this.overlay = document.querySelector(".nav-overlay");
if (!this.overlay) {
this.overlay = document.createElement("div");
Expand All @@ -95,11 +117,15 @@
});

window.addEventListener("resize", () => {
placeNavForViewport();
if (window.innerWidth > 960) {
this.closeMenu();
}
});

// place correctly on init as well
placeNavForViewport();

this.navLinks.querySelectorAll("a").forEach((link) => {
link.addEventListener("click", () => this.closeMenu());
});
Expand All @@ -116,6 +142,7 @@
isActive ? "true" : "false",
);
document.body.style.overflow = isActive ? "hidden" : "";
document.body.classList.toggle("nav-open", isActive);
}

closeMenu() {
Expand All @@ -126,6 +153,7 @@
this.overlay?.classList.remove("active");
this.menuButton?.setAttribute("aria-expanded", "false");
document.body.style.overflow = "";
document.body.classList.remove("nav-open");
}

markActiveLink() {
Expand Down
Loading