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

固定宽度CSS水平菜单超出6项自动归入下拉菜单的实现方案

可以仅使用CSS实现该需求,无需修改现有循环逻辑,仅需给外层ul添加自定义类名即可,兼容方案可配合极少量Blade调整适配低版本浏览器,具体实现步骤如下:

实现方案

步骤1:基础调整(可选,兼容老浏览器)

如果需要兼容Firefox 121以下、Chrome 105以下版本,可先调整Blade模板逻辑,提前判断菜单项总数,添加标记类:

@php
// 把原来的缓存逻辑提出来单独赋值
$categories = \Illuminate\Support\Facades\Cache::remember('filter-category-u', 60 * 30, fn () => \App\Models\Category::all()->keyBy('slug'));
$hasExtraItems = $categories->count() > 6;
@endphp
<!-- 给ul添加自定义类和多余项标记类 -->
<ul class="category-menu {{ $hasExtraItems ? 'has-extra' : '' }}">
    @foreach($categories as $key => $category)
    <li>
        <a class="@if(route_human_value('browse', 'category') == $key) active @endif" href="{{ route_human('browse', ['category' => $key]) }}">
            {{ $category->name }}
        </a>
    </li>
    @endforeach
</ul>

如果只需要兼容现代浏览器,不需要修改Blade代码,仅需给原有的ul添加category-menu类即可。

步骤2:添加CSS样式

/* 菜单基础样式 */
.category-menu {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  align-items: center;
  position: relative;
  gap: 24px; /* 菜单项间距可自行调整 */
}

.category-menu li {
  white-space: nowrap;
}

/* 前6个菜单项正常显示 */
.category-menu li:nth-child(-n + 6) {
  display: block;
}

/* 第7个及之后的菜单项默认隐藏 */
.category-menu li:nth-child(n + 7) {
  display: none;
}

/* 存在多余项时显示三点触发按钮 */
/* 现代浏览器无需修改Blade的话,把下面的.has-extra替换成:has(li:nth-child(7))即可 */
.category-menu.has-extra::after {
  content: "...";
  cursor: pointer;
  padding: 0 8px;
  font-size: 18px;
  font-weight: bold;
  user-select: none;
}

/* hover或点击三点时展开下拉菜单 */
.category-menu.has-extra:hover li:nth-child(n + 7),
.category-menu.has-extra:focus-within li:nth-child(n + 7) {
  display: block;
}

/* 下拉菜单容器定位,以第7个菜单项为容器基准 */
.category-menu li:nth-child(7) {
  position: absolute;
  right: 0;
  top: 100%;
  margin-top: 8px;
  background: #ffffff;
  border: 1px solid #e5e7eb;
  border-radius: 4px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
  min-width: 140px;
  padding: 6px 0;
  z-index: 999;
  display: grid;
}

/* 下拉菜单项样式调整 */
.category-menu li:nth-child(n + 7) a {
  display: block;
  padding: 8px 12px;
  text-decoration: none;
  color: inherit;
}

.category-menu li:nth-child(n + 7) a:hover {
  background: #f3f4f6;
}

方案说明

  • 纯CSS实现版本依赖CSS :has选择器,2023年之后发布的主流浏览器均已支持,无需修改业务逻辑
  • 兼容低版本浏览器的方案仅添加了一行PHP计数判断,无额外性能损耗
  • 默认支持hover展开、点击展开后点击页面其他区域自动收起的交互,符合常规下拉菜单使用习惯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:39:04