如何实现Dropdown Menu中的二级下拉展开功能?
实现二级下拉菜单功能
针对你提供的代码,要给"Dropdown Text"项添加二级下拉能力,点击它显示对应的隐藏文本,其他项保持非下拉状态,可按以下步骤修改:
1. 调整HTML结构
把原来的"Dropdown Text"项改成包含二级菜单的嵌套结构,给它标记特殊类区分普通项,同时添加二级下拉内容容器:
<div class="dropdown-item has-submenu"> Dropdown Text <div class="sub-dropdown-content"> <div class="sub-dropdown-item">二级文本1</div> <div class="sub-dropdown-item">二级文本2</div> <div class="sub-dropdown-item">二级文本3</div> </div> </div>
2. 添加二级菜单的CSS样式
在原有<style>标签里补充二级菜单的样式,默认隐藏,点击后展开,同时给带二级菜单的项加箭头标识:
/* 二级下拉菜单默认隐藏 */ .sub-dropdown-content { display: none; flex-direction: column; margin-top: 8px; padding-left: 15px; /* 缩进区分层级 */ align-items: flex-start; } /* 二级菜单项样式 */ .sub-dropdown-item { margin: 6px 0; cursor: pointer; color: #333; } /* 给带二级菜单的项添加箭头标识 */ .has-submenu::after { content: " ▼"; font-size: 14px; margin-left: 4px; } /* 展开时切换箭头方向 */ .has-submenu.active::after { content: " ▲"; }
3. 更新JavaScript逻辑
添加处理二级菜单点击的逻辑,给所有带二级菜单的项绑定点击事件,切换二级菜单的显示状态:
// 处理二级下拉菜单 const subMenuTriggers = document.querySelectorAll('.has-submenu'); subMenuTriggers.forEach(trigger => { const subMenu = trigger.querySelector('.sub-dropdown-content'); trigger.addEventListener('click', (e) => { e.stopPropagation(); // 防止事件冒泡触发父级菜单关闭 subMenu.style.display = subMenu.style.display === 'none' ? 'flex' : 'none'; trigger.classList.toggle('active'); // 切换箭头样式 }); });
完整代码
整合所有修改后的完整代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Dropdown Menu</title> <style> .custom-box { background-color: #ff5733; padding: 20px; border-radius: 10px; display: flex; flex-direction: column; align-items: center; text-align: center; font-family: Arial, sans-serif; } .box-title { font-size: 24px; font-weight: bold; color: #fff; } .box-content { margin-top: 10px; font-size: 18px; color: #333; } .custom-button { background-color: #ff8f33; color: #fff; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; margin-top: 20px; } .custom-button:hover { background-color: #ff5722; } .dropdown-content { display: none; flex-direction: column; align-items: center; } .dropdown-item { margin: 10px 0; cursor: pointer; } /* 新增二级菜单样式 */ .sub-dropdown-content { display: none; flex-direction: column; margin-top: 8px; padding-left: 15px; align-items: flex-start; } .sub-dropdown-item { margin: 6px 0; cursor: pointer; color: #333; } .has-submenu::after { content: " ▼"; font-size: 14px; margin-left: 4px; } .has-submenu.active::after { content: " ▲"; } </style> </head> <body> <div class="custom-box"> <div class="box-title">Dropdown Menu</div> <div class="box-content"> Sample Text </div> <button class="custom-button" id="dropdown-button">Click Me</button> <div class="dropdown-content" id="dropdown-menu"> <!-- 修改后的带二级菜单的项 --> <div class="dropdown-item has-submenu"> Dropdown Text <div class="sub-dropdown-content"> <div class="sub-dropdown-item">二级文本1</div> <div class="sub-dropdown-item">二级文本2</div> <div class="sub-dropdown-item">二级文本3</div> </div> </div> <div class="dropdown-item">Sample Text</div> <div class="dropdown-item">Sample Text</div> </div> </div> <script> const dropdownButton = document.getElementById('dropdown-button'); const dropdownMenu = document.getElementById('dropdown-menu'); dropdownButton.addEventListener('click', () => { dropdownMenu.style.display = dropdownMenu.style.display === 'none' ? 'flex' : 'none'; }); // 新增二级菜单处理逻辑 const subMenuTriggers = document.querySelectorAll('.has-submenu'); subMenuTriggers.forEach(trigger => { const subMenu = trigger.querySelector('.sub-dropdown-content'); trigger.addEventListener('click', (e) => { e.stopPropagation(); subMenu.style.display = subMenu.style.display === 'none' ? 'flex' : 'none'; trigger.classList.toggle('active'); }); }); </script> </body> </html>
内容的提问来源于stack exchange,提问作者s.ha11
相关产品推荐
相关产品推荐

