当前位置:首页 > JavaScript

js实现树形菜单

2026-01-30 11:20:11JavaScript

实现树形菜单的基本思路

使用JavaScript实现树形菜单通常需要结合HTML和CSS。树形菜单的核心是递归结构,每个菜单项可能包含子菜单,通过DOM操作动态展示或隐藏子项。

HTML结构设计

基础的树形菜单HTML结构通常使用嵌套的无序列表(<ul><li>)表示层级关系:

<ul class="tree">
  <li>
    <span class="toggle">父节点1</span>
    <ul>
      <li>子节点1</li>
      <li>子节点2</li>
    </ul>
  </li>
  <li>
    <span class="toggle">父节点2</span>
    <ul>
      <li>子节点3</li>
      <li>
        <span class="toggle">子节点4</span>
        <ul>
          <li>孙节点1</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

CSS样式设置

为树形菜单添加基础样式和交互效果:

js实现树形菜单

.tree ul {
  list-style: none;
  padding-left: 20px;
  display: none;
}
.tree li {
  margin: 5px 0;
}
.tree .toggle {
  cursor: pointer;
}
.tree .toggle::before {
  content: "+ ";
}
.tree .active::before {
  content: "- ";
}
.tree .active + ul {
  display: block;
}

JavaScript交互逻辑

通过事件委托实现点击展开/折叠功能:

document.querySelector('.tree').addEventListener('click', function(e) {
  if (e.target.classList.contains('toggle')) {
    e.target.classList.toggle('active');
  }
});

动态生成树形菜单

如果需要从数据动态生成树形结构,可以使用递归函数:

js实现树形菜单

function buildTree(data, parentElement) {
  const ul = document.createElement('ul');
  data.forEach(item => {
    const li = document.createElement('li');
    if (item.children) {
      const span = document.createElement('span');
      span.className = 'toggle';
      span.textContent = item.name;
      li.appendChild(span);
      buildTree(item.children, li);
    } else {
      li.textContent = item.name;
    }
    ul.appendChild(li);
  });
  parentElement.appendChild(ul);
}

// 示例数据
const treeData = [
  {
    name: '父节点1',
    children: [
      { name: '子节点1' },
      { name: '子节点2' }
    ]
  },
  {
    name: '父节点2',
    children: [
      { name: '子节点3' },
      {
        name: '子节点4',
        children: [
          { name: '孙节点1' }
        ]
      }
    ]
  }
];

buildTree(treeData, document.getElementById('treeContainer'));

添加动画效果

使用CSS过渡为展开/折叠添加平滑动画:

.tree ul {
  overflow: hidden;
  transition: max-height 0.3s ease-out;
  max-height: 0;
}
.tree .active + ul {
  max-height: 1000px;
}

完整组件实现

结合以上代码,可以创建一个完整的树形菜单组件。根据实际需求,可以进一步添加功能如:

  • 复选框选择
  • 右键菜单
  • 拖拽排序
  • 异步加载子节点数据

实现时注意保持代码模块化和可维护性,对于复杂场景可以考虑使用现有库如jsTree或zTree。

标签: 菜单js
分享给朋友:

相关文章

纯css制作tab菜单

纯css制作tab菜单

纯CSS制作Tab菜单的方法 使用radio input控制切换 通过<input type="radio">和<label>元素配合实现无JavaScript的Tab切换效果…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…