JavaScript递归菜单栏

news2024/9/20 14:27:45

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;
}

样式图:

想要假数据的私我

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

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

相关文章

Linux上如何分析进程内存分配,优化进程内存占用大小

云计算场景下,服务器上内存宝贵,只有尽可能让服务器上服务进程占用更少的内存,方才可以提供更多的内存给虚拟机,卖给云客户。 虚拟化三大件:libvirt、qemu、kvm内存开销不小,可以优化占用更少的内存。如何找到进程内存开销的地方直观重要,以qemu为例说明。 一、查看进…

别让不专业的HR逼走你的人才!人力资源管理应该遵循哪些原则?

优秀的HR能够带领整个人力资源部门为企业招揽人才、培养人才和留住人才&#xff0c;促使人才为企业的业务增长提供支持。而不专业的HR&#xff0c;不仅无法做到这些&#xff0c;还会把企业原有的人才逼走&#xff0c;因为不合适的人力管理也是导致人才离职的原因。所以&#xf…

【C++】前缀和算法专题

目录 介绍 【模版】一维前缀和 算法思路&#xff1a; 代码实现 【模版】二维前缀和 算法思路 代码实现 寻找数组中心的下标 算法思路 代码实现 总结 除自身以外数组的乘积 算法思路 代码实现 和为K的子数组 算法思路 代码实现 和可被整除的K的子数组 算法思…

C++ 操作Git仓库

代码 #include "common.h" #include "args.c" #include "common.c"enum index_mode {INDEX_NONE,INDEX_ADD };struct index_options {int dry_run;int verbose;git_repository* repo;enum index_mode mode;int add_update; };/* Forward declar…

Python零基础详细入门教程

Python零基础详细入门教程可以从以下几个方面展开&#xff0c;帮助初学者系统地学习Python编程&#xff1a; 一、Python基础入门 1. Python简介 Python的由来与发展&#xff1a;Python是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和强大的功能而受到开发者的喜爱…

2024第二十届中国国际粮油产品及设备技术展示交易会

2024第二十届中国国际粮油产品及设备技术展示交易会 时间&#xff1a;2024年11月15-17日 地点&#xff1a; 南昌绿地国际博览中心 展会介绍&#xff1a; 随着国家逐年加大对农业的投入&#xff0c;调整农业产业结构&#xff0c;提高农产品附加值&#xff0c;促进农民增收。…

CRMEB-众邦科技 使用笔记

1.启动项目报错 Unable to load authentication plugin ‘caching_sha2_password’. 参考&#xff1a;http://t.csdnimg.cn/5EqaE 解决办法&#xff1a;升级mysql驱动 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</ar…

超级弱口令检查工具

一、背景 弱口令问题主要源于用户和管理员的安全意识不足&#xff0c;以及为了方便记忆而采用简单易记的密码。这些密码往往仅包含简单的数字和字母&#xff0c;缺乏复杂性和多样性&#xff0c;因此极易被破解。弱口令的存在严重威胁到系统和用户的数据安全&#xff0c;使得攻击…

在局域网中的另一台主机如何访问windows10WSL中的服务

文章目录 1&#xff0c;开启win10 路由功能2&#xff0c;配置转发规则 1&#xff0c;开启win10 路由功能 2&#xff0c;配置转发规则 netsh advfirewall firewall add rule name"Allowing LAN connections" dirin actionallow protocolTCP localport80 netsh interf…

计算机体系结构:缓存一致性ESI

集中式缓存处理器结构&#xff08;SMP&#xff09; 不同核访问存储器时间相同。 分布式缓存处理器结构&#xff08;NUMA&#xff09; 共享存储器按模块分散在各处理器附近&#xff0c;处理器访问本地存储器和远程存储器的延迟不同&#xff0c;共享数据可进入处理器私有高速缓存…

程序员自曝接单:三年时间接了25个单子,收入12万

程序员接单在程序员的副业中并不少见。程序员接单作为一个起步快、门槛低、类型多样的副业选择&#xff0c;一直深受程序员的青睐。就算你没有接触过接单&#xff0c;也一定对接单有过了解。 程序员接单是指程序员通过接取开发者发布的项目或任务来获取收入的一种工作方式。程序…

“八股文”的江湖:助力、阻力还是空谈?深度解析程序员面试的敲门砖

一、引言&#xff1a;八股文的江湖——助力、阻力还是空谈&#xff1f; 1.1 八股文的定义与背景 八股文&#xff0c;原指我国明清时期科举考试的一种应试文体&#xff0c;因其固定模式和空洞内容而备受诟病。在当今的程序员面试中&#xff0c;程序员的“八股文”通常指的是在技…

告别手动操作:这个微信自动化工具你一定要试试!

随着科技的发展&#xff0c;越来越多的自动化工具应运而生&#xff0c;帮助我们轻松管理微信号。 今天&#xff0c;就给大家揭开这个能让微信自动化的工具的神秘面纱&#xff0c;看看它们能为我们的工作带来哪些便利。 1、批量自动加好友 通过个微管理系统&#xff0c;你可以…

【Unity】 HTFramework框架(五十四)Deployment 轻量级资源部署管线

更新日期&#xff1a;2024年7月31日。 Github源码&#xff1a;[点我获取源码] 索引 Deployment 轻量级资源部署管线使用 Deployment一、创建部署配置二、编辑部署配置三、正式开始资源部署步骤一&#xff1a;资源打包步骤二&#xff1a;资源版本构建步骤三&#xff1a;资源版本…

Redis 初步认识

目录 1. 概述 2. 数据结构 3. 使用方式 4. 优势 1. 概述 Redis &#xff08;remote directory server&#xff09;是一个开源的基于内存的数据存储系统&#xff1b; 可以用作数据库缓存和消息队列等各种场景&#xff0c;也是目前最热门的 NoSQL 数据库之一&#xff1b; 早…

java算法递归算法练习-数组之和

简单找个题目练习一下递归算法&#xff0c;输入一组数组&#xff0c;使用递归的方法计算数组之和。其实这个题目&#xff0c;用循环的方式也很简单就能解决&#xff0c;直接循环遍历一下相加就行了&#xff0c;但是我们用来练习一下递归。 先来找基线条件和递归条件 基线条件…

Stable Diffusion AI 绘画 之 ControlNet 插件及其对应模型的下载安装

一、介绍 ControlNet: ControlNet是一种通过添加附加条件来控制扩散模型&#xff08;例如Stable Diffusion&#xff09;的神经网络结构。一般的使用方法是结合Stable Diffusion来做到精准控图。 通过上面的方式&#xff0c;ControlNet 可以重用SD编码器作为一个深度&#xff0…

企业版邮箱如何提升效率

企业邮箱是如何提升企业效率的呢&#xff1f;企业版邮箱通过专业形象、安全性、稳定性、集成能力等优势提升效率&#xff0c;支持高效内部沟通、团队协作、客户关系管理、安全性与合规性&#xff0c;并支持远程工作&#xff0c;是企业必备的高效工具。 一、企业版邮箱的基本功…

【通俗理解】神经网络动力学——从梯度下降到拓扑结构的桥梁

【通俗理解】神经网络动力学——从梯度下降到拓扑结构的桥梁 神经网络与动力学的类比 你可以把神经网络看作是一个“城市”&#xff0c;其中的神经元是“居民”&#xff0c;他们通过连接&#xff08;道路&#xff09;交互。而动力学则是一个“交通分析师”&#xff0c;它研究居…

【MySQL】事务 【下】{重点了解读-写 4个记录隐藏列字段 undo log日志 模拟MVCC Read View sel}

文章目录 1.MVCC数据库并发的场景重点了解 读-写4个记录隐藏列字段 2.理解事务undo log日志mysql日志简介 模拟MVCC 3.Read Viewselect lock in share modeMVCC流程RR与RC 1.MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是…