用JS做的简单的可折叠的两级树形菜单

下面我将详细讲解使用JS实现一个简单的可折叠两级树形菜单的攻略。

准备工作

首先,我们需要准备一些基本的html和css代码,用于渲染出菜单的样式和结构。下面是一个简单的示例结构:

<div class="menu">
  <ul>
    <li><a href="#">菜单1</a>
      <ul>
        <li><a href="#">子菜单1</a></li>
        <li><a href="#">子菜单2</a></li>
        <li><a href="#">子菜单3</a></li>
      </ul>
    </li>
    <li><a href="#">菜单2</a>
      <ul>
        <li><a href="#">子菜单1</a></li>
        <li><a href="#">子菜单2</a></li>
      </ul>
    </li>
    <li><a href="#">菜单3</a>
      <ul>
        <li><a href="#">子菜单1</a></li>
        <li><a href="#">子菜单2</a></li>
        <li><a href="#">子菜单3</a></li>
        <li><a href="#">子菜单4</a></li>
      </ul>
    </li>
  </ul>
</div>

接下来,我们需要为菜单的展开和折叠添加样式。下面是一个简单的样式示例:

.menu li ul {
  display: none;
}
.menu li.open ul {
  display: block;
}

上述样式中,我们使用了CSS选择器来隐藏所有的子菜单,同时为展开状态的菜单添加了.open类,用于显示对应的子菜单。

实现折叠展开功能

接下来,我们需要使用JS来实现菜单的折叠和展开功能。我们可以通过给菜单添加点击事件来实现这个功能。下面是一个简单的示例:

var menuItems = document.querySelectorAll(".menu > ul > li");
menuItems.forEach(function(menuItem) {
  menuItem.addEventListener("click", function() {
    this.classList.toggle("open");
  });
});

上述代码中,我们首先使用document.querySelectorAll方法来获取所有一级菜单。然后,我们对每个菜单项都添加了一个click事件监听器,在点击菜单项时切换.open类,实现菜单的折叠和展开。

绑定事件监听器

最后一步,我们需要确保菜单项的子菜单也能够折叠和展开。为此,我们需要在子菜单实际展开时,添加事件监听器。下面是一个示例代码:

var subMenuItems = document.querySelectorAll(".menu > ul > li > ul > li");
subMenuItems.forEach(function(subMenuItem) {
  subMenuItem.addEventListener("click", function(event) {
    event.stopPropagation();
  });
});

上述代码中,我们首先使用document.querySelectorAll方法来获取所有二级菜单项。然后,我们对每个子菜单项都添加了一个click事件监听器,通过event.stopPropagation()方法来阻止点击事件冒泡,确保子菜单项的点击行为不会触发父级菜单的折叠或展开行为。

示例说明

上述示例中,展示了一个标准的两级菜单,使用了上述的HTML、CSS和JS代码进行实现。

该示例展示了如何将上述的代码扩展到多级菜单,并添加了更多的样式以实现更好的视觉效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用JS做的简单的可折叠的两级树形菜单 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 微信小程序可滑动月日历组件使用详解

    下面是关于“微信小程序可滑动月日历组件使用详解”的完整攻略: 一、安装 安装这个可滑动月日历组件很简单,只需要使用npm进行安装即可: npm i calendar-month 二、引用组件 在需要使用月日历组件的页面中,引用月日历组件的wxml文件路径,并在js文件中绑定对应的组件属性即可: <!– 日历组件 –> <calendar…

    JavaScript 2023年6月10日
    00
  • js实现防抖(debounce)与节流(throttle)

    防抖(debounce) 一句话概括:防抖是给定一个时间周期,如果触发事件的周期小于该事件(也就是触发过快),则不会触发事件。举个例子:我给定的时间周期是1s,如果我在触发第一次事件后1s内触发该事件,则重新开始计时,直到触发周期大于1s才会执行事件的方法。 function debounce(fn,timeout){ let timer = null re…

    JavaScript 2023年4月24日
    00
  • Javascript实现时间倒计时功能

    下面是Javascript实现时间倒计时功能的完整攻略: 1. 实现方式 实现时间倒计时功能的方式有很多种,这里介绍一种常用的方式:通过计算时间差来实现。 获取目标时间:可以通过以下方式获取目标时间(即倒计时结束时间): const targetTime = new Date(‘2022-01-01T00:00:00’).getTime(); // 以时间戳…

    JavaScript 2023年5月27日
    00
  • 浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用

    下面我来详细讲解“浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用”的完整攻略。 一、什么是 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON 数据格式如下所示: { "name": "Michael", "age"…

    JavaScript 2023年5月27日
    00
  • js传值后台中文出现乱码的解决方法

    下面是详细讲解“js传值后台中文出现乱码的解决方法”的完整攻略: 问题描述 在前端页面使用 JavaScript 传递参数给后台时,中文参数会出现乱码! 根本原因 乱码的出现是因为前端传递参数时,使用了不同的字符集编码。而后台在解析字符时使用的编码集与前端传递的不同,就导致中文字符的解析出现了不一致的问题。 解决方法 下面介绍两条解决办法: 方法一:转码传递…

    JavaScript 2023年5月19日
    00
  • 微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)

    微信小程序中,为了提高用户体验,往往需要对一些按钮或表单组件进行防止多次点击或输入内容多次验证,以避免用户重复提交数据或误操作。这时,我们可以使用函数防抖来实现这些效果。 函数防抖是指在一段时间内,多次触发同一事件,只执行一次函数。具体而言,是在延迟时间内,如果再次触发了同一事件,则清空之前的计时器并重新开始计时,直到延迟时间过去后再触发该事件时才会执行真正…

    JavaScript 2023年6月10日
    00
  • js实现左右轮播图

    下面我将为您讲解如何用Javascript实现左右轮播图。 什么是轮播图? 轮播图是一种视觉效果,用于网站或应用程序中的图片或内容展示。它通常是横向或纵向排列的一组图像,以便用户可以滚动以查看更多内容。 实现方法 1. HTML结构 首先,我们需要创建一个HTML结构,用于保存轮播图的图片,以下是一个简单的示例: <div class="sl…

    JavaScript 2023年6月11日
    00
  • UserData用法总结 lanyu出品

    UserData用法总结 lanyu出品 什么是UserData? UserData 是一种数据结构,它可以用来存储任意类型的数据,并将其附加到 Lua 对象上。在 Lua 中,UserData 可以被视为一个外部对象,类似于指针,但在内部可以存储任何数据。 如何创建 UserData? 假设要给一个对象 obj 附加一个 UserData,并存储一个字符串…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部