Masquer le menu pendant le defilement

This commit is contained in:
2026-04-14 00:02:12 +02:00
parent 9b739b02f6
commit 1c5a003f7f
2 changed files with 76 additions and 0 deletions

View File

@@ -3,6 +3,9 @@
let viewportStarted = false;
let audioContext = null;
let authModalMessageHandler = null;
let menuScrollStarted = false;
let menuLastScrollY = 0;
let menuAnimationFrame = 0;
function syncViewportHeight() {
const visibleHeight = window.visualViewport?.height ?? window.innerHeight;
@@ -38,6 +41,63 @@
window.requestAnimationFrame(() => window.requestAnimationFrame(syncViewportHeight));
}
function setMenuHidden(hidden) {
document.body.classList.toggle("site-menu-hidden", hidden);
}
function syncMenuVisibility() {
menuAnimationFrame = 0;
const menu = document.querySelector(".site-menu-shell");
if (!menu) {
setMenuHidden(false);
menuLastScrollY = window.scrollY || window.pageYOffset || 0;
return;
}
const modalIsOpen = document.querySelector(".modal:not(.hidden)");
if (modalIsOpen) {
setMenuHidden(false);
menuLastScrollY = window.scrollY || window.pageYOffset || 0;
return;
}
const currentScrollY = Math.max(window.scrollY || window.pageYOffset || 0, 0);
const delta = currentScrollY - menuLastScrollY;
if (currentScrollY <= 24 || delta < -10) {
setMenuHidden(false);
} else if (delta > 10 && currentScrollY > 120) {
setMenuHidden(true);
}
menuLastScrollY = currentScrollY;
}
function queueMenuVisibilitySync() {
if (menuAnimationFrame) {
return;
}
menuAnimationFrame = window.requestAnimationFrame(syncMenuVisibility);
}
function startMenuScrollTracking() {
if (menuScrollStarted) {
queueMenuVisibilitySync();
return;
}
menuScrollStarted = true;
menuLastScrollY = window.scrollY || window.pageYOffset || 0;
window.addEventListener("scroll", queueMenuVisibilitySync, { passive: true });
window.addEventListener("pageshow", queueMenuVisibilitySync);
window.addEventListener("resize", queueMenuVisibilitySync);
window.addEventListener("hashchange", queueMenuVisibilitySync);
window.setTimeout(queueMenuVisibilitySync, 0);
window.setTimeout(queueMenuVisibilitySync, 150);
}
function getAudioContext() {
const AudioContextClass = window.AudioContext || window.webkitAudioContext;
if (!AudioContextClass) {
@@ -114,6 +174,11 @@
start: startViewport,
};
window.chesscubingMenu = {
start: startMenuScrollTracking,
sync: queueMenuVisibilitySync,
};
window.chesscubingStorage = {
getMatchState(storageKey, windowNameKey) {
try {
@@ -246,4 +311,5 @@
};
startViewport();
startMenuScrollTracking();
})();