使用递归写树形结构

我们可以使用递归地方法写树形菜单栏,树形菜单栏的应用场景有很多,使用递归地方法可以快速地转化数据格式。使用for循环,一次只能到一层,要嵌套,并且数据不一定有几层,但递归的方法可以无限的转化数据格式。

下面我们要写一个树形结构,要求打开页面只有父级显示在页面上,子级默认隐藏,只有有子级的父级才会有下拉箭头,并且鼠标放在选中的内容上有hover效果,选中的元素会和其他的元素有明显的区别。点击父级展开下拉箭头颠倒,子级出现。

HTML中只写了一个结构:

<div class="content">
		</div>

css样式:

<style>
			* {
				margin: 0;
				padding: 0;
			}

			.content {
				width: 200px;
				background-color: #535d62;
			}

			.aline {
				width: 200px;
				height: 40px;
				display: flex;
				line-height: 40px;
			}

			.pic {
				width: 20px;
				height: 20px;
				margin-left: 26px;
				margin-top: 10px;

			}

			.text {
				font-size: 14px;
				color: #ffffff;
				display: flex;
				margin-left: 20px;
			}

			.down {
				width: 16px;
				height: 16px;
				margin-top: 15px;
				margin-left: 50px;
				/*设置所有动画的效果:0.3s 淡出效果*/
				transition: all .3s ease-out;
			}

			/* Hover样式 */
			.aline:hover {
				background-color: #7d7d7d;
				transition: 0.5s;
			}

			.aline:hover .text {
				color: #88baa7;
				transition: 0.5s;
			}

			.aline.selected {
				background-color: #7d7d7d;
				color: #88baa7;
			}

			.childs {
				display: none;
			}

			.down-rotate {
				transform: rotate(180deg);
				/* 可选的过渡效果 */
				transition: transform 0.3s ease;
			}
		</style>

js代码:

// 递归的数据格式转化 
			// 参数: data 表示扁平数据,一维的全部数据
			// 参数: pid 表示数据的父级id 一级数据pid=0
			// 参数: arr 数组,函数出来过后将其返回至调用函数位置,函数处理的结果
			function treeData(data, pid, arr = []) {
				// for循环 遍历数组 
				for (let i in data) {
					// 判断数据的pid是否等于父级的id
					if (data[i].pid == pid) {
						// 把数据放在arr中
						arr.push(data[i]);
						// 把子元素放在父级元素中
						arr[arr.length - 1].children = treeData(data, data[i].id)
					};
				};
				// 返回arr的值
				return arr;
			};
			// 声明变量tree_data 等于所有的父级元素
			let tree_data = treeData(arr, 0);
			console.log(tree_data);

			function tree_menu(data) {
				// 整个背景
				let str = '<div class="content">';
				// for循环遍历数组
				for (let i = 0; i < data.length; i++) {

					// 判断是否有子级
					if (data[i].children.length > 0) {
						// 当有子元素时拼接名称和下拉箭头和拼接图标
						str += `
						<div class="aline" onclick="click_show(this)">
						<img class="pic" src="${data[i].img}" alt="" /><div class="text">${data[i].name}
						<img class="down" src="img/向下箭头_小.png" alt="" />`
						str += `</div>
						</div>
						<div class="childs" style="display:none">
						${tree_menu(data[i].children)}
						</div>`
					} else {
						// 否则只拼接名称
						str += `<div class="aline">
				<img class="pic" src="${data[i].img}" alt="" />
				<div class="text">${data[i].name}</div>
				</div>`
					};
				};
				str += '</div>'
				return str;
			};
			// 在页面内输入
			document.write(tree_menu(tree_data));

			// 用于跟踪当前选中的元素
			let option = null;

			function click_show(e) {
				// 获取下一个同级元素,即包含子项的div
				let childsDiv = e.nextElementSibling;
				// 当前被点击的.aline元素
				let alineElement = e;

				// 如果已经有一个元素被选中,则移除其.selected类
				if (option) {
					option.classList.remove('selected');
				};
				// 更新当前选中的元素
				option = alineElement;

				// 判断如果数据和数据的名称是否为childs
				if (childsDiv && childsDiv.className === 'childs') {
					// 获取当前父元素内的箭头图片
					let downArrow = e.querySelector(".down");

					// 切换子菜单的显示状态
					if (childsDiv.style.display === 'none') {
						// 让子级显示
						childsDiv.style.display = 'block';
						// 添加被选中的样式
						alineElement.classList.add('selected');
						// 旋转箭头
						downArrow.classList.add("down-rotate");
					} else {
						childsDiv.style.display = 'none';
						// 重置箭头
						downArrow.classList.remove("down-rotate");
					};
				};
			};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java基于ssm+vue 病人跟踪治疗信息管理系统

1病人功能模块 病人登录进入病人跟踪治疗信息管理系统可以查看首页、个人中心、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、病人治疗状况管理等内容。 病例采集管理&#xff0c;在病例采集管理页面可以查看账号、姓名、住院号、入院时间、病…

git 禁止dev合并到任何其他分支

创建 pre-merge-commit 钩子 导航到 Git 仓库的钩子目录&#xff1a; cd /path/to/your/repo/.git/hooks创建或编辑 pre-merge-commit 钩子&#xff1a; 也可以通过指令创建 nano pre-merge-commit在钩子文件中添加以下代码&#xff1a; #!/bin/sh# 获取当前分支名称 curr…

成人职场商务英语学习柯桥外语学校|邮件中的“备注”用英语怎么说?

在英语中&#xff0c;"备注"通常可以翻译为"Notes" 或 "Remarks"。 这两个词在邮件中都很常用。例如: 1. Notes Notes: 是最通用和最常见的表达&#xff0c;可以用在各种情况下&#xff0c;例如&#xff1a; 提供有关电子邮件内容的附加信息 列…

hive中cast()函数

CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式&#xff0c;它包括用AS关键字分隔的源值和目标数据类型。 语法&#xff1a;CAST (expression AS data_type) expression&#xff1a;任何有效的SQServer表达式。 AS&#xff1a;用…

软降工程学系统实现

一、程序编码 程序编码是设计的继续&#xff0c;将软件设计的结果翻译成用某种程序设计语言描述的源代码。 程序编码涉及到方法、工具和过程。 程序设计风格和程序设计语言的特性会深刻地影响软件的质量和可维护性。 要求源程序具有良好的结构性和设计风格。 程序设计风格…

2024.7.2作业

1. 梳理笔记(原创&#xff01;&#xff01;&#xff01;) 2.解析代码&#xff1a;分析每一步变量的取值 #include <stdio.h> int main(int argc, char *argv[]) { int a 10; //a10 int b a--; //b10 int c a b 2; //a9 b10 c21 int d (b--…

VisualRules组件功能介绍-计算表格(二)

本章内容 1、计算表格数据回写数据库 2、计算表格数据更新 3、计算表格数据汇总 4、计算表格数据追加 一、计算表格数据回写数据库 计算表格数据回写数据库表。采用遍历计算表格逐条插入数据库表。在具体操作过程可以采用向导方式操作。 先在数据库表中创建tb_user_new表。…

Java语法系列 小白入门参考资料 方法

方法的概念及使用 方法概念 方法出现的原因 在编程中&#xff0c;某段功能的代码可能频繁使用到&#xff0c;如果在每个位置都重新实现一遍&#xff0c;会&#xff1a; 1. 使程序变得繁琐 2. 开发效率低下&#xff0c;做了大量重复性的工作 3. 不利于维护&#xff0c;需要…

Load Tensor to local Nvidia GPU

0. 安装Nvidia驱动 ubuntu24.04的安装非常简单&#xff0c;在安装界面&#xff0c;选择为"图形化和其他硬件安装驱动"&#xff0c;重启后即有原版Nvidia驱动(如图Nvidia X xxx) 1.确定电脑上是否有NvidiaGPU且安装好Nvidia驱动 import torch print(torch.version…

DSSAT作物模建模实践方法

随着数字农业和智慧农业的发展&#xff0c;基于过程的作物生长模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…

BMA580 运动传感器

型号简介 BMA580是博世&#xff08;bosch-sensortec&#xff09;的一款先进的、超小型加速度传感器。具有独特的骨传导语音活动检测功能和先进的功率模式功能&#xff0c;是世界上最小的加速度传感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它专为紧凑型设备&#xff08…

[C++]——同步异步日志系统(1)

同步异步日志系统 一、项⽬介绍二、开发环境三、核心技术四、环境搭建五、日志系统介绍5.1 为什么需要日志系统5.2 日志系统技术实现5.2.1 同步写日志5.2.2 异步写日志 日志系统&#xff1a; 日志&#xff1a;程序在运行过程中&#xff0c;用来记录程序运行状态信息。 作用&…

OpenSSH远程代码执行漏洞 (CVE-2024-6387)

1. 前言 OpenSSH是一套基于安全外壳&#xff08;SSH&#xff09;协议的安全网络实用程序&#xff0c;它提供强大的加密功能以确保隐私和安全的文件传输&#xff0c;使其成为远程服务器管理和安全数据通信的必备工具。 OpenSSH 自 1995 年问世近 20 年来&#xff0c;首次出现了…

基于STM32的卫星GPS路径记录仪

目录 引言环境准备卫星GPS路径记录仪基础代码实现&#xff1a;实现卫星GPS路径记录仪 4.1 数据采集模块4.2 数据处理与分析4.3 存储系统实现4.4 用户界面与数据可视化应用场景&#xff1a;路径记录与分析问题解决方案与优化收尾与总结 1. 引言 卫星GPS路径记录仪通过使用STM…

【基础算法总结】分治—快排

分治—快排 1.分治2.颜色分类3.排序数组4.数组中的第K个最大元素5.库存管理 III 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.分治 分治…

怎么在线批量改图片尺寸?快速在线改图片尺寸的4款工具

目前图片是日常经常会使用的一种内容展示&#xff0c;想要快速的分享图片会在很多不同平台上传使用&#xff0c;通过这种方式让其他人能够获取图片内容。在平台上传图片的时候&#xff0c;经常会限制图片尺寸的大小&#xff0c;如果需要将多张图片改成同一尺寸时&#xff0c;有…

实战项目——用Java实现图书管理系统

前言 首先既然是管理系统&#xff0c;那咱们就要实现以下这几个功能了--> 分析 1.首先是用户分为两种&#xff0c;一个是管理员&#xff0c;另一个是普通用户&#xff0c;既如此&#xff0c;可以定义一个用户类&#xff08;user&#xff09;&#xff0c;在定义管理员类&am…

APKDeepLens:一款针对Android应用程序的安全扫描工具

关于APKDeepLens APKDeepLens是一款针对Android应用程序的安全扫描工具&#xff0c;该工具基于Python开发&#xff0c;旨在扫描和识别Android应用程序&#xff08;APK文件&#xff09;中的安全漏洞。 APKDeepLens主要针对的是OWASP Top 10移动端安全漏洞&#xff0c;并为开发人…

从零开始使用 Docsify 搭建文档站点

引言 在当今的技术环境中&#xff0c;拥有一份易于访问和美观的文档是至关重要的。Docsify 是一个非常适合快速搭建文档站点的工具&#xff0c;它简单易用&#xff0c;且不需要生成静态文件。本文将带你一步步从零开始使用 Docsify 搭建一个文档站点。 1. 安装 Node.js 和 np…

竞赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…