JavaScript递归菜单栏

HTML就一个div大框架

html 复制代码
 <div class="treemenu">

    </div>

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

注释也很清楚哟家人们!

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样式包含了彩色小背景!

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

样式图:

想要假数据的私我

相关推荐
czlczl2002092520 小时前
告别 try-catch 地狱:Spring Boot 全局异常处理 (GlobalExceptionHandler) 最佳实践
java·spring boot·后端
Mr.Jessy1 天前
JavaScript高级:构造函数与原型
开发语言·前端·javascript·学习·ecmascript
白兰地空瓶1 天前
🚀你以为你在写 React?其实你在“搭一套前端操作系统”
前端·react.js
爱上妖精的尾巴1 天前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
Goldn.1 天前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
似水流年QC1 天前
深入探索 WebHID:Web 标准下的硬件交互实现
前端·交互·webhid
陪我去看海1 天前
测试 mcp
前端
speedoooo1 天前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
全栈胖叔叔-瓜州1 天前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
李慕婉学姐1 天前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue