当前位置:首页 > JavaScript

js实现树形菜单

2026-04-04 02:59:13JavaScript

实现树形菜单的基本思路

树形菜单通常由嵌套的列表结构构成,通过JavaScript动态生成HTML元素并控制其展开/折叠状态。核心逻辑包括数据结构的定义、DOM操作和事件绑定。

数据结构设计

树形菜单的数据通常以嵌套对象或数组表示,每个节点包含idlabelchildren等属性。例如:

const treeData = [
  {
    id: 1,
    label: "节点1",
    children: [
      {
        id: 2,
        label: "子节点1",
        children: []
      }
    ]
  }
];

递归渲染树形结构

通过递归函数遍历数据并生成对应的HTML元素:

function renderTree(node, parentElement) {
  const li = document.createElement('li');
  li.innerHTML = `<span>${node.label}</span>`;

  if (node.children && node.children.length > 0) {
    const ul = document.createElement('ul');
    node.children.forEach(child => renderTree(child, ul));
    li.appendChild(ul);
  }

  parentElement.appendChild(li);
}

添加展开/折叠功能

为每个可展开的节点添加点击事件,通过CSS类控制子菜单的显示/隐藏:

li.querySelector('span').addEventListener('click', function() {
  const ul = this.parentNode.querySelector('ul');
  if (ul) ul.classList.toggle('hidden');
});

对应的CSS样式:

.hidden { display: none; }

完整实现示例

document.addEventListener('DOMContentLoaded', function() {
  const treeData = [
    {
      id: 1,
      label: "根节点",
      children: [
        {
          id: 2,
          label: "子节点1",
          children: [
            { id: 3, label: "子子节点1", children: [] }
          ]
        },
        { id: 4, label: "子节点2", children: [] }
      ]
    }
  ];

  const treeContainer = document.getElementById('tree');
  treeData.forEach(node => renderTree(node, treeContainer));

  function renderTree(node, parentElement) {
    const li = document.createElement('li');
    const span = document.createElement('span');
    span.textContent = node.label;
    li.appendChild(span);

    if (node.children && node.children.length > 0) {
      const ul = document.createElement('ul');
      node.children.forEach(child => renderTree(child, ul));
      li.appendChild(ul);

      span.addEventListener('click', function(e) {
        e.stopPropagation();
        ul.classList.toggle('hidden');
      });
    }

    parentElement.appendChild(li);
  }
});

使用第三方库简化开发

如果需要更复杂的功能(如拖拽、复选框等),可以考虑使用现成的树形菜单库:

  1. jsTree:功能丰富的jQuery插件

    $('#tree').jstree({
      'core': {
        'data': treeData
      }
    });
  2. zTree:轻量级的纯JavaScript实现

  3. Vue/React生态

    js实现树形菜单

    • Vue: vue-treeselect
    • React: react-treebeard

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

相关文章

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

css制作菜单

css制作菜单

CSS 制作菜单的方法 使用 CSS 可以制作多种风格的菜单,包括水平菜单、垂直菜单、下拉菜单等。以下是几种常见的实现方式。 水平菜单 水平菜单通常用于导航栏,可以通过 display: inlin…

css div 制作导航菜单

css div 制作导航菜单

使用 CSS 和 Div 制作导航菜单 导航菜单是网站的重要组成部分,以下是通过 CSS 和 div 元素制作导航菜单的方法。 基本 HTML 结构 创建一个简单的 div 结构作为导航菜单的基础:…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…