You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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;
}

核心修改点解析

  1. 移除子项强制隐藏:删掉原CSS中.nav-sub li, .nav-sub li:focus { display: none; },这是子菜单无法显示的直接原因
  2. 父项hover范围优化:给.main-nav > li添加position: relative和padding-bottom,避免鼠标从父项移到子菜单时脱离hover触发区域,解决子菜单提前收起的问题
  3. 子菜单定位调整:将.nav-sub的absolute定位改为relative,让子菜单跟随父菜单项布局;若需悬浮效果,可改为position: absolute; top: 100%; left: 0;并确保父li为relative定位
  4. hover选择器修正:将nav-menu:hover > a改为nav-menu li:hover > a,确保hover父菜单项时正确触发样式变化与子菜单展开
  5. 子菜单样式补全:同步子菜单链接的hover样式,保持整体交互一致性

内容的提问来源于stack exchange,提问作者Steve Mullen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:05:21