Skip to content

Commit 54e2fa5

Browse files
authored
Fix mobile menu (#82)
- icon now reliably changes if menu is open/closed - edge cases when growing/shrinking canvas
1 parent 1d87899 commit 54e2fa5

3 files changed

Lines changed: 33 additions & 16 deletions

File tree

public/index.css

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ a {
171171
}
172172

173173
.nav {
174-
display: none;
175174
flex-direction: column;
176175
position: absolute;
177176
top: 100%;
@@ -185,6 +184,10 @@ a {
185184
align-items: stretch;
186185
}
187186

187+
.mobile-menu-hidden {
188+
display: none;
189+
}
190+
188191
.dropdown-group {
189192
width: 100%;
190193
}

public/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
<button class="hamburger-menu"></button>
4646

4747
<!-- main navigation menu -->
48-
<nav class="nav">
48+
<nav class="nav mobile-menu-hidden">
4949
<!-- menu start -->
5050
<div class="dropdown-group">
5151
<button class="menu-toggle" data-target="menu-routing">

public/index.js

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -94,25 +94,37 @@ const setupMenu = () => {
9494
const mobileMenuButton = document.querySelector("button.hamburger-menu");
9595
const menuToggleElements = document.querySelectorAll("button.menu-toggle");
9696

97-
const closeAllMenus = () => menus.forEach((m) => m.classList.add("hidden"));
97+
const closeSubMenus = () => menus.forEach((m) => m.classList.add("hidden"));
98+
99+
// get original menu icon from HTML to avoid duplication in JS
100+
const originalMenuIcon = mobileMenuButton.textContent;
101+
102+
const showMobileMenu = () => {
103+
nav.classList.remove("mobile-menu-hidden");
104+
mobileMenuButton.textContent = "✖";
105+
};
106+
107+
const hideMobileMenu = () => {
108+
nav.classList.add("mobile-menu-hidden");
109+
mobileMenuButton.textContent = originalMenuIcon;
110+
};
98111

99112
// click on mobile menu button
100113
mobileMenuButton.addEventListener("click", () => {
101114
// toggle menu
102-
nav.style.display = nav.style.display === "flex" ? "none" : "flex";
103-
104-
// change button icon
105-
mobileMenuButton.textContent =
106-
mobileMenuButton.textContent === "☰" ? "✖" : "☰";
115+
nav.classList.contains("mobile-menu-hidden")
116+
? showMobileMenu()
117+
: hideMobileMenu();
107118
});
108119

109120
// setup dropdown menus
110121
menuToggleElements.forEach((toggle) => {
122+
// open submenu on click and close other open submenus
111123
toggle.addEventListener("click", () => {
112-
const targetMenu = document.getElementById(toggle.dataset.target);
113-
const isHidden = targetMenu.classList.contains("hidden");
114-
closeAllMenus();
115-
if (isHidden) targetMenu.classList.remove("hidden");
124+
const clickedSubmenu = document.getElementById(toggle.dataset.target);
125+
const isHidden = clickedSubmenu.classList.contains("hidden");
126+
closeSubMenus();
127+
if (isHidden) clickedSubmenu.classList.remove("hidden");
116128
});
117129
});
118130

@@ -124,12 +136,14 @@ const setupMenu = () => {
124136
event.target.closest(".nav");
125137
if (isClickInsideNav) return;
126138

127-
closeAllMenus();
128-
// hide mobile navigation
129-
if (window.innerWidth <= mobileMaxWidth) nav.style.display = "none";
139+
closeSubMenus();
140+
hideMobileMenu();
130141
});
131142

132-
window.addEventListener("resize", closeAllMenus);
143+
window.addEventListener("resize", () => {
144+
closeSubMenus();
145+
hideMobileMenu();
146+
});
133147
};
134148

135149
// setup menu after page is loaded

0 commit comments

Comments
 (0)