<div class="dropdown-demo">
<div class="demo-content">
<h2>Multi-Level Dropdown Menu Demo</h2>
<p>A comprehensive dropdown menu system with multiple levels, hover and click interactions, and smooth animations. Perfect for complex navigation structures.</p>
<div class="demo-controls">
<h3>Interaction Mode:</h3>
<div class="control-buttons">
<button class="control-btn active" data-mode="hover">Hover Mode</button>
<button class="control-btn" data-mode="click">Click Mode</button>
<button class="control-btn" data-mode="mixed">Mixed Mode</button>
</div>
</div>
</div>
<div class="dropdown-container">
<nav class="dropdown-nav" role="navigation" aria-label="Main navigation">
<ul class="dropdown-menu" id="mainMenu">
<li class="dropdown-item">
<a href="#" class="dropdown-link">Home</a>
</li>
<li class="dropdown-item has-dropdown">
<a href="#" class="dropdown-link" aria-haspopup="true" aria-expanded="false">
Products
<span class="dropdown-arrow">▼</span>
</a>
<ul class="dropdown-submenu" aria-label="Products submenu">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">All Products</a>
</li>
<li class="dropdown-subitem has-dropdown">
<a href="#" class="dropdown-sublink" aria-haspopup="true" aria-expanded="false">
Electronics
<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">Laptops</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Tablets</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Accessories</a>
</li>
</ul>
</li>
<li class="dropdown-subitem has-dropdown">
<a href="#" class="dropdown-sublink" aria-haspopup="true" aria-expanded="false">
Clothing
<span class="dropdown-arrow">▶</span>
</a>
<ul class="dropdown-submenu level-2">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Men's Clothing</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Women's Clothing</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Kids' Clothing</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Shoes</a>
</li>
</ul>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Home & Garden</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Sports & Outdoors</a>
</li>
</ul>
</li>
<li class="dropdown-item has-dropdown">
<a href="#" class="dropdown-link" aria-haspopup="true" aria-expanded="false">
Services
<span class="dropdown-arrow">▼</span>
</a>
<ul class="dropdown-submenu">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Web Design</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Development</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">SEO Services</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Consulting</a>
</li>
</ul>
</li>
<li class="dropdown-item has-dropdown">
<a href="#" class="dropdown-link" aria-haspopup="true" aria-expanded="false">
About
<span class="dropdown-arrow">▼</span>
</a>
<ul class="dropdown-submenu">
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Our Story</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Team</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Careers</a>
</li>
<li class="dropdown-subitem">
<a href="#" class="dropdown-sublink">Press</a>
</li>
</ul>
</li>
<li class="dropdown-item">
<a href="#" class="dropdown-link">Contact</a>
</li>
</ul>
</nav>
<div class="dropdown-info">
<div class="info-item">
<span class="info-label">Current Mode:</span>
<span class="info-value" id="currentMode">Hover Mode</span>
</div>
<div class="info-item">
<span class="info-label">Active Item:</span>
<span class="info-value" id="activeItem">None</span>
</div>
<div class="info-item">
<span class="info-label">Menu Level:</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;
}
/* Hover effects */
.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);
}
/* Click mode styles */
.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);
}
/* Active states for click mode */
.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);
}
/* Mixed mode - first level click, second level 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);
}
/* Responsive design */
@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;
}
}
/* Focus styles for accessibility */
.dropdown-link:focus,
.dropdown-sublink:focus,
.control-btn:focus {
outline: 2px solid #3182ce;
outline-offset: 2px;
}
/* Animation for menu items */
.dropdown-subitem {
animation: fadeInUp 0.3s ease;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Loading state */
.dropdown-nav.loading {
opacity: 0.6;
pointer-events: none;
}
/* Highlight active path */
.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 = [];
// Initialize dropdown functionality
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) {
// Add click handlers
link.addEventListener('click', function(e) {
e.preventDefault();
if (interactionMode === 'click' ||
(interactionMode === 'mixed' && item.classList.contains('dropdown-item'))) {
toggleSubmenu(item);
}
updateActiveInfo(link.textContent.trim());
});
// Add hover handlers
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 {
// Regular menu item
link.addEventListener('click', function(e) {
e.preventDefault();
updateActiveInfo(link.textContent.trim());
showFeedback(`Navigated to: ${link.textContent.trim()}`);
});
}
});
}
// Toggle submenu (for click mode)
function toggleSubmenu(item) {
const isActive = item.classList.contains('active');
if (isActive) {
closeSubmenu(item);
} else {
// Close siblings
const siblings = item.parentElement.children;
Array.from(siblings).forEach(sibling => {
if (sibling !== item) {
closeSubmenu(sibling);
}
});
openSubmenu(item);
}
}
// Open submenu
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());
}
// Close submenu
function closeSubmenu(item) {
item.classList.remove('active');
const link = item.querySelector('.dropdown-link, .dropdown-sublink');
link.setAttribute('aria-expanded', 'false');
// Close all child submenus
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();
}
// Update menu level indicator
function updateMenuLevel() {
const activeItems = document.querySelectorAll('.dropdown-item.active, .dropdown-subitem.active');
menuLevel.textContent = activeItems.length;
}
// Update active item info
function updateActiveInfo(itemText) {
activeItem.textContent = itemText;
}
// Control button handlers
controlButtons.forEach(button => {
button.addEventListener('click', function() {
const mode = this.getAttribute('data-mode');
// Update active button
controlButtons.forEach(btn => btn.classList.remove('active'));
this.classList.add('active');
// Update mode
interactionMode = mode;
currentMode.textContent = mode.charAt(0).toUpperCase() + mode.slice(1) + ' Mode';
// Update nav class
dropdownNav.className = 'dropdown-nav';
if (mode !== 'hover') {
dropdownNav.classList.add(mode + '-mode');
}
// Close all menus
const activeItems = document.querySelectorAll('.dropdown-item.active, .dropdown-subitem.active');
activeItems.forEach(item => closeSubmenu(item));
// Reinitialize
initDropdown();
showFeedback(`Switched to ${mode} mode`);
});
});
// Keyboard navigation
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
// Close all menus
const activeItems = document.querySelectorAll('.dropdown-item.active, .dropdown-subitem.active');
activeItems.forEach(item => closeSubmenu(item));
updateActiveInfo('None');
}
});
// Click outside to close menus
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('None');
}
});
// Feedback function
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);
}
// Initialize
initDropdown();
updateActiveInfo('None');
// Initial feedback
setTimeout(() => {
showFeedback('Try different interaction modes and explore the menu!');
}, 1000);
});