js实现基本的树状菜单

一、实现效果

二、 html代码

  <div class="tree">
      <ul>
        <li class="treeFirst">
          <span class="caret" id="5000">规划计划</span>
          <ul class="nested">
            <li><span id="5001">年度工作计划</span></li>
          </ul>
        </li>
        <li class="treeFirst">
          <span id="5002">Node 2</span>
          <ul class="nested">
            <li>
              <span id="5003">Child 1</span>
              <ul class="nested">
                <li><span id="5004">G1</span></li>
                <li><span id="5005">G2</span></li>
              </ul>
            </li>
            <li>
              <span id="5006">Child 2</span>
              <ul class="nested">
                <li><span id="5007">G1</span></li>
                <li><span id="5008">G2</span></li>
              </ul>
            </li>
          </ul>
        </li>
        <li class="treeFirst">
          <span id="5009">规划计划</span>
          <ul class="nested">
            <li><span id="5010">年度工作计划</span></li>
          </ul>
        </li>
        <li class="treeFirst">
          <span id="5011">Node 2</span>
          <ul class="nested">
            <li>
              <span id="5012">Child 1</span>
              <ul class="nested">
                <li><span id="5013">Child 1</span></li>
                <li><span id="5014">Child 1</span></li>
              </ul>
            </li>
            <li>
              <span id="5015">Child 2</span>
              <ul class="nested">
                <li>
                  <span id="5016">Child 2</span>
                  <ul class="nested">
                    <li><span id="5017">Child 1</span></li>
                    <li><span id="5018">Child 1</span></li>
                  </ul>
                </li>
                <li>
                  <span id="5019">Child 2</span>
                  <ul class="nested">
                    <li><span id="5020">Child 1</span></li>
                    <li><span id="5021">Child 1</span></li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </li>
      </ul>
    </div>

三、js代码(所有备注已经添加)

<script>
      // 当文档加载完成后执行以下代码
      $(document).ready(function () {
        // 对所有class为"treeFirst"的元素中的每个span元素执行以下代码
        $(".treeFirst span").each(function () {
          // 如果当前span元素的兄弟元素中有class为"nested"的ul元素
          if ($(this).siblings("ul.nested").length > 0) {
            // 给当前span元素添加class为"caret",用于表示该元素可以展开或折叠
            $(this).addClass("caret");
          }
        });
        // 创建一个URLSearchParams对象,用于获取URL中的查询参数
        var urlParams = new URLSearchParams(window.location.search);
        // 从URL查询参数中获取名为"id"的值,并将其赋给变量id
        var id = urlParams.get("id");

        // 选取id与变量id的值匹配的元素
        $("#" + id)
          // 选取匹配元素的所有祖先元素中class为"nested"的元素
          .parents(".nested")
          // 给选取的元素添加class为"active",用于表示该元素为展开状态
          .addClass("active")
          // 选取匹配元素的前一个class为"caret"的兄弟元素
          .prev(".caret")
          // 给选取的元素添加class为"caret-down",用于表示该元素为展开状态
          .addClass("caret-down");

        // 对所有class为"caret"的元素添加点击事件的处理函数
        $(".caret").click(function () {
          // 切换当前点击的元素的class为"caret-down",用于切换展开或折叠状态
          $(this).toggleClass("caret-down");
          // 切换当前点击的元素的兄弟元素中class为"nested"的元素的class为"active",用于切换展开或折叠状态
          $(this).siblings(".nested").toggleClass("active");
        });
      });
    </script>

四、样式代码

 .tree {
        font-family: Arial, sans-serif;
      }

      .tree ul {
        list-style-type: none;
        padding-left: 20px;
      }

      .tree ul ul {
        margin-top: 5px;
        display: none;
      }

      .tree li {
        margin: 0;
        padding: 0 12px;
        line-height: 20px;
        color: #333;
        margin-top: 15px;
      }

      .tree li i {
        margin-right: 5px;
      }

      .tree li:last-child {
        padding-bottom: 5px;
      }

      .tree .caret {
        cursor: pointer;
      }

      .tree .caret::before {
        content: "";
        background-image: url("./folder.gif");
        background-repeat: no-repeat;
        background-size: contain;
        display: inline-block;
        width: 16px;
        height: 16px;
        margin-right: 6px;
      }

      .tree .caret-down::before {
        background-image: url("./folder_open.gif");
      }

      .tree .nested {
        display: none;
      }
      .nested li {
        text-align: left;
      }
      .tree .active {
        display: block;
      }

五、使用场景

根据传过来的id,树状保持默认展开,可作为左侧菜单使用

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Power yellow¥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值