当前位置: 首页 > news >正文

JavaScript递归菜单栏

HTML就一个div大框架

 <div class="treemenu"></div>

重中之重的JavaScript部分他来啦!

  注释也很清楚哟家人们!

let data;
let arr = [];
let cons;let xhr = new XMLHttpRequest();
// 设置请求方式和请求地址
xhr.open('get', './js/tree.json', true);
// 发送请求
xhr.send();
// 接收返回的响应数据
xhr.onreadystatechange = function () {if (xhr.readyState == 4 && xhr.status == 200) {data = JSON.parse(xhr.responseText);// 调用展示商品的函数// console.log(data);function inn(data, pid, arr) {for (let i = 0; i < data.length; i++) {if (data[i].pid == pid) {// 递归调用,构建当前节点的子节点数组data[i].children = inn(data, data[i].id, []);// 将当前节点加入到父节点的 children 数组中arr.push(data[i]);}}return arr;}arr = inn(data, 0, []);console.log(arr);rendertree(arr);}
};function rendertree(data) {let str = `<div class="tree_wrap">`; // 开始构建树的容器for (let i = 0; i < data.length; i++) {if (data[i].children.length > 0) { // 如果当前节点有子节点str +=`<div onclick="show(this)" class="tree_flex"> <img src="${data[i].icon}" alt="" class="con">${data[i].name} <span><img src="./img/jtt.png" alt="" class="cons"></span></div><div style="display:none">`; // 添加可展开的节点和子节点的容器str += rendertree(data[i].children); // 递归渲染子节点str += `</div>`;} else { // 如果当前节点没有子节点str +=`<div class="tree_left"><img src="${data[i].icon}" alt="" class="con">${data[i].name}</div>`; // 直接添加叶子节点}}str += `</div>`;    // 关闭树的容器document.getElementsByClassName('treemenu')[0].innerHTML = str; // 将整棵树渲染到页面上的指定位置return str; // 返回树的 HTML 字符串
}// 获取所有类名为 'tree_left' 的元素集合
let tree_left = document.getElementsByClassName('tree_left');// 定义展开或折叠子节点的函数
function show(obj) {let children = obj.nextElementSibling; // 获取当前节点的下一个兄弟元素,即子节点容器obj.querySelector('.cons').style.transition = "transform 1s"; // 设置箭头图标的过渡效果为1秒// 判断子节点容器的显示状态if (children.style.display == 'block') {// 如果子节点容器是显示的,则隐藏它children.style.display = 'none'; // 隐藏子节点容器obj.querySelector('.cons').style.transform = "rotate(0deg)"; // 将箭头图标旋转角度设为0度,折叠状态} else {// 如果子节点容器是隐藏的,则显示它children.style.display = 'block'; // 显示子节点容器obj.querySelector('.cons').style.transform = "rotate(180deg)"; // 将箭头图标旋转角度设为180度,展开状态obj.querySelector('.cons').style.transition = "transform 1s"; // 设置箭头图标的过渡效果为1秒}
}

CSS样式包含了彩色小背景!

body {margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);background-size: 400% 400%;animation: gradientAnimation 15s ease infinite;font-family: Arial, sans-serif;user-select: none;
}@keyframes gradientAnimation {0% {background-position: 0% 50%;}50% {background-position: 100% 50%;}100% {background-position: 0% 50%;}
}.treemenu {width: 30%;height: 700px;font-weight: 700;}.con {width: 15px;height: 15px;float: left;margin-top: 7px;
}.tree_wrap {margin-left: 20px;line-height: 30px;
}.tree_wrap :hover {
color: blue;
}.cons {width: 15px;height: 15px;margin-left: 2%;margin-top: 7px;
}

样式图:

想要假数据的私我

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GPT对话代码库——结构体与全局变量的比较,使用结构体的好处
  • 【C++高阶】哈希:全面剖析与深度学习
  • 基于N32L406的EasyLogger日志库移植教程
  • vue如何在axios.js中跳转页面(解决办法)
  • LeetCode541 反转字符串 II
  • Java----反射
  • 英伟达推出新中国特供版芯片B20:挑战与机遇并存
  • OD C卷 - 王者荣耀游戏分组
  • 顺序表,链表,顺序栈,顺序循环队列,链式队列的基本操作
  • 为什么说脱离决策的数据分析都是无用功
  • 【AI落地应用实战】DAMODEL深度学习平台部署+本地调用ChatGLM-6B解决方案
  • Android Java和Kotlin的目标JVM版本不一致
  • 数据炼金术:在sklearn中进行增量特征合成的秘诀
  • 弱网常见问题
  • 25考研计算机组成原理复习·3.1/3.2 存储器概述/主存储器
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【Leetcode】104. 二叉树的最大深度
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Bytom交易说明(账户管理模式)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Hexo+码云+git快速搭建免费的静态Blog
  • k8s如何管理Pod
  • node 版本过低
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微服务框架lagom
  • 阿里云服务器如何修改远程端口?
  • 带你开发类似Pokemon Go的AR游戏
  • 函数计算新功能-----支持C#函数
  • #if等命令的学习
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • $forceUpdate()函数
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (二) 初入MySQL 【数据库管理】
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (分布式缓存)Redis哨兵
  • (剑指Offer)面试题34:丑数
  • (十二)Flink Table API
  • (十三)Maven插件解析运行机制
  • (数据结构)顺序表的定义
  • (一)Docker基本介绍
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net Signalr 使用笔记
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET中使用Protobuffer 实现序列化和反序列化
  • :如何用SQL脚本保存存储过程返回的结果集
  • ;号自动换行
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [Apio2012]dispatching 左偏树
  • [BUUCTF 2018]Online Tool