如何让Bootstrap模板子菜单匹配主导航样式并hover时保持展开?
导航子菜单显示与Hover异常修复方案
问题背景
使用Bootstrap模板构建侧边导航时,第三个菜单项的4个子菜单无法正常显示:hover父项时子菜单提前收起,无法保持展开状态。需求是子菜单默认隐藏,hover父项时展开。
修复后的代码
HTML结构(无需修改,保持原结构即可)
<html> <body> <header id="header" class="d-flex flex-column justify-content-center"> <nav id="navbar" class="navbar nav-menu"> <ul class="main-nav"> <li><a href="#home" class="scrollto active">H<span>Home</span></a></li> <li><a href="#about" class="scrollto">A<span>About</span></a></li> <li><a href="#portfolio" class="scrollto">P<span>Portfolio</span></a> <ul class="nav-sub"> <li><a href="/loupe2.html"><span>Sub 1</span></a></li> <li><a href="/apexdrop2.html"><span>Sub 2</span></a></li> <li><a href="/coursework.html"><span>Sub 3</span></a></li> <li><a href="/other.html"><span>Sub 4</span></a></li> </ul> </li> </ul> </nav> </header> </body> </html>
修正后的CSS
body { font-family: "Open Sans", sans-serif; color: #272829; } a { color: #0563bb; text-decoration: none; } a:hover { color: #067ded; text-decoration: none; } #header { position: fixed; top: 0; left: 0; bottom: 0; z-index: 9997; transition: all 0.5s; padding: 15px; overflow-y: auto; } .nav-menu { padding: 0; display: block; position: relative; } .nav-menu * { margin: 0; padding: 0; list-style: none; } .nav-menu ul { position: relative; white-space: nowrap; } .nav-menu a, .nav-menu a:focus { display: flex; align-items: center; color: rgba(26, 26, 26, 1); padding: 10px 18px; margin-bottom: 8px; transition: 0.3s; font-size: 15px; border-radius: 50px; background: #f2f3f5; height: 56px; width: 100%; overflow: hidden; } .nav-menu a { border: 4px #1a1a1a solid; padding-left: 15px !important; } .nav-menu a span, .nav-menu a:focus span { padding: 0 5px 0 5px; color: #1a1a1a; display: none; } .nav-menu a:hover, .nav-menu .active, .nav-menu .active:focus, .nav-menu li:hover > a { color: #fff; background: #1a1a1a; border: 4px white solid; padding: 0 20px; } .nav-menu a:hover span, .nav-menu .active span, .nav-menu .active:focus span, .nav-menu li:hover > a span { color: #fff; display: block; } /* 父菜单项优化:确保hover范围覆盖子菜单区域 */ .main-nav > li { position: relative; padding-bottom: 8px; } /* 子菜单展开触发逻辑 */ .main-nav > li:hover .nav-sub { opacity: 1; display: block; } /* 子菜单基础样式 */ .nav-sub { margin-bottom: 8px; padding: 0; position: relative; display: none; width: 100%; height: auto; text-align: center; opacity: 0; transition: all 0.3s ease; } .nav-sub li { display: flex; margin: 0 0 8px 0; width: 100%; } /* 子菜单链接样式同步 */ .nav-sub a { border: 4px #1a1a1a solid; padding-left: 15px !important; } .nav-sub a:hover { color: #fff; background: #1a1a1a; border: 4px white solid; padding: 0 20px; } .nav-sub a:hover span { color: #fff; display: block; }
核心修改点解析
- 移除子项强制隐藏:删掉原CSS中
.nav-sub li, .nav-sub li:focus { display: none; },这是子菜单无法显示的直接原因 - 父项hover范围优化:给
.main-nav > li添加position: relative和padding-bottom,避免鼠标从父项移到子菜单时脱离hover触发区域,解决子菜单提前收起的问题 - 子菜单定位调整:将
.nav-sub的absolute定位改为relative,让子菜单跟随父菜单项布局;若需悬浮效果,可改为position: absolute; top: 100%; left: 0;并确保父li为relative定位 - hover选择器修正:将
nav-menu:hover > a改为nav-menu li:hover > a,确保hover父菜单项时正确触发样式变化与子菜单展开 - 子菜单样式补全:同步子菜单链接的hover样式,保持整体交互一致性
内容的提问来源于stack exchange,提问作者Steve Mullen
相关产品推荐
相关产品推荐

