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

样式图:

想要假数据的私我

相关推荐
Json_1817901448010 分钟前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库
大数据编程之光16 分钟前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长29 分钟前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
风尚云网33 分钟前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
ExiFengs33 分钟前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj12345678935 分钟前
JDK1.8新增特性
java·开发语言
木子020436 分钟前
前端VUE项目启动方式
前端·javascript·vue.js
GISer_Jing38 分钟前
React核心功能详解(一)
前端·react.js·前端框架
捂月41 分钟前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse