<div class="dropdown-demo">
<div class="demo-content">
<h2>Demo de Menú Desplegable Multinivel</h2>
<p>Un sistema completo de menú desplegable con múltiples niveles, interacciones hover y clic, y animaciones suaves. Perfecto para estructuras de navegación complejas.</p>
<div class="demo-controls">
<h3>Modo de Interacción:</h3>
<div class="control-buttons">
<button class="control-btn active" data-mode="hover">Modo Hover</button>
<button class="control-btn" data-mode="click">Modo Clic</button>
<button class="control-btn" data-mode="mixed">Modo Mixto</button>
</div>
</div>
</div>
<div class="dropdown-container">
<nav class="dropdown-nav" role="navigation" aria-label="Navegación principal">
<ul class="dropdown-menu" id="mainMenu">
<li class="dropdown-item">
<a href="#" class="dropdown-link">Inicio</a>
</li>
<li class="dropdown-item has-dropdown">
<a href="#" class="dropdown-link" aria-haspopup="true" aria-expanded="false">
Productos
<span class="dropdown-arrow">▼</span>
</a>
<ul class="dropdown-submenu" aria-label="Submenú de productos">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Todos los Productos</a>
</li>
<li class="dropdown-subitem has-dropdown">
<a href="#" class="dropdown-sublink" aria-haspopup="true" aria-expanded="false">
Electrónicos
<span class="dropdown-arrow">▶</span>
</a>
<ul class="dropdown-submenu level-2">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Smartphones</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Portátiles</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Tablets</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Accesorios</a>
</li>
</ul>
</li>
<li class="dropdown-subitem has-dropdown">
<a href="#" class="dropdown-sublink" aria-haspopup="true" aria-expanded="false">
Ropa
<span class="dropdown-arrow">▶</span>
</a>
<ul class="dropdown-submenu level-2">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Ropa de Hombre</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Ropa de Mujer</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Ropa Infantil</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Zapatos</a>
</li>
</ul>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Hogar y Jardín</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Deportes y Aire Libre</a>
</li>
</ul>
</li>
<li class="dropdown-item has-dropdown">
<a href="#" class="dropdown-link" aria-haspopup="true" aria-expanded="false">
Servicios
<span class="dropdown-arrow">▼</span>
</a>
<ul class="dropdown-submenu">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Diseño Web</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Desarrollo</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Servicios SEO</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Consultoría</a>
</li>
</ul>
</li>
<li class="dropdown-item has-dropdown">
<a href="#" class="dropdown-link" aria-haspopup="true" aria-expanded="false">
Acerca de
<span class="dropdown-arrow">▼</span>
</a>
<ul class="dropdown-submenu">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Nuestra Historia</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Equipo</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Carreras</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Prensa</a>
</li>
</ul>
</li>
<li class="dropdown-item">
<a href="#" class="dropdown-link">Contacto</a>
</li>
</ul>
</nav>
<div class="dropdown-info">
<div class="info-item">
<span class="info-label">Modo Actual:</span>
<span class="info-value" id="currentMode">Modo Hover</span>
</div>
<div class="info-item">
<span class="info-label">Elemento Activo:</span>
<span class="info-value" id="activeItem">Ninguno</span>
</div>
<div class="info-item">
<span class="info-label">Nivel de Menú:</span>
<span class="info-value" id="menuLevel">0</span>
</div>
</div>
</div>
</div>
.dropdown-demo {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 370px;
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: 8px 16px;
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 6px;
color: white;
font-size: 14px;
cursor: pointer;
transition: all 0.3s ease;
}
.control-btn:hover,
.control-btn.active {
background: rgba(255, 255, 255, 0.3);
transform: translateY(-1px);
}
.dropdown-container {
background: white;
border-radius: 12px;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}
.dropdown-nav {
margin-bottom: 20px;
}
.dropdown-menu {
list-style: none;
margin: 0;
padding: 0;
display: flex;
background: #f8f9fa;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.dropdown-item {
position: relative;
}
.dropdown-link {
display: flex;
align-items: center;
gap: 8px;
padding: 16px 20px;
text-decoration: none;
color: #4a5568;
font-weight: 500;
transition: all 0.3s ease;
white-space: nowrap;
}
.dropdown-link:hover {
background: #e2e8f0;
color: #2d3748;
}
.dropdown-arrow {
font-size: 12px;
transition: transform 0.3s ease;
}
.dropdown-item.active > .dropdown-link .dropdown-arrow {
transform: rotate(180deg);
}
.dropdown-submenu {
list-style: none;
margin: 0;
padding: 8px 0;
position: absolute;
top: 100%;
left: 0;
min-width: 200px;
background: white;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
z-index: 1000;
}
.dropdown-submenu.level-2 {
top: 0;
left: 100%;
margin-left: 8px;
}
.dropdown-item.active > .dropdown-submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.dropdown-subitem {
position: relative;
}
.dropdown-sublink {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 20px;
text-decoration: none;
color: #4a5568;
font-size: 14px;
transition: all 0.3s ease;
}
.dropdown-sublink:hover {
background: #f7fafc;
color: #2d3748;
padding-left: 24px;
}
.dropdown-subitem.active > .dropdown-sublink {
background: #ebf8ff;
color: #3182ce;
}
.dropdown-subitem .dropdown-arrow {
font-size: 10px;
opacity: 0.7;
}
.dropdown-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;
}
/* Efectos hover */
.dropdown-item:hover > .dropdown-link {
background: #e2e8f0;
}
.dropdown-item:hover > .dropdown-submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.dropdown-subitem:hover > .dropdown-submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* Estilos del modo clic */
.dropdown-nav.click-mode .dropdown-item:hover > .dropdown-submenu {
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
}
.dropdown-nav.click-mode .dropdown-subitem:hover > .dropdown-submenu {
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
}
/* Estados activos para modo clic */
.dropdown-nav.click-mode .dropdown-item.active > .dropdown-submenu,
.dropdown-nav.click-mode .dropdown-subitem.active > .dropdown-submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* Modo mixto - primer nivel clic, segundo nivel hover */
.dropdown-nav.mixed-mode .dropdown-item:hover > .dropdown-submenu {
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
}
.dropdown-nav.mixed-mode .dropdown-item.active > .dropdown-submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.dropdown-nav.mixed-mode .dropdown-subitem:hover > .dropdown-submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* Diseño responsivo */
@media (max-width: 768px) {
.dropdown-demo {
padding: 20px;
}
.dropdown-menu {
flex-direction: column;
}
.dropdown-submenu {
position: static;
opacity: 1;
visibility: visible;
transform: none;
box-shadow: none;
background: #f7fafc;
margin: 8px 0;
border-radius: 6px;
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
}
.dropdown-submenu.level-2 {
margin-left: 20px;
}
.dropdown-item.active > .dropdown-submenu {
max-height: 300px;
}
.dropdown-sublink:hover {
padding-left: 20px;
}
.control-buttons {
flex-direction: column;
align-items: center;
}
.control-btn {
width: 120px;
}
.dropdown-info {
flex-direction: column;
gap: 12px;
}
}
/* Estilos de foco para accesibilidad */
.dropdown-link:focus,
.dropdown-sublink:focus,
.control-btn:focus {
outline: 2px solid #3182ce;
outline-offset: 2px;
}
/* Animación para elementos del menú */
.dropdown-subitem {
animation: fadeInUp 0.3s ease;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Estado de carga */
.dropdown-nav.loading {
opacity: 0.6;
pointer-events: none;
}
/* Resaltar ruta activa */
.dropdown-item.in-path > .dropdown-link,
.dropdown-subitem.in-path > .dropdown-sublink {
background: #e6fffa;
color: #319795;
}
document.addEventListener('DOMContentLoaded', function() {
const dropdownNav = document.querySelector('.dropdown-nav');
const mainMenu = document.getElementById('mainMenu');
const controlButtons = document.querySelectorAll('.control-btn');
const currentMode = document.getElementById('currentMode');
const activeItem = document.getElementById('activeItem');
const menuLevel = document.getElementById('menuLevel');
let interactionMode = 'hover';
let activeMenus = [];
// Inicializar funcionalidad del dropdown
function initDropdown() {
const dropdownItems = document.querySelectorAll('.dropdown-item, .dropdown-subitem');
dropdownItems.forEach(item => {
const link = item.querySelector('.dropdown-link, .dropdown-sublink');
const submenu = item.querySelector('.dropdown-submenu');
if (submenu) {
// Agregar manejadores de clic
link.addEventListener('click', function(e) {
e.preventDefault();
if (interactionMode === 'click' ||
(interactionMode === 'mixed' && item.classList.contains('dropdown-item'))) {
toggleSubmenu(item);
}
updateActiveInfo(link.textContent.trim());
});
// Agregar manejadores de hover
if (interactionMode === 'hover' ||
(interactionMode === 'mixed' && item.classList.contains('dropdown-subitem'))) {
item.addEventListener('mouseenter', function() {
if (interactionMode === 'hover' ||
(interactionMode === 'mixed' && item.classList.contains('dropdown-subitem'))) {
openSubmenu(item);
}
});
item.addEventListener('mouseleave', function() {
if (interactionMode === 'hover' ||
(interactionMode === 'mixed' && item.classList.contains('dropdown-subitem'))) {
closeSubmenu(item);
}
});
}
} else {
// Elemento de menú regular
link.addEventListener('click', function(e) {
e.preventDefault();
updateActiveInfo(link.textContent.trim());
showFeedback(`Navegado a: ${link.textContent.trim()}`);
});
}
});
}
// Alternar submenú (para modo clic)
function toggleSubmenu(item) {
const isActive = item.classList.contains('active');
if (isActive) {
closeSubmenu(item);
} else {
// Cerrar hermanos
const siblings = item.parentElement.children;
Array.from(siblings).forEach(sibling => {
if (sibling !== item) {
closeSubmenu(sibling);
}
});
openSubmenu(item);
}
}
// Abrir submenú
function openSubmenu(item) {
item.classList.add('active');
const link = item.querySelector('.dropdown-link, .dropdown-sublink');
link.setAttribute('aria-expanded', 'true');
updateMenuLevel();
updateActiveInfo(link.textContent.trim());
}
// Cerrar submenú
function closeSubmenu(item) {
item.classList.remove('active');
const link = item.querySelector('.dropdown-link, .dropdown-sublink');
link.setAttribute('aria-expanded', 'false');
// Cerrar todos los submenús hijos
const childItems = item.querySelectorAll('.dropdown-item, .dropdown-subitem');
childItems.forEach(child => {
child.classList.remove('active');
const childLink = child.querySelector('.dropdown-link, .dropdown-sublink');
if (childLink) {
childLink.setAttribute('aria-expanded', 'false');
}
});
updateMenuLevel();
}
// Actualizar indicador de nivel de menú
function updateMenuLevel() {
const activeItems = document.querySelectorAll('.dropdown-item.active, .dropdown-subitem.active');
menuLevel.textContent = activeItems.length;
}
// Actualizar información del elemento activo
function updateActiveInfo(itemText) {
activeItem.textContent = itemText;
}
// Manejadores de botones de control
controlButtons.forEach(button => {
button.addEventListener('click', function() {
const mode = this.getAttribute('data-mode');
// Actualizar botón activo
controlButtons.forEach(btn => btn.classList.remove('active'));
this.classList.add('active');
// Actualizar modo
interactionMode = mode;
const modeNames = {
hover: 'Modo Hover',
click: 'Modo Clic',
mixed: 'Modo Mixto'
};
currentMode.textContent = modeNames[mode];
// Actualizar clase de navegación
dropdownNav.className = 'dropdown-nav';
if (mode !== 'hover') {
dropdownNav.classList.add(mode + '-mode');
}
// Cerrar todos los menús
const activeItems = document.querySelectorAll('.dropdown-item.active, .dropdown-subitem.active');
activeItems.forEach(item => closeSubmenu(item));
// Reinicializar
initDropdown();
showFeedback(`Cambiado a ${modeNames[mode].toLowerCase()}`);
});
});
// Navegación por teclado
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
// Cerrar todos los menús
const activeItems = document.querySelectorAll('.dropdown-item.active, .dropdown-subitem.active');
activeItems.forEach(item => closeSubmenu(item));
updateActiveInfo('Ninguno');
}
});
// Clic fuera para cerrar menús
document.addEventListener('click', function(e) {
if (!dropdownNav.contains(e.target)) {
const activeItems = document.querySelectorAll('.dropdown-item.active, .dropdown-subitem.active');
activeItems.forEach(item => closeSubmenu(item));
updateActiveInfo('Ninguno');
}
});
// 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
initDropdown();
updateActiveInfo('Ninguno');
// Retroalimentación inicial
setTimeout(() => {
showFeedback('¡Prueba diferentes modos de interacción y explora el menú!');
}, 1000);
});