JavaScript小案例-树形菜单(菜单数据为数组)

菜单层级理论上可以无限多,因为是递归渲染。

gif演示图:
在这里插入图片描述
代码:
树形菜单.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>树形菜单-数组</title><style>* {padding: 0;margin: 0;box-sizing: border-box;font-size: 14px;color: #fff;}body {background-color: #222;}.aside-menu {position: fixed;padding: 20px;width: 300px;height: 700px;background-color: #333;overflow: auto;}ul {list-style: none;}.aside-menu a {display: block;text-decoration: none;height: 30px;line-height: 30px;}.active {color: #00ff30;}.aside-menu a:hover {background-color: #727171;}[data-childs]::after {content: '-';float: right;}.expand::after {content: '+';float: right;}.notdisplay {display: none;}</style>
</head><body><div class="aside-menu"><ul class="menuwrapper"></ul></div><script>// 菜单数据集合let menuArray = [{id: '0',//菜单idname: '树形菜单',//菜单名submenu: [//子菜单集合{id: '0',name: '菜单',submenu: [{id: '0',name: '菜单',submenu: [{id: '0',name: '菜单',submenu: []},{id: '0',name: '菜单',submenu: [{id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []},]},]},]},]},{id: '0',name: '菜单',submenu: [{id: '0',name: '菜单',submenu: []},]},{id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: [{id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: [{id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []},]},]}, {id: '0',name: '菜单',submenu: []}, {id: '0',name: '菜单',submenu: []},]/*** menuData-菜单数组* menuwrapper-当前菜单项包裹盒子* level-菜单层级,L0,L1,L2,...* paddingLeft-当前菜单的子菜单左内边距,制造树形缩进效果* paddingLeftIncrement-每层菜单左内边距增加值,默认20(px)*/function renderMenu(menuData, menuwrapper, level = 0, paddingLeft = 0, paddingLeftIncrement = 20) {if (menuData && menuData.length > 0) {let l = levelmenuwrapper.classList.add(`L${l}`)menuwrapper.style.paddingLeft = `${paddingLeft}px`for (let i = 0; i < menuData.length; i++) {/** * <ul class="menuwrapper">*  <li class="menuitem">*   <a href="#" data-childs="3" class="expand"><span class="active">菜单名</span>::after</a>*   <ul class="notdisplay">*    </ul>*  </li>* </ul>*/const menuItem = document.createElement('li')menuItem.classList.add('menuitem')const link = document.createElement('a')link.href = '#'link.innerHTML = `<span>${menuData[i].name}</span>`menuItem.appendChild(link)menuwrapper.appendChild(menuItem)const submenu = menuData[i].submenuif (submenu.length > 0) {l++link.dataset.childs = submenu.lengthconst submenuWrapper = document.createElement('ul')// 展开折叠图标切换、子菜单显示隐藏切换link.addEventListener('click', () => {link.classList.toggle('expand')link.nextElementSibling.classList.toggle('notdisplay')})paddingLeft = paddingLeftIncrement// 递归渲染子菜单数组renderMenu(submenu, submenuWrapper, l, paddingLeft)menuItem.appendChild(submenuWrapper)}}}}const menuwrapper = document.querySelector('.menuwrapper')// 活跃菜单menuwrapper.addEventListener('click', (e) => {if (e.target.tagName === 'A') {let activeLink = document.querySelector('.active')if (activeLink) activeLink.classList.remove('active')e.target.firstElementChild.classList.add('active')}})// 渲染renderMenu(menuArray, menuwrapper)// 释放菜单数据menuArray = null</script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超越创意,从用户创造内容到AI生成内容的新时代

在这个信息爆炸的时代&#xff0c;内容创作正经历前所未有的变革&#xff0c;其频率和多样性令人瞠目结舌。曾经&#xff0c;我们主要依赖传统媒体&#xff0c;需要专业团队为人们打造内容&#xff0c;这被称为专业生成内容&#xff08;PGC&#xff0c;Professional-generated …

MD5加密算法

1、简介 MD5在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明&#xff0c;经MD2、MD3和MD4发展而来。 MD5将任意长度的“字节串”变换成一个128bit的大整数&#xff0c;并且它是一个不可逆的字符串变换算法&#xff0c;换句话说就是&#xff0c;即使你看到源程序…

IO口电路种类

文章目录 参考1.高速振荡电路&#xff08;时钟IO引脚&#xff09;2.与 GPIO 功能共享的低速振荡电路&#xff08;子时钟IO&#xff09;3.CMOS 滞后输入引脚4.电源输入保护电路5.A/D 转换器 ref (AVRH)带保护电路的电源输入端6.CMOS 电平输出7.CMOS 电平输出&#xff0c;带有模…

sublime text3 设置代码错误提示之php

第一步&#xff1a; ctrlshiftp 输入 install package 并选中 第二步&#xff1a; 输入 sublimelinter-php 第三步&#xff1a; Prefernces> package Settings >Sublimelinter > settings 这里不同按照版本可能不一样 有些可能是 settings User 第四步 完成

Python 变量

视频版教程 Python3零基础7天入门实战视频教程 变量 无论使用什么语言编程&#xff0c;总要处理数据&#xff0c;处理数据就需要使用变量来保存数据。变量就像一个个小容器&#xff0c;用于“盛装”程序中的数据。 再说说&#xff0c;Python的数据类型&#xff0c;有以下六种…

分享一个基于uniapp+springboot技术开发的校园失物招领小程序(源码、lw、调试)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

TPU-MLIR——实现Chatglm2-6B大模型移植部署

TPU-MLIR——实现Chatglm2-6B大模型移植部署 本项目实现BM1684X部署语言大模型ChatGLM2-6B。通过TPU-MLIR编译器将模型转换成bmodel&#xff0c;并采用c代码将其部署到BM1684X的PCIE环境&#xff0c;或者SoC环境。 编译chatglm2-6B模型 1. 下载‘Chat-GLM2-6B’ 2. 对该模型…

谷歌版ChatGPT与旗下邮箱、视频、地图等,实现全面集成!

9月20日&#xff0c;谷歌在官网宣布推出Bard Extensions。借助该扩展用户可在谷歌的Gmail、谷歌文档、网盘、Google 地图、视频等产品中使用Bard。 Bard是谷歌基于PaLM 2大模型&#xff0c;打造的一款类ChatGPT产品&#xff0c;可自动生成文本、代码、实时查询信息等。新的集成…

数据结构与算法(C语言版)P5---栈

1、栈 1.1、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。__进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。__栈中的数据元素遵守__后进先出&#xff08;先进后出&#xff09;__LIFO&#xf…

FPGA原理与结构(12)——FIFO IP核原理学习

系列文章目录&#xff1a;FPGA原理与结构&#xff08;0&#xff09;——目录与传送门 一、FIFO概述 1、FIFO的定义 FIFO是英文First-In-First-Out的缩写&#xff0c;是一种先入先出的数据缓冲器&#xff0c;与一般的存储器的区别在于没有地址线&#xff0c; 使用起来简单&…

BD就业复习第一天

hive 1.分区分桶 在Hive中&#xff0c;分区&#xff08;Partition&#xff09;和分桶&#xff08;Bucketing&#xff09;都是用于数据管理和查询性能优化的技术。它们有不同的用途和特点。 分区&#xff08;Partition&#xff09;&#xff1a; 定义&#xff1a;分区是将数据…

Hexo在多台电脑上提交和更新

文章目录 1.博客搭建2.创建一个新文件夹new&#xff0c;用于上传hexo博客目录3.github上创建hexo分支并设置为默认分支创建hexo分支将hexo分支设置为默认分支 4.进入新建的文件夹中git clone&#xff0c;再上传相关文件至hexo分支1.clone下来的文件夹内应该有个.gitignore文件&…

Springboot部署服务器项目上线

第一步&#xff0c;项目打包&#xff0c;有两种方式 第一种、直接在项目根目录打开终端&#xff0c;输入以下语句即可。如下图&#xff1a; mvn clean package -DskipTests 第二种、在右侧点击 Maven选项&#xff0c;选择鼠标左键双击package选项即可。如下图&#xff1a; 两…

Python 搭建编程环境

一、搭建编程环境 1、下载python 官网&#xff1a;https://www.python.org 2、开始安装 下载安装版本&#xff0c;双击下载的安装包&#xff0c;如下&#xff1a; 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#xff1a; 安装完成后执行下面的操作&#xff0c;判断是否…

面试官:说说Vue 3.0中Treeshaking特性?举例说明一下?

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、是什么 二、如何做 Vue2 项目 Vue3 项目 三、作用 一、是什么 Tree shaking 是一种通过清除多余代码方式来…

974. 和可被 K 整除的子数组

974. 和可被 K 整除的子数组 C代码&#xff1a;哈希表前缀和 typedef struct{int val;int cnt;UT_hash_handle hh; } HashTable;int subarraysDivByK(int* nums, int numsSize, int k){HashTable* head NULL;HashTable* out NULL;int sum 0;int cnt 0;out (HashTable*)ma…

Nginx 的优化思路有哪些?网站的防盗链如何做?附图文说明和完整代码步骤

Nginx 的优化思路有哪些?网站的防盗链如何做?实际工作中有哪些类似的安全经验?通过代码实践一步一步实现,附图文说明和完整代码步骤 实验拓扑图: 实验步骤 1、在Centos01上安装Nginx,设置网站根目录/www使用域名www.huhu.com访问 2、在Centos02上安装DNS使用域名访问Ce…

嵌入式Linux--进程间通讯--消息队列

1.需要知道的问题&#xff1a; 1、如何创建消息队列&#xff08;A\B使用同一个队列通信&#xff09; 2、如何加消息到队列&#xff08;队列是链表&#xff09; 3、如何从队列拿到消息 消息队列&#xff1a; 消息队列&#xff0c;是消息的链接表&#xff0c;存放在内核中。一个…

【数据结构】二叉树的前序遍历(七)

题目&#xff1a;二叉树的前序遍历 题目详情&#xff1a;给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历&#xff1b; 我们先来看几个示例&#xff1a; 输入&#xff1a;root [ 1&#xff0c;null&#xff0c;2&#xff0c;3 ] 输出&#xff1a;[ 1&#xf…

爬虫 — Js 逆向案例二微信公众平台登录

目标网站&#xff1a;https://mp.weixin.qq.com/ 需求&#xff1a;找到密码加密的过程&#xff0c;进行加密 案例分析 1、抓到向服务器发请求的数据包&#xff0c;输入错误的账号和密码 2、找到加密字段 pwd 如果 Search 里面数据太多&#xff0c;也可以在 Initiator 里面查找…