fix 導覽第二三層飛出選單接軌 hover,避免滑向第三層時選單關閉

This commit is contained in:
2026-05-16 18:24:39 +08:00
parent 67f4b8bfc2
commit ab1d2b6d50
2 changed files with 75 additions and 12 deletions
+23 -3
View File
@@ -20,7 +20,7 @@
];
/** 主選單欄 `mouseleave` 後延遲關閉(ms),方便移入子選單或右側飛出層,避免略偏就關閉 */
const SUBMENU_CLOSE_DELAY_MS = 480;
const SUBMENU_CLOSE_DELAY_MS = 650;
function pickSoonPhrase() {
return NAV_SOON_PHRASES[Math.floor(Math.random() * NAV_SOON_PHRASES.length)];
@@ -296,18 +296,38 @@
item.classList.add("open");
};
const cancelClose = () => {
if (closeTimer) {
window.clearTimeout(closeTimer);
closeTimer = null;
}
};
const scheduleClose = () => {
cancelClose();
closeTimer = window.setTimeout(() => item.classList.remove("open"), SUBMENU_CLOSE_DELAY_MS);
};
const leaveUnlessStillInside = (event) => {
const next = event.relatedTarget;
if (next instanceof Node && item.contains(next)) return;
scheduleClose();
};
item.addEventListener("mouseenter", openItem);
item.addEventListener("mouseleave", scheduleClose);
item.addEventListener("mouseleave", leaveUnlessStillInside);
submenu.addEventListener("mouseenter", cancelClose);
submenu.addEventListener("mouseleave", leaveUnlessStillInside);
item.querySelectorAll(".portal-submenu-nested").forEach((panel) => {
panel.addEventListener("mouseenter", cancelClose);
panel.addEventListener("mouseleave", leaveUnlessStillInside);
});
trigger.addEventListener("focus", openItem);
trigger.addEventListener("click", (event) => {
const isSoon = trigger.getAttribute("data-coming-soon") === "true";
if (window.innerWidth <= 1024) {
if (window.innerWidth <= 767) {
event.preventDefault();
if (!isSoon && !item.classList.contains("coming-soon")) {
item.classList.toggle("open");