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

如何创建带弹出菜单的响应式面包屑导航?

实现响应式折叠面包屑导航

要实现内容过长时自动将中间项放入弹出菜单的面包屑,需要结合HTML结构调整、CSS样式控制和JavaScript逻辑判断,具体实现步骤如下:

1. 调整HTML结构

在原面包屑列表中新增下拉菜单容器,用来容纳被折叠的中间元素:

<div>
  <nav>
    <ul class="breadcrumb">
      <li class="breadcrumb-item"><a href="#">Home</a></li>
      <li class="breadcrumb-item"><a href="#">Tutorials1</a></li>
      <!-- 下拉菜单容器 -->
      <li class="breadcrumb-item dropdown hidden">
        <button class="dropdown-trigger">...</button>
        <ul class="dropdown-menu"></ul>
      </li>
      <li class="breadcrumb-item"><a href="#">Tutorials6</a></li>
      <li class="breadcrumb-item"><a href="#">Tutorials7</a></li>
      <li class="breadcrumb-item"><a href="#">Tutorials8</a></li>
      <!-- 标记可折叠的中间项 -->
      <li class="breadcrumb-item collapsible"><a href="#">Tutorials2</a></li>
      <li class="breadcrumb-item collapsible"><a href="#">Tutorials3</a></li>
      <li class="breadcrumb-item collapsible"><a href="#">Tutorials4</a></li>
      <li class="breadcrumb-item collapsible"><a href="#">Tutorials5</a></li>
    </ul>
  </nav>
</div>

2. 编写基础CSS样式

设置面包屑横向布局、响应式适配及下拉菜单样式:

.breadcrumb {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: nowrap;
  overflow: hidden;
  gap: 8px;
}

.breadcrumb-item {
  white-space: nowrap;
  display: flex;
  align-items: center;
}

.breadcrumb-item:not(:last-child)::after {
  content: ">";
  margin: 0 8px;
}

/* 下拉菜单样式 */
.dropdown {
  position: relative;
}

.dropdown-trigger {
  background: none;
  border: none;
  cursor: pointer;
  font-size: inherit;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  list-style: none;
  padding: 8px 0;
  margin: 4px 0 0;
  background: #fff;
  border: 1px solid #eee;
  border-radius: 4px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
  min-width: 150px;
}

.dropdown-menu .breadcrumb-item {
  padding: 4px 16px;
}

.dropdown-menu .breadcrumb-item::after {
  display: none;
}

/* 辅助控制类 */
.hidden {
  display: none !important;
}

.collapsible {
  display: none;
}

3. 实现JavaScript逻辑

通过检测容器宽度,动态控制中间项的显示与折叠:

function handleBreadcrumbCollapse() {
  const breadcrumb = document.querySelector('.breadcrumb');
  const dropdown = breadcrumb.querySelector('.dropdown');
  const dropdownMenu = dropdown.querySelector('.dropdown-menu');
  const collapsibleItems = breadcrumb.querySelectorAll('.collapsible');
  const visibleItems = breadcrumb.querySelectorAll('.breadcrumb-item:not(.collapsible):not(.dropdown)');
  
  // 清空下拉菜单
  dropdownMenu.innerHTML = '';
  
  // 计算可见项总宽度与容器宽度
  const containerWidth = breadcrumb.offsetWidth;
  let totalVisibleWidth = 0;
  visibleItems.forEach(item => totalVisibleWidth += item.offsetWidth);
  
  // 根据宽度判断是否折叠
  if (totalVisibleWidth > containerWidth) {
    dropdown.classList.remove('hidden');
    // 将折叠项复制到下拉菜单
    collapsibleItems.forEach(item => {
      const clone = item.cloneNode(true);
      clone.classList.remove('collapsible');
      dropdownMenu.appendChild(clone);
    });
  } else {
    dropdown.classList.add('hidden');
    // 恢复显示所有折叠项
    collapsibleItems.forEach(item => item.classList.remove('collapsible'));
  }
}

// 页面加载和窗口尺寸变化时触发
window.addEventListener('load', handleBreadcrumbCollapse);
window.addEventListener('resize', handleBreadcrumbCollapse);

逻辑说明

  • 页面初始化或窗口 resize 时,自动计算可见面包屑项的总宽度
  • 当总宽度超出容器宽度时,隐藏中间可折叠项,将其复制到下拉菜单中展示
  • 容器宽度足够时,自动显示所有面包屑项并隐藏下拉按钮

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:41:44