Skip to content

Commit 0c443c9

Browse files
Merge pull request #1782 from euphemism/sub-menu-positioning
Smarter sub-menu positioning on narrow displays
2 parents 24bf3b2 + 9b82bc1 commit 0c443c9

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

static/menu.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1+
const updateMenuPositionForSubMenu = (currentMenuSupplier) => {
2+
const currentMenu = currentMenuSupplier();
3+
const subMenu = currentMenu?.getElementsByClassName('pure-menu-children')?.[0];
4+
5+
subMenu?.style.setProperty('--menu-x', `${currentMenu.getBoundingClientRect().x}px`);
6+
}
7+
18
// Allow menus to be open and used by keyboard.
29
(function() {
310
var currentMenu;
411
var backdrop = document.createElement("div");
512
backdrop.style = "display:none;position:fixed;width:100%;height:100%;z-index:1";
613
document.documentElement.insertBefore(backdrop, document.querySelector("body"));
14+
15+
addEventListener('resize', () => updateMenuPositionForSubMenu(() => currentMenu));
16+
717
function previous(allItems, item) {
818
var i = 1;
919
var l = allItems.length;
@@ -52,6 +62,9 @@
5262
this.blur();
5363
} else {
5464
if (currentMenu) closeMenu();
65+
66+
updateMenuPositionForSubMenu(() => this.parentNode);
67+
5568
openMenu(this.parentNode);
5669
}
5770
e.preventDefault();

templates/style/_navbar.scss

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ div.nav-container {
5050
}
5151
}
5252

53+
.pure-menu-has-children.pure-menu-active > .pure-menu-link {
54+
&:after {
55+
content:"\25B2";
56+
}
57+
}
58+
5359
.pure-menu-link {
5460
font-size: 12.8px;
5561
font-weight: 400;
@@ -133,11 +139,20 @@ div.nav-container {
133139
}
134140

135141
.pure-menu-children {
142+
--menu-x: 0;
143+
144+
// #{} interpolates a SassScript expression. Using this prevents
145+
// SASS from using its built-in min/max over the CSS min/max functions
146+
--clamped-offset: m#{i}n(var(--menu-x), calc(100vw - 100%));
147+
136148
border: 1px solid var(--color-border);
137149
border-radius: 0 0 2px 2px;
138-
margin-left: -1px;
139150
background-color: var(--color-background);
140151

152+
left: 0;
153+
position: fixed;
154+
transform: translateX(m#{a}x(0%, var(--clamped-offset)));
155+
141156
li {
142157
border-left: none;
143158
}

0 commit comments

Comments
 (0)