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

Liferay 7.3多级导航问题:下拉菜单宽度适配修复求助

Liferay 7.3导航菜单修复:Mega Menu全宽+下拉菜单自适应宽度

问题现状

当前所有下拉菜单(包括Mega Menu和普通子级下拉)都强制占满100%宽度,导致子级下拉菜单过宽错位,影响用户体验。需要实现:

  • 顶级触发的Mega Menu保持100%屏幕/容器宽度,容纳多列内容
  • 子级下拉菜单自适应内容宽度,与对应父导航项对齐

解决方案:分两步修改模板和CSS

第一步:修改FreeMarker模板(nav.ftl)

核心是区分Mega Menu和普通下拉菜单,添加专属CSS类实现样式分离:

找到模板中下拉菜单代码块,替换为以下内容:

<!-- Dropdown Menu -->
<#-- 判断是否为Mega Menu:顶级菜单项且包含多级子菜单 -->
<#assign is_mega_menu = false />
<#if nav_item.getParentLayout()?exists == false && nav_item.getChildren()?filter(nav_child -> nav_child.hasChildren())?size > 0>
    <#assign is_mega_menu = true />
</#if>

<#if is_mega_menu>
    <div class="dropdown-menu mega-menu mt-0 dropdown-menu-custom">
<#else>
    <div class="dropdown-menu dropdown-menu-custom">
</#if>
    <div class="row mx-0">
        <#list nav_item.getChildren() as nav_child>
            <!-- Mega Menu Column -->
            <#if nav_child.hasChildren()>
                <div class="col-lg-3">
                    <div class="list-group list-group-flush">
                        <p class="mb-0 list-group-item p-1">
                            ${nav_child.getName()}
                        </p>
                        <#list nav_child.getChildren() as sub_nav_child>
                            <a href="${sub_nav_child.getURL()}" target="_blank"
                               class="list-group-item list-group-item-action p-1 border-0">${sub_nav_child.getName()}</a>
                        </#list>
                    </div>
                </div>
                <!-- Single Dropdown Item -->
            <#else>
                <a class="dropdown-item" href="${nav_child.getURL()}"
                   target="_blank">${nav_child.getName()}</a>
            </#if>
        </#list>
    </div>
</div>

注:移除原模板中dropdown-menu的w-100类,由CSS单独控制宽度。

第二步:修改CSS样式

替换原CSS中下拉菜单相关规则,分别定义两种菜单的样式:

/* 通用下拉菜单基础样式 */
.navbar-nav .dropdown-menu-custom {
  display: none;
  position: absolute;
  background-color: #fff;
  border: 1px solid #ccc;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  z-index: 1000;
  padding: 10px 0;
}

/* Mega Menu 样式:全屏宽度 */
.navbar-nav .mega-menu {
  width: 100vw;
  left: 0;
  top: 100%;
  margin-left: calc(-50vw + 50%); /* 与容器居中对齐 */
}

/* 普通下拉菜单样式:自适应宽度 */
.navbar-nav .dropdown:not(.custom-dropdown) .dropdown-menu-custom {
  min-width: 200px;
  width: auto;
  left: 0;
  top: 100%;
}

/* hover显示逻辑 */
.navbar-nav .dropdown:hover .dropdown-menu-custom {
  display: block;
}

/* 移动端适配:所有下拉占满宽度 */
@media (max-width: 768px) {
  .navbar-nav .dropdown-menu-custom,
  .navbar-nav .mega-menu {
    position: static;
    width: 100%;
    box-shadow: none;
    border: none;
    margin-left: 0;
  }
}

/* 保留原有其他样式 */
.header-logo {
  position: relative;
  top: -5px;
}

.navbar-nav .nav-item:hover .nav-link {
  color: #1d3e6c;
}

.custom-dropdown {
  position: static;
}

.navbar-toggler:focus {
  outline: none;
}

.navbar-nav .dropdown-item {
  padding: 10px 20px;
  color: #777;
  text-decoration: none;
  display: block;
}

.navbar-nav .dropdown-item:hover {
  background-color: #f8f8f8;
}

.navbar-nav .mega-menu .col-lg-3 {
  padding: 10px;
  flex: 1 1 25%;
}

.navbar-nav .mega-menu .list-group-item {
  padding: 10px 0;
  color: #777;
  text-decoration: none;
}

.navbar-nav .mega-menu .list-group-item:hover {
  background-color: #f8f8f8;
}

.navbar-nav .nav-link {
  color: #777;
  padding: 10px 15px;
  text-decoration: none;
}

.navbar-nav .dropdown-toggle::after {
  content: none;
}

效果说明

  • Mega Menu:顶级菜单项触发时自动拉伸至屏幕全宽,多列内容正常排列
  • 普通下拉菜单:子级菜单项触发时宽度自适应内容,与父导航项左对齐,不再占满全屏
  • 移动端保持所有下拉菜单占满宽度,符合响应式设计

导航效果截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:05:54