当前位置:首页 > 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;
}

动态加载优化

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

js实现四层树形菜单

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)

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

相关文章

css制作横向菜单

css制作横向菜单

使用 Flexbox 制作横向菜单 Flexbox 是制作横向菜单的现代方法,代码简洁且兼容性好。以下是一个基本实现: <nav class="horizontal-menu"> &…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

vue实现抽屉菜单

vue实现抽屉菜单

Vue 实现抽屉菜单 使用 Vue 过渡和 CSS 实现 通过 Vue 的过渡组件和 CSS 实现抽屉菜单的动画效果。定义一个布尔值控制抽屉的显示和隐藏,利用 CSS 过渡效果实现平滑的滑动。 &l…

vue实现菜单效果

vue实现菜单效果

Vue实现菜单效果的方法 基础菜单实现 使用Vue的v-for指令和v-show/v-if可以快速实现基础菜单。通过数据驱动的方式渲染菜单项,结合事件处理实现交互。 <template>…

vue实现动态菜单

vue实现动态菜单

Vue 动态菜单实现方法 基于路由配置的动态菜单 在 Vue 项目中,可以利用路由配置自动生成菜单。路由配置通常包含 path、name、meta 等字段,其中 meta 可以存储菜单标题、图标等信息…

vue实现垂直菜单

vue实现垂直菜单

实现垂直菜单的基本结构 在Vue中实现垂直菜单,通常需要使用<ul>和li>标签构建菜单项,结合Vue的v-for指令动态渲染菜单数据。以下是一个基础模板: <templat…