当前位置:首页 > JavaScript

js实现四层树形菜单

2026-03-01 20:34:00JavaScript

实现思路

四层树形菜单可以通过递归或迭代方式生成,数据结构通常采用嵌套对象或数组。核心逻辑是动态渲染DOM节点,并通过CSS控制展开/折叠效果。

js实现四层树形菜单

数据结构示例

const treeData = [
  {
    label: '一级菜单1',
    children: [
      {
        label: '二级菜单1-1',
        children: [
          {
            label: '三级菜单1-1-1',
            children: [
              { label: '四级菜单1-1-1-1' },
              { label: '四级菜单1-1-1-2' }
            ]
          }
        ]
      }
    ]
  }
];

递归渲染方法

function renderTree(data, container) {
  const ul = document.createElement('ul');

  data.forEach(item => {
    const li = document.createElement('li');
    const span = document.createElement('span');
    span.textContent = item.label;
    li.appendChild(span);

    if (item.children) {
      span.classList.add('has-children');
      span.addEventListener('click', function() {
        this.parentElement.classList.toggle('expanded');
      });
      renderTree(item.children, li);
    }

    ul.appendChild(li);
  });

  container.appendChild(ul);
}

// 调用方式
const menuContainer = document.getElementById('menu');
renderTree(treeData, menuContainer);

CSS样式建议

ul {
  list-style: none;
  padding-left: 20px;
}

li {
  cursor: pointer;
  margin: 5px 0;
}

.has-children::before {
  content: '+ ';
  color: #666;
}

li.expanded > .has-children::before {
  content: '- ';
}

li > ul {
  display: none;
}

li.expanded > ul {
  display: block;
}

动态加载优化

对于大型树形结构,可采用懒加载方式:

span.addEventListener('click', async function() {
  if (!this.parentElement.classList.contains('loaded') && item.childrenUrl) {
    const res = await fetch(item.childrenUrl);
    item.children = await res.json();
    renderTree(item.children, this.parentElement);
    this.parentElement.classList.add('loaded');
  }
  this.parentElement.classList.toggle('expanded');
});

交互增强方案

添加键盘导航支持:

menuContainer.addEventListener('keydown', (e) => {
  const focused = document.activeElement;
  if (e.key === 'ArrowRight') {
    focused.parentElement.classList.add('expanded');
  }
  if (e.key === 'ArrowLeft') {
    focused.parentElement.classList.remove('expanded');
  }
});

性能注意事项

  1. 超过1000个节点时建议使用虚拟滚动
  2. 深层嵌套样式需注意选择器性能
  3. 频繁更新的场景建议使用文档片段(documentFragment)

js实现四层树形菜单

标签: 四层菜单
分享给朋友:

相关文章

如何制作css导航菜单

如何制作css导航菜单

创建基本HTML结构 导航菜单的基础是HTML结构。使用<nav>标签包裹无序列表<ul>,每个菜单项用<li>标签表示,链接用<a>标签。 <…

vue实现菜单

vue实现菜单

使用 Vue 实现菜单 Vue 可以轻松实现动态菜单,通常结合路由和组件化思想。以下是一个基于 Vue 3 和 Vue Router 的菜单实现方案: 基础菜单结构 在 Vue 中,菜单通常是一个…

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 在 Vue 中实现菜单功能可以通过多种方式完成,以下是一些常见的方法: 使用 Vue Router 实现路由菜单 通过 Vue Router 可以轻松实现基于路由的菜单导航…

css制作二级菜单

css制作二级菜单

CSS制作二级菜单的方法 通过纯CSS实现二级菜单主要依赖HTML结构嵌套和CSS的:hover伪类选择器。以下是具体实现方式: HTML结构 <ul class="main-menu"…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

vue实现联动菜单

vue实现联动菜单

实现联动菜单的基本思路 在Vue中实现联动菜单的核心在于数据绑定和事件监听。通过v-model绑定下拉菜单的值,利用watch或computed监听变化,动态更新下一级菜单的选项。 基础实现方法 创…