<div class="multi-dropdown-demo">
<div class="demo-content">
<h2>Demo de Menú Desplegable Multinivel</h2>
<p>Un sistema de navegación integral con múltiples niveles de menús desplegables, animaciones suaves y accesibilidad completa por teclado. Perfecto para sitios web complejos con jerarquías de contenido profundas.</p>
<div class="demo-controls">
<h3>Opciones del Menú:</h3>
<div class="control-buttons">
<button class="control-btn active" data-theme="default">Predeterminado</button>
<button class="control-btn" data-theme="dark">Oscuro</button>
<button class="control-btn" data-theme="minimal">Minimalista</button>
<button class="control-btn" data-theme="colorful">Colorido</button>
</div>
</div>
</div>
<div class="menu-container">
<nav class="multi-dropdown-nav default-theme" role="navigation" aria-label="Navegación principal">
<div class="nav-brand">
<span class="brand-icon">🚀</span>
<span class="brand-text">NavDemo</span>
</div>
<ul class="nav-menu" role="menubar">
<li class="nav-item" role="none">
<a href="#" class="nav-link" role="menuitem" aria-haspopup="false">Inicio</a>
</li>
<li class="nav-item has-dropdown" role="none">
<a href="#" class="nav-link" role="menuitem" aria-haspopup="true" aria-expanded="false">
Productos
<span class="dropdown-icon">▼</span>
</a>
<ul class="dropdown-menu" role="menu" aria-label="Submenú de productos">
<li class="dropdown-item has-submenu" role="none">
<a href="#" class="dropdown-link" role="menuitem" aria-haspopup="true" aria-expanded="false">
Desarrollo Web
<span class="submenu-icon">▶</span>
</a>
<ul class="submenu" role="menu" aria-label="Submenú de desarrollo web">
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🌐</span>
Frameworks Frontend
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">⚙️</span>
Soluciones Backend
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">📱</span>
Desarrollo Móvil
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🔧</span>
Herramientas de Desarrollo
</a>
</li>
</ul>
</li>
<li class="dropdown-item has-submenu" role="none">
<a href="#" class="dropdown-link" role="menuitem" aria-haspopup="true" aria-expanded="false">
Servicios de Diseño
<span class="submenu-icon">▶</span>
</a>
<ul class="submenu" role="menu" aria-label="Submenú de servicios de diseño">
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🎨</span>
Diseño UI/UX
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🖼️</span>
Diseño Gráfico
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">📐</span>
Prototipado
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🎭</span>
Identidad de Marca
</a>
</li>
</ul>
</li>
<li class="dropdown-item" role="none">
<a href="#" class="dropdown-link" role="menuitem">
<span class="item-icon">☁️</span>
Soluciones en la Nube
</a>
</li>
<li class="dropdown-item" role="none">
<a href="#" class="dropdown-link" role="menuitem">
<span class="item-icon">🔒</span>
Servicios de Seguridad
</a>
</li>
</ul>
</li>
<li class="nav-item has-dropdown" role="none">
<a href="#" class="nav-link" role="menuitem" aria-haspopup="true" aria-expanded="false">
Soluciones
<span class="dropdown-icon">▼</span>
</a>
<ul class="dropdown-menu" role="menu" aria-label="Submenú de soluciones">
<li class="dropdown-item has-submenu" role="none">
<a href="#" class="dropdown-link" role="menuitem" aria-haspopup="true" aria-expanded="false">
Empresarial
<span class="submenu-icon">▶</span>
</a>
<ul class="submenu" role="menu" aria-label="Submenú empresarial">
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🏢</span>
Sistemas a Gran Escala
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">📊</span>
Plataforma de Análisis
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🔐</span>
Marco de Seguridad
</a>
</li>
</ul>
</li>
<li class="dropdown-item has-submenu" role="none">
<a href="#" class="dropdown-link" role="menuitem" aria-haspopup="true" aria-expanded="false">
Pequeñas Empresas
<span class="submenu-icon">▶</span>
</a>
<ul class="submenu" role="menu" aria-label="Submenú de pequeñas empresas">
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">🏪</span>
Paquetes Iniciales
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">💼</span>
Herramientas de Negocio
</a>
</li>
<li role="none">
<a href="#" class="submenu-link" role="menuitem">
<span class="item-icon">📈</span>
Soluciones de Crecimiento
</a>
</li>
</ul>
</li>
<li class="dropdown-item" role="none">
<a href="#" class="dropdown-link" role="menuitem">
<span class="item-icon">🎓</span>
Educativo
</a>
</li>
</ul>
</li>
<li class="nav-item has-dropdown" role="none">
<a href="#" class="nav-link" role="menuitem" aria-haspopup="true" aria-expanded="false">
Recursos
<span class="dropdown-icon">▼</span>
</a>
<ul class="dropdown-menu" role="menu" aria-label="Submenú de recursos">
<li class="dropdown-item" role="none">
<a href="#" class="dropdown-link" role="menuitem">
<span class="item-icon">📚</span>
Documentación
</a>
</li>
<li class="dropdown-item" role="none">
<a href="#" class="dropdown-link" role="menuitem">
<span class="item-icon">🎥</span>
Tutoriales en Video
</a>
</li>
<li class="dropdown-item" role="none">
<a href="#" class="dropdown-link" role="menuitem">
<span class="item-icon">💬</span>
Foro de la Comunidad
</a>
</li>
<li class="dropdown-item" role="none">
<a href="#" class="dropdown-link" role="menuitem">
<span class="item-icon">📝</span>
Blog
</a>
</li>
</ul>
</li>
<li class="nav-item" role="none">
<a href="#" class="nav-link" role="menuitem" aria-haspopup="false">Contacto</a>
</li>
</ul>
<div class="nav-toggle" aria-label="Alternar menú de navegación" role="button" tabindex="0">
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
</div>
</nav>
<div class="menu-info">
<div class="info-item">
<span class="info-label">Tema:</span>
<span class="info-value" id="currentTheme">Predeterminado</span>
</div>
<div class="info-item">
<span class="info-label">Menú Activo:</span>
<span class="info-value" id="activeMenu">Ninguno</span>
</div>
<div class="info-item">
<span class="info-label">Profundidad del Menú:</span>
<span class="info-value" id="menuDepth">0</span>
</div>
</div>
</div>
</div>
.multi-dropdown-demo {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 380px;
border-radius: 16px;
padding: 30px;
color: white;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
.demo-content {
text-align: center;
margin-bottom: 30px;
}
.demo-content h2 {
margin: 0 0 12px 0;
font-size: 24px;
font-weight: 700;
}
.demo-content p {
margin: 0 0 20px 0;
opacity: 0.9;
line-height: 1.6;
}
.demo-controls h3 {
margin: 0 0 12px 0;
font-size: 16px;
font-weight: 600;
}
.control-buttons {
display: flex;
gap: 8px;
justify-content: center;
flex-wrap: wrap;
}
.control-btn {
padding: 6px 12px;
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 6px;
color: white;
font-size: 12px;
cursor: pointer;
transition: all 0.3s ease;
}
.control-btn:hover,
.control-btn.active {
background: rgba(255, 255, 255, 0.3);
transform: translateY(-1px);
}
.menu-container {
background: white;
border-radius: 12px;
padding: 0;
margin-bottom: 20px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.multi-dropdown-nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
background: #ffffff;
border-bottom: 1px solid #e5e7eb;
position: relative;
min-height: 60px;
}
.nav-brand {
display: flex;
align-items: center;
gap: 8px;
font-weight: 700;
font-size: 18px;
color: #1f2937;
}
.brand-icon {
font-size: 24px;
}
.nav-menu {
display: flex;
list-style: none;
margin: 0;
padding: 0;
gap: 0;
}
.nav-item {
position: relative;
}
.nav-link {
display: flex;
align-items: center;
gap: 6px;
padding: 20px 16px;
text-decoration: none;
color: #374151;
font-weight: 500;
transition: all 0.3s ease;
border-bottom: 3px solid transparent;
}
.nav-link:hover,
.nav-link:focus {
color: #3b82f6;
background: rgba(59, 130, 246, 0.05);
border-bottom-color: #3b82f6;
}
.dropdown-icon,
.submenu-icon {
font-size: 10px;
transition: transform 0.3s ease;
}
.nav-item.active .dropdown-icon {
transform: rotate(180deg);
}
.dropdown-menu,
.submenu {
position: absolute;
top: 100%;
left: 0;
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
min-width: 220px;
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
z-index: 1000;
list-style: none;
margin: 0;
padding: 8px 0;
}
.submenu {
top: 0;
left: 100%;
margin-left: 8px;
}
.nav-item:hover .dropdown-menu,
.nav-item.active .dropdown-menu,
.dropdown-item:hover .submenu,
.dropdown-item.active .submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.dropdown-item {
position: relative;
}
.dropdown-link,
.submenu-link {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
text-decoration: none;
color: #374151;
font-size: 14px;
transition: all 0.3s ease;
border-left: 3px solid transparent;
}
.dropdown-link:hover,
.dropdown-link:focus,
.submenu-link:hover,
.submenu-link:focus {
background: rgba(59, 130, 246, 0.05);
color: #3b82f6;
border-left-color: #3b82f6;
}
.item-icon {
font-size: 16px;
width: 20px;
text-align: center;
}
.has-submenu .submenu-icon {
margin-left: auto;
}
.dropdown-item.active .submenu-icon {
transform: rotate(90deg);
}
.nav-toggle {
display: none;
flex-direction: column;
gap: 4px;
cursor: pointer;
padding: 8px;
border-radius: 4px;
transition: background 0.3s ease;
}
.nav-toggle:hover {
background: rgba(59, 130, 246, 0.1);
}
.hamburger-line {
width: 20px;
height: 2px;
background: #374151;
transition: all 0.3s ease;
}
.nav-toggle.active .hamburger-line:nth-child(1) {
transform: rotate(45deg) translate(5px, 5px);
}
.nav-toggle.active .hamburger-line:nth-child(2) {
opacity: 0;
}
.nav-toggle.active .hamburger-line:nth-child(3) {
transform: rotate(-45deg) translate(7px, -6px);
}
.menu-info {
background: rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 16px;
display: flex;
gap: 24px;
flex-wrap: wrap;
}
.info-item {
display: flex;
flex-direction: column;
gap: 4px;
}
.info-label {
font-size: 12px;
opacity: 0.8;
font-weight: 500;
}
.info-value {
font-size: 14px;
font-weight: 600;
}
/* Variaciones de Tema */
.multi-dropdown-nav.dark-theme {
background: #1f2937;
border-bottom-color: #374151;
}
.dark-theme .nav-brand,
.dark-theme .nav-link {
color: #f9fafb;
}
.dark-theme .nav-link:hover,
.dark-theme .nav-link:focus {
background: rgba(59, 130, 246, 0.2);
}
.dark-theme .dropdown-menu,
.dark-theme .submenu {
background: #374151;
border-color: #4b5563;
}
.dark-theme .dropdown-link,
.dark-theme .submenu-link {
color: #f9fafb;
}
.dark-theme .dropdown-link:hover,
.dark-theme .dropdown-link:focus,
.dark-theme .submenu-link:hover,
.dark-theme .submenu-link:focus {
background: rgba(59, 130, 246, 0.2);
}
.multi-dropdown-nav.minimal-theme {
background: #f9fafb;
border-bottom: none;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.minimal-theme .nav-link {
border-radius: 6px;
margin: 0 4px;
}
.minimal-theme .nav-link:hover,
.minimal-theme .nav-link:focus {
background: #e5e7eb;
border-bottom-color: transparent;
}
.multi-dropdown-nav.colorful-theme {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-bottom: none;
}
.colorful-theme .nav-brand,
.colorful-theme .nav-link {
color: white;
}
.colorful-theme .nav-link:hover,
.colorful-theme .nav-link:focus {
background: rgba(255, 255, 255, 0.2);
border-bottom-color: white;
}
.colorful-theme .dropdown-menu,
.colorful-theme .submenu {
background: white;
border: none;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
}
/* Responsivo Móvil */
@media (max-width: 768px) {
.nav-toggle {
display: flex;
}
.nav-menu {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: white;
flex-direction: column;
border-top: 1px solid #e5e7eb;
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
z-index: 999;
}
.nav-menu.active {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.nav-item {
width: 100%;
}
.nav-link {
padding: 16px 20px;
border-bottom: 1px solid #f3f4f6;
border-left: none;
}
.dropdown-menu {
position: static;
opacity: 1;
visibility: visible;
transform: none;
box-shadow: none;
border: none;
border-radius: 0;
background: #f9fafb;
display: none;
}
.nav-item.active .dropdown-menu {
display: block;
}
.submenu {
position: static;
margin-left: 0;
background: #f3f4f6;
display: none;
}
.dropdown-item.active .submenu {
display: block;
}
.dropdown-link,
.submenu-link {
padding-left: 40px;
}
.submenu-link {
padding-left: 60px;
}
.menu-info {
flex-direction: column;
gap: 12px;
}
}
/* Estilos de enfoque para accesibilidad */
.nav-link:focus,
.dropdown-link:focus,
.submenu-link:focus,
.nav-toggle:focus {
outline: 2px solid #3b82f6;
outline-offset: 2px;
}
/* Animación para elementos del menú */
@keyframes slideIn {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
.dropdown-menu .dropdown-item,
.submenu li {
animation: slideIn 0.3s ease forwards;
}
.dropdown-menu .dropdown-item:nth-child(2) {
animation-delay: 0.1s;
}
.dropdown-menu .dropdown-item:nth-child(3) {
animation-delay: 0.2s;
}
.dropdown-menu .dropdown-item:nth-child(4) {
animation-delay: 0.3s;
}
/* Indicador de hover */
.nav-item::before {
content: '';
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 3px;
background: #3b82f6;
transition: all 0.3s ease;
transform: translateX(-50%);
}
.nav-item:hover::before {
width: 80%;
}
/* Estado de carga */
.nav-item.loading {
opacity: 0.6;
pointer-events: none;
}
.nav-item.loading::after {
content: '';
position: absolute;
top: 50%;
right: 8px;
width: 12px;
height: 12px;
border: 1px solid #e5e7eb;
border-top: 1px solid #3b82f6;
border-radius: 50%;
animation: spin 1s linear infinite;
transform: translateY(-50%);
}
@keyframes spin {
0% { transform: translateY(-50%) rotate(0deg); }
100% { transform: translateY(-50%) rotate(360deg); }
}
document.addEventListener('DOMContentLoaded', function() {
const nav = document.querySelector('.multi-dropdown-nav');
const navToggle = document.querySelector('.nav-toggle');
const navMenu = document.querySelector('.nav-menu');
const navItems = document.querySelectorAll('.nav-item');
const dropdownItems = document.querySelectorAll('.dropdown-item');
const controlButtons = document.querySelectorAll('.control-btn');
const currentTheme = document.getElementById('currentTheme');
const activeMenu = document.getElementById('activeMenu');
const menuDepth = document.getElementById('menuDepth');
let currentDepth = 0;
let activeMenuPath = [];
// Inicializar funcionalidad de dropdown multinivel
function initMultiDropdown() {
// Manejar elementos de navegación principal
navItems.forEach((item, index) => {
const link = item.querySelector('.nav-link');
const dropdown = item.querySelector('.dropdown-menu');
if (dropdown) {
// Eventos de mouse
item.addEventListener('mouseenter', () => {
openDropdown(item, 1);
});
item.addEventListener('mouseleave', () => {
closeDropdown(item);
});
// Eventos de clic para móvil
link.addEventListener('click', (e) => {
if (window.innerWidth <= 768) {
e.preventDefault();
toggleDropdown(item);
}
});
// Navegación por teclado
link.addEventListener('keydown', (e) => {
handleKeyNavigation(e, item, 'nav');
});
}
// Manejar enlaces de navegación regulares
link.addEventListener('click', (e) => {
if (!item.classList.contains('has-dropdown')) {
handleNavClick(link.textContent.trim());
}
});
});
// Manejar elementos del dropdown
dropdownItems.forEach(item => {
const link = item.querySelector('.dropdown-link');
const submenu = item.querySelector('.submenu');
if (submenu) {
// Eventos de mouse
item.addEventListener('mouseenter', () => {
openSubmenu(item, 2);
});
item.addEventListener('mouseleave', () => {
closeSubmenu(item);
});
// Eventos de clic para móvil
link.addEventListener('click', (e) => {
if (window.innerWidth <= 768) {
e.preventDefault();
toggleSubmenu(item);
}
});
// Navegación por teclado
link.addEventListener('keydown', (e) => {
handleKeyNavigation(e, item, 'dropdown');
});
}
// Manejar clics en enlaces del dropdown
link.addEventListener('click', (e) => {
if (!item.classList.contains('has-submenu')) {
handleMenuClick(link.textContent.trim());
}
});
});
// Manejar enlaces del submenú
const submenuLinks = document.querySelectorAll('.submenu-link');
submenuLinks.forEach(link => {
link.addEventListener('click', (e) => {
handleMenuClick(link.textContent.trim());
});
link.addEventListener('keydown', (e) => {
handleKeyNavigation(e, link.closest('li'), 'submenu');
});
});
}
// Abrir menú desplegable
function openDropdown(item, depth) {
closeAllDropdowns();
item.classList.add('active');
item.querySelector('.nav-link').setAttribute('aria-expanded', 'true');
updateMenuInfo(item.querySelector('.nav-link').textContent.trim(), depth);
}
// Cerrar menú desplegable
function closeDropdown(item) {
item.classList.remove('active');
item.querySelector('.nav-link').setAttribute('aria-expanded', 'false');
closeAllSubmenus(item);
updateMenuInfo('Ninguno', 0);
}
// Alternar dropdown para móvil
function toggleDropdown(item) {
const isActive = item.classList.contains('active');
closeAllDropdowns();
if (!isActive) {
item.classList.add('active');
item.querySelector('.nav-link').setAttribute('aria-expanded', 'true');
updateMenuInfo(item.querySelector('.nav-link').textContent.trim(), 1);
} else {
updateMenuInfo('Ninguno', 0);
}
}
// Abrir submenú
function openSubmenu(item, depth) {
closeAllSubmenus();
item.classList.add('active');
item.querySelector('.dropdown-link').setAttribute('aria-expanded', 'true');
updateMenuInfo(item.querySelector('.dropdown-link').textContent.trim(), depth);
}
// Cerrar submenú
function closeSubmenu(item) {
item.classList.remove('active');
item.querySelector('.dropdown-link').setAttribute('aria-expanded', 'false');
// Actualizar a información del menú padre
const parentNav = item.closest('.nav-item');
if (parentNav) {
updateMenuInfo(parentNav.querySelector('.nav-link').textContent.trim(), 1);
}
}
// Alternar submenú para móvil
function toggleSubmenu(item) {
const isActive = item.classList.contains('active');
closeAllSubmenus();
if (!isActive) {
item.classList.add('active');
item.querySelector('.dropdown-link').setAttribute('aria-expanded', 'true');
updateMenuInfo(item.querySelector('.dropdown-link').textContent.trim(), 2);
} else {
const parentNav = item.closest('.nav-item');
if (parentNav) {
updateMenuInfo(parentNav.querySelector('.nav-link').textContent.trim(), 1);
}
}
}
// Cerrar todos los dropdowns
function closeAllDropdowns() {
navItems.forEach(item => {
item.classList.remove('active');
const link = item.querySelector('.nav-link');
if (link.hasAttribute('aria-expanded')) {
link.setAttribute('aria-expanded', 'false');
}
});
closeAllSubmenus();
}
// Cerrar todos los submenús
function closeAllSubmenus(parent = null) {
const items = parent ? parent.querySelectorAll('.dropdown-item') : dropdownItems;
items.forEach(item => {
item.classList.remove('active');
const link = item.querySelector('.dropdown-link');
if (link && link.hasAttribute('aria-expanded')) {
link.setAttribute('aria-expanded', 'false');
}
});
}
// Manejar navegación por teclado
function handleKeyNavigation(e, item, type) {
const items = getNavigationItems(type);
const currentIndex = Array.from(items).indexOf(item);
switch(e.key) {
case 'ArrowDown':
e.preventDefault();
const nextItem = items[currentIndex + 1] || items[0];
focusItem(nextItem, type);
break;
case 'ArrowUp':
e.preventDefault();
const prevItem = items[currentIndex - 1] || items[items.length - 1];
focusItem(prevItem, type);
break;
case 'ArrowRight':
e.preventDefault();
if (type === 'nav' && item.classList.contains('has-dropdown')) {
openDropdown(item, 1);
const firstDropdownItem = item.querySelector('.dropdown-item');
if (firstDropdownItem) {
focusItem(firstDropdownItem, 'dropdown');
}
} else if (type === 'dropdown' && item.classList.contains('has-submenu')) {
openSubmenu(item, 2);
const firstSubmenuItem = item.querySelector('.submenu li');
if (firstSubmenuItem) {
focusItem(firstSubmenuItem, 'submenu');
}
}
break;
case 'ArrowLeft':
e.preventDefault();
if (type === 'dropdown') {
const parentNav = item.closest('.nav-item');
if (parentNav) {
closeDropdown(parentNav);
focusItem(parentNav, 'nav');
}
} else if (type === 'submenu') {
const parentDropdown = item.closest('.dropdown-item');
if (parentDropdown) {
closeSubmenu(parentDropdown);
focusItem(parentDropdown, 'dropdown');
}
}
break;
case 'Escape':
e.preventDefault();
closeAllDropdowns();
updateMenuInfo('Ninguno', 0);
break;
case 'Enter':
case ' ':
e.preventDefault();
const link = item.querySelector('a');
if (link) {
link.click();
}
break;
}
}
// Obtener elementos de navegación por tipo
function getNavigationItems(type) {
switch(type) {
case 'nav':
return navItems;
case 'dropdown':
return document.querySelectorAll('.dropdown-item');
case 'submenu':
return document.querySelectorAll('.submenu li');
default:
return [];
}
}
// Enfocar en elemento específico
function focusItem(item, type) {
const link = item.querySelector('a');
if (link) {
link.focus();
}
}
// Manejar clics en enlaces de navegación
function handleNavClick(linkText) {
showFeedback(`Navegado a: ${linkText}`);
closeAllDropdowns();
updateMenuInfo('Ninguno', 0);
}
// Manejar clics en elementos del menú
function handleMenuClick(linkText) {
const cleanText = linkText.replace(/[^\w\s]/g, '').trim();
showFeedback(`Seleccionado: ${cleanText}`);
closeAllDropdowns();
updateMenuInfo('Ninguno', 0);
}
// Actualizar visualización de información del menú
function updateMenuInfo(menuName, depth) {
activeMenu.textContent = menuName;
menuDepth.textContent = depth;
currentDepth = depth;
}
// Alternar menú móvil
navToggle.addEventListener('click', () => {
navToggle.classList.toggle('active');
navMenu.classList.toggle('active');
const isOpen = navMenu.classList.contains('active');
navToggle.setAttribute('aria-expanded', isOpen);
if (isOpen) {
showFeedback('Menú móvil abierto');
} else {
showFeedback('Menú móvil cerrado');
closeAllDropdowns();
}
});
// Manejadores de control de tema
controlButtons.forEach(button => {
button.addEventListener('click', function() {
const theme = this.getAttribute('data-theme');
// Actualizar botón activo
controlButtons.forEach(btn => btn.classList.remove('active'));
this.classList.add('active');
// Actualizar tema de navegación
nav.className = `multi-dropdown-nav ${theme}-theme`;
// Actualizar información del tema
const themeNames = {
default: 'Predeterminado',
dark: 'Oscuro',
minimal: 'Minimalista',
colorful: 'Colorido'
};
currentTheme.textContent = themeNames[theme];
showFeedback(`Cambiado a tema ${themeNames[theme]}`);
});
});
// Cerrar dropdowns al hacer clic fuera
document.addEventListener('click', (e) => {
if (!nav.contains(e.target)) {
closeAllDropdowns();
updateMenuInfo('Ninguno', 0);
}
});
// Manejar redimensionamiento de ventana
window.addEventListener('resize', () => {
if (window.innerWidth > 768) {
navMenu.classList.remove('active');
navToggle.classList.remove('active');
closeAllDropdowns();
}
});
// Función de retroalimentación
function showFeedback(message) {
const existing = document.querySelector('.demo-feedback');
if (existing) existing.remove();
const feedback = document.createElement('div');
feedback.className = 'demo-feedback';
feedback.textContent = message;
feedback.style.cssText = `
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
background: linear-gradient(135deg, #48bb78 0%, #38a169 100%);
color: white;
padding: 12px 20px;
border-radius: 8px;
font-size: 14px;
font-weight: 500;
z-index: 10001;
box-shadow: 0 4px 15px rgba(72, 187, 120, 0.3);
opacity: 0;
transition: opacity 0.3s ease;
`;
document.body.appendChild(feedback);
requestAnimationFrame(() => {
feedback.style.opacity = '1';
});
setTimeout(() => {
feedback.style.opacity = '0';
setTimeout(() => feedback.remove(), 300);
}, 2500);
}
// Inicializar
initMultiDropdown();
// Retroalimentación inicial
setTimeout(() => {
showFeedback('¡Prueba pasar el cursor sobre los elementos del menú y usa las teclas de flecha para navegar!');
}, 1000);
// Exponer API para uso externo
window.multiDropdownAPI = {
closeAllDropdowns,
showFeedback,
updateMenuInfo
};
});