Convert menu to hover-triggered behavior

- Hamburger menu now opens on hover instead of click
- Menu stays open while hovering over button OR menu
- Added 100ms delay to prevent accidental closes
- Submenu opens on pure CSS :hover (no JavaScript)
- Smooth transitions for both main menu and submenu
- Proper ARIA attributes for accessibility
- Legacy click functions kept for backward compatibility
- Menu closes when mouse leaves both button and menu area
This commit is contained in:
juanatsap
2025-11-09 20:05:24 +00:00
parent 4c7086000b
commit 431a6aae7a
2 changed files with 64 additions and 7 deletions
+31 -2
View File
@@ -2036,10 +2036,20 @@ a:focus {
transition: transform 0.3s ease-in-out; transition: transform 0.3s ease-in-out;
overflow-y: auto; overflow-y: auto;
z-index: 99; z-index: 99;
pointer-events: none; /* Disable pointer events when hidden */
} }
/* Show menu when hovering menu itself OR when it has the hover class */
.navigation-menu:hover,
.navigation-menu.menu-hover {
transform: translateX(0);
pointer-events: auto; /* Enable pointer events when visible */
}
/* Legacy class for JS compatibility - keep for backward compatibility */
.navigation-menu.menu-open { .navigation-menu.menu-open {
transform: translateX(0); transform: translateX(0);
pointer-events: auto;
} }
.menu-content { .menu-content {
@@ -2084,7 +2094,7 @@ a:focus {
/* Remove extra padding - all menu items should align consistently */ /* Remove extra padding - all menu items should align consistently */
/* Submenu styles */ /* Submenu styles - hover triggered */
.menu-item-submenu { .menu-item-submenu {
position: relative; position: relative;
} }
@@ -2098,17 +2108,36 @@ a:focus {
transition: transform 0.2s ease; transition: transform 0.2s ease;
} }
.menu-item-submenu.submenu-open .submenu-arrow { /* Show submenu on hover */
.menu-item-submenu:hover .submenu-arrow {
transform: rotate(180deg); transform: rotate(180deg);
} }
.submenu-content { .submenu-content {
display: none; display: none;
background-color: rgba(0, 0, 0, 0.02); background-color: rgba(0, 0, 0, 0.02);
max-height: 0;
overflow: hidden;
opacity: 0;
transition: max-height 0.3s ease, opacity 0.2s ease;
}
/* Show submenu when hovering the submenu container */
.menu-item-submenu:hover .submenu-content {
display: block;
max-height: 600px;
opacity: 1;
}
/* Legacy class for JS compatibility */
.menu-item-submenu.submenu-open .submenu-arrow {
transform: rotate(180deg);
} }
.menu-item-submenu.submenu-open .submenu-content { .menu-item-submenu.submenu-open .submenu-content {
display: block; display: block;
max-height: 600px;
opacity: 1;
} }
.submenu-content .menu-item { .submenu-content .menu-item {
+33 -5
View File
@@ -104,7 +104,7 @@
</a> </a>
<!-- Hamburger Menu Button --> <!-- Hamburger Menu Button -->
<button class="hamburger-btn" onclick="toggleMenu()" aria-label="Toggle navigation menu"> <button class="hamburger-btn" aria-label="Toggle navigation menu">
<iconify-icon icon="mdi:menu" width="24" height="24"></iconify-icon> <iconify-icon icon="mdi:menu" width="24" height="24"></iconify-icon>
</button> </button>
@@ -203,7 +203,7 @@
<span>{{if eq .Lang "es"}}Colapsar Todo{{else}}Collapse All{{end}}</span> <span>{{if eq .Lang "es"}}Colapsar Todo{{else}}Collapse All{{end}}</span>
</a> </a>
<div class="menu-item-submenu"> <div class="menu-item-submenu">
<a href="#" class="menu-item has-submenu" onclick="toggleSubmenu(event)"> <a href="#" class="menu-item has-submenu">
<iconify-icon icon="mdi:menu" width="20" height="20"></iconify-icon> <iconify-icon icon="mdi:menu" width="20" height="20"></iconify-icon>
<span>{{if eq .Lang "es"}}Secciones CV{{else}}CV Sections{{end}}</span> <span>{{if eq .Lang "es"}}Secciones CV{{else}}CV Sections{{end}}</span>
<iconify-icon icon="mdi:chevron-down" width="16" height="16" class="submenu-arrow"></iconify-icon> <iconify-icon icon="mdi:chevron-down" width="16" height="16" class="submenu-arrow"></iconify-icon>
@@ -339,7 +339,35 @@
</div> </div>
<script> <script>
// Toggle navigation menu // Hover-based menu control
document.addEventListener('DOMContentLoaded', function() {
const hamburgerBtn = document.querySelector('.hamburger-btn');
const menu = document.getElementById('navigation-menu');
// Show menu on hamburger hover
hamburgerBtn.addEventListener('mouseenter', function() {
menu.classList.add('menu-hover');
hamburgerBtn.setAttribute('aria-expanded', 'true');
});
// Hide menu when leaving hamburger (only if not hovering menu)
hamburgerBtn.addEventListener('mouseleave', function() {
setTimeout(() => {
if (!menu.matches(':hover')) {
menu.classList.remove('menu-hover');
hamburgerBtn.setAttribute('aria-expanded', 'false');
}
}, 100);
});
// Hide menu when leaving menu itself
menu.addEventListener('mouseleave', function() {
menu.classList.remove('menu-hover');
hamburgerBtn.setAttribute('aria-expanded', 'false');
});
});
// Legacy toggle function - kept for compatibility
function toggleMenu() { function toggleMenu() {
const menu = document.getElementById('navigation-menu'); const menu = document.getElementById('navigation-menu');
const btn = document.querySelector('.hamburger-btn'); const btn = document.querySelector('.hamburger-btn');
@@ -374,7 +402,7 @@
}); });
} }
// Toggle submenu // Toggle submenu - no longer needed for hover, but kept for compatibility
function toggleSubmenu(event) { function toggleSubmenu(event) {
event.preventDefault(); event.preventDefault();
const submenuContainer = event.currentTarget.parentElement; const submenuContainer = event.currentTarget.parentElement;
@@ -416,7 +444,7 @@
} }
} }
// Close menu when clicking outside // Close menu when clicking outside (only for legacy click-opened menus)
document.addEventListener('click', function(event) { document.addEventListener('click', function(event) {
const menu = document.getElementById('navigation-menu'); const menu = document.getElementById('navigation-menu');
const btn = document.querySelector('.hamburger-btn'); const btn = document.querySelector('.hamburger-btn');