js树状菜单制作

简介: js树状菜单制作
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="./css/tree.css" />
  </head>
  <script src="js/jquery-3.7.1.js"></script>
  <body>
    <div class="treemenu">
 
    </div>
    <script>
      // let ico;
      // let data;
      // let arr = [];
      // 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);
      //    // fun(data);
      //    //arr=返回值
 
      //    function tree_menu(data, pid, arr) {
      //      //先循环一下数据
      //      for (let i = 0; i < data.length; i++) {
      //        //判断data下标的pid是否等于pid
      //        if (data[i].pid == pid) {
      //          //用dtat下标的子节点,继续调用函数
      //          data[i].children = tree_menu(data, data[i].id, []);
      //          //把data下标push进去
      //          arr.push(data[i]);
      //        }
      //      }
      //      //循环 结束返回值
      //      return arr;
      //    }
      //    arr = tree_menu(data, 0, [])
      //    console.log(arr);
      //    //打印一下arr
      //    show_tree(arr)
      //  }
      // };
 
      // // function fun(data) {
      // //   let arr = [];
      // //   for (let i in data) {
      // //     if (data[i].pid == 0) {
      // //           data[i].children = [];
      // //       for (let j in data) {
      // //         if (data[i].id == data[j].pid) {
      // //           data[j].children = [];
      // //           for (let k in data) {
      // //             if (data[j].id == data[k].pid) {
      // //               data[j].children.push(data[k]);
      // //             }
      // //           }
      // //           data[i].children.push(data[j]);
      // //         }
      // //       }
      // //       arr.push(data[i]);
      // //     }
      // //   }
      // //   console.log(arr);
      // // }
 
 
 
 
 
 
      // //渲染
      // function show_tree(arr) {
      //  //渲染里的大盒子
      //  let str = `<div class="tree_wrap">`;
      //  console.log(arr);
      //  //遍历数组
      //  for (let i in arr) {
      //    //判断数组的子级长度大于0
      //    if (arr[i].children.length > 0) {
      //      //渲染
      //      str += `<div class="icon" onclick="Btn(this,${i},arr)"><img class="icons" src="${arr[i].icon}" alt="" />${arr[i].name}<img class="ico" src="${arr[i].ico}" alt="" /></div>
          
      //    <div style="display: none;" class="show">`;
      //    //获取渲染后的元素节点
      //      ico = document.getElementsByClassName('ico');
      //      //显示数组的子级
      //      str += show_tree(arr[i].children);
      //      str += `</div>`;
      //    } else {
      //      //渲染
      //      str += `<div  class="icon"><img src="${arr[i].icon}" alt=""/>${arr[i].name}</div>`;
      //    }
      //  }
      //  //渲染
      //  str += `</div>`;
      //  //渲染
      //  document.getElementsByClassName('treemenu')[0].innerHTML = str;
      //  //返回值
      //  return str;
      // }
      
      // //点击点击
      // function Btn(obj) {
      //  //obj的子级元素
      //  let children = obj.nextElementSibling;
      //  //图片改变时的过渡效果
      //  obj.querySelector('.ico').style.transition = "transform  1s";
      //      //判断子级显示时
      //      if (children.style.display == 'block') {
      //        //让它不显示
      //    children.style.display = 'none';
      //    //同时图片返回到原来的样子
      //    obj.querySelector('.ico').style.transform = "rotate(0deg)";
      //  } else {
      //    //否则显示出来
      //    children.style.display = 'block';
      //    //图片旋转180
      //    obj.querySelector('.ico').style.transform = "rotate(180deg)";
      //  }
      // }
      
      
      
      
      $(document).ready(function() {
          let data;
          let arr = [];
          
          $.ajax({
              url: 'js/tree.json',
              dataType: 'json',
              success: function(response) {
                  data = response;
                  console.log(data);
                  arr = tree_menu(data, 0, []);
                  console.log(arr);
                  show_tree(arr);
              }
          });
          
          function tree_menu(data, pid, arr) {
              for (let i = 0; i < data.length; i++) {
                  if (data[i].pid == pid) {
                      data[i].children = tree_menu(data, data[i].id, []);
                      arr.push(data[i]);
                  }
              }
              return arr;
          }
          
          function show_tree(arr) {
              let str = `<div class="tree_wrap">`;
              
              for (let i = 0; i < arr.length; i++) {
                  if (arr[i].children.length > 0) {
                      str += `<div class="icon" onclick="Btn(this, ${i}, arr)"><img class="icons" src="${arr[i].icon}" alt="" />${arr[i].name}<img class="ico" src="${arr[i].ico}" alt="" /></div>
                              <div style="display: none;" class="show">`;
                      str += show_tree(arr[i].children);
                      str += `</div>`;
                  } else {
                      str += `<div class="icon"><img src="${arr[i].icon}" alt="" />${arr[i].name}</div>`;
                  }
              }
              
              str += `</div>`;
              $('.treemenu').html(str);
              return str;
          }
          
          $(document).on('click', '.icon', function() {
              let children = $(this).next();
              $(this).find('.ico').css('transition', 'transform 1s');
              
              if (children.css('display') == 'block') {
                  // children.css('display', 'none');
            children.hide(2000);
                  $(this).find('.ico').css('transform', 'rotate(0deg)');
              } else {
            children.show(2000);
                  // children.css('display', 'block');
                  $(this).find('.ico').css('transform', 'rotate(180deg)');
              }
          });
      });
    </script>
  </body>
</html>
相关文章
|
JavaScript 前端开发
js树状菜单制作
以下是一个简单的基于JS的树状菜单制作方法:
70 0
|
28天前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
25 1
JavaScript中的原型 保姆级文章一文搞懂
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
103 2
|
24天前
JS+CSS3文章内容背景黑白切换源码
JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
17 0
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
146 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
87 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
79 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
99 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp宿舍管理系统的附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp宿舍管理系统的附带文章源码部署视频讲解等
89 3
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的家政平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的家政平台附带文章源码部署视频讲解等
71 3