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

Bootstrap子菜单无法显示问题排查求助

解决Bootstrap 4多级子菜单不显示的问题

我帮你排查了代码里的几个关键问题,调整后就能正常显示子菜单了:

1. 修复HTML结构错误

你的导航菜单缺少了.navbar-nav核心容器,Bootstrap的导航项必须放在这个容器内才能继承正确的样式规则。修改后的完整HTML结构如下:

<!-- Menu Productos -->
<nav class="navbar navbar-expand-md navbar-light bg-light">
  <a class="navbar-brand pb-2" href="#">Navbar</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse" id="navbarNavDropdown">
    <!-- 新增navbar-nav容器,这是Bootstrap导航的必要结构 -->
    <ul class="navbar-nav">
      <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
          <i class="fas fa-project-diagram"></i> Productos <b class="caret"></b>
        </a>
        <ul class="dropdown-menu dropdown-menu--dark">
          <li>
            <a class="dropdown-item" [routerLink]='["/ConsoProductos"]'>
              <i class="fa fa-align-left" aria-hidden="true"></i> Consolidado
            </a>
          </li>
          <!-- 修正类名:和CSS选择器统一为dropdown-submenu -->
          <li class="dropdown-submenu">
            <a class="dropdown-item dropdown-toggle" href="#"> Registro de Productos </a>
            <ul class="dropdown-menu">
              <li>
                <a class="dropdown-item" [routerLink]='["/ruta1"]'> Generación Nuevo Conocimiento </a>
              </li>
              <li>
                <a class="dropdown-item" [routerLink]='["/ruta2"]'> Desarrollo Tecnológico e Innovación </a>
              </li>
              <li>
                <a class="dropdown-item" [routerLink]='["/ruta3"]'>
                  <i class="fa fa-align-left" aria-hidden="true"></i> Apropiación Social del Conocimiento
                </a>
              </li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
    <!-- Fin Menu productos -->
  </div>
</nav>

关键调整说明:

  • 把孤立的<li class="dropdown">包裹进了<ul class="navbar-nav">
  • 子菜单父项的类名从dropdown-submenu--dark改为dropdown-submenu(和你的CSS选择器保持一致)
  • 子菜单的toggle链接暂时去掉了[routerLink],避免点击直接跳转导致无法触发子菜单显示;如果需要跳转功能,后续可以通过JS阻止事件冒泡实现

2. 完善CSS样式

你的CSS缺少了子菜单箭头的默认样式,同时可以优化hover触发逻辑,调整后的完整CSS如下:

/* 基础多级菜单定位 */
.navbar-nav .dropdown-submenu {
  position: relative;
}

.navbar-nav .dropdown-submenu .dropdown-menu {
  top: 0;
  left: 100%;
  margin-top: -6px;
  display: none; /* 强制默认隐藏子菜单 */
}

/* hover时显示对应层级的菜单 */
.navbar-nav .dropdown:hover > .dropdown-menu,
.navbar-nav .dropdown-submenu:hover > .dropdown-menu {
  display: block;
}

/* 子菜单的箭头改为向右(区分于一级菜单的向下箭头) */
.navbar-nav .dropdown-submenu > .dropdown-toggle::after {
  border-top: .3em solid transparent;
  border-right: 0;
  border-bottom: .3em solid transparent;
  border-left: .3em solid;
  margin-left: .255em;
}

/* hover时旋转子菜单箭头 */
.navbar-nav .dropdown-submenu > .dropdown-toggle:hover::after {
  transform: rotate(90deg);
}

/* 菜单链接hover下划线样式 */
.dropdown-menu>li>a:hover:after {
  text-decoration: underline;
}

3. 处理JS交互冲突(可选)

Bootstrap 4的下拉菜单默认是点击触发,如果想用hover触发同时保留点击交互,可添加一段JS阻止事件冒泡,避免点击子菜单时父菜单意外收起:

$('.dropdown-submenu a.dropdown-toggle').on('click', function(e) {
  if (!$(this).next().hasClass('show')) {
    $(this).parents('.dropdown-menu').first().find('.show').removeClass('show');
  }
  var $subMenu = $(this).next('.dropdown-menu');
  $subMenu.toggleClass('show');
  $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) {
    $('.dropdown-submenu .show').removeClass('show');
  });
  return false;
});

完成以上调整后,你的多级子菜单应该就能正常显示和交互了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:44:59