JS三级可折叠菜单实现方法

JS三级可折叠菜单是一种常见的页面交互效果,下面提供一种实现方法。

实现方法

1. HTML结构

首先,需要在HTML结构中定义菜单所需要的层级结构,示例代码如下:

<ul id="menu">
  <li>
    <a href="#">一级菜单1</a>
    <ul>
      <li>
        <a href="#">二级菜单1-1</a>
        <ul>
          <li>
            <a href="#">三级菜单1-1-1</a>
          </li>
          <li>
            <a href="#">三级菜单1-1-2</a>
          </li>
        </ul>
      </li>
      <li>
        <a href="#">二级菜单1-2</a>
        <ul>
          <li>
            <a href="#">三级菜单1-2-1</a>
          </li>
          <li>
            <a href="#">三级菜单1-2-2</a>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>
    <a href="#">一级菜单2</a>
    <ul>
      <li>
        <a href="#">二级菜单2-1</a>
        <ul>
          <li>
            <a href="#">三级菜单2-1-1</a>
          </li>
          <li>
            <a href="#">三级菜单2-1-2</a>
          </li>
        </ul>
      </li>
      <li>
        <a href="#">二级菜单2-2</a>
        <ul>
          <li>
            <a href="#">三级菜单2-2-1</a>
          </li>
          <li>
            <a href="#">三级菜单2-2-2</a>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

此处仅展示了一个简单的三级菜单,实际应用中可以根据需要定义更深层次的菜单。

2. CSS样式

接下来,需要定义CSS样式来控制菜单的显示与隐藏。通过控制菜单的高度、设置overflow属性为hidden,可以达到“折叠”菜单的效果。

#menu ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

#menu li {
  position: relative;
}

#menu ul ul {
  position: absolute;
  top: 0;
  left: 100%;
  height: 0;
  overflow: hidden;
}

#menu li:hover ul {
  height: auto;
}

此处所展示的样式仅控制了菜单的基本显示与隐藏效果,实际应用中可以根据需要增加更多样式进行美化。

3. JavaScript逻辑

最后,需要定义JavaScript逻辑来控制菜单的展开与收缩。通过为菜单添加事件监听器,在用户鼠标移入/移出时设置相应的类,从而控制菜单的显示与隐藏。

var menu = document.getElementById("menu");

function setupMenu() {
  var lis = menu.getElementsByTagName("li");
  for (var i = 0; i < lis.length; i++) {
    var li = lis[i];
    var ul = li.getElementsByTagName("ul")[0];
    if (ul) {
      li.className += " has-children";
      ul.className += " hidden";
      li.onmouseover = function() {
        this.className += " hover";
        var ul = this.getElementsByTagName("ul")[0];
        if (ul) {
          ul.className = ul.className.replace("hidden", "");
        }
      };
      li.onmouseout = function() {
        this.className = this.className.replace("hover", "");
        var ul = this.getElementsByTagName("ul")[0];
        if (ul) {
          ul.className += " hidden";
        }
      };
    }
  }
}

setupMenu();

此处所展示的JavaScript逻辑控制了菜单的基本交互效果,实际应用中可以根据需要增加更多细节的处理。

示例说明

下面提供两条示例说明,以帮助读者更加深入理解这种实现方法。

示例一

在绑定事件时,可以使用事件委托的方式,将事件绑定到菜单的上级元素上,从而避免每个菜单项都需要绑定事件监听器的问题。示例代码如下:

var menu = document.getElementById("menu");

function setupMenu() {
  menu.onmouseover = function(event) {
    var target = event.target || event.srcElement;
    var li = target.closest("li");
    if (li) {
      var ul = li.getElementsByTagName("ul")[0];
      if (ul) {
        ul.className = ul.className.replace("hidden", "");
      }
    }
  };
  menu.onmouseout = function(event) {
    var target = event.target || event.srcElement;
    var li = target.closest("li");
    if (li) {
      var ul = li.getElementsByTagName("ul")[0];
      if (ul) {
        ul.className += " hidden";
      }
    }
  };
}

setupMenu();

此处所展示的代码使用了closest方法来查找最近的父级li元素,从而将事件绑定到“一级菜单”上,避免了“二级菜单”和“三级菜单”都需要绑定事件监听器的问题。

示例二

为了提高用户体验,我们可以通过CSS3动画来实现菜单的展开与收缩效果。示例代码如下:

#menu li ul {
  -webkit-transition: all 0.3s ease-out;
     -moz-transition: all 0.3s ease-out;
       -o-transition: all 0.3s ease-out;
          transition: all 0.3s ease-out;
}

#menu li.hover > ul {
  height: auto;
}

此处所展示的代码为菜单的展开和收缩增加了0.3s的渐入渐出动画效果,在菜单整体布局较为简单的情况下可以大大提高用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS三级可折叠菜单实现方法 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue Element UI + OSS实现上传文件功能

    下面是“Vue Element UI + OSS实现上传文件功能”的完整攻略。 准备工作 1.安装Vue CLI并创建Vue项目。 2.引入Element UI和Aliyun OSS SDK。 <!– index.html –> <!DOCTYPE html> <html lang="en"> &l…

    Vue 2023年5月28日
    00
  • 解决vue初始化项目一直停在downloading template的问题

    解决Vue初始化项目一直停在downloading template的问题 当我们在使用Vue CLI 3初始化项目时,有时会遇到这样的问题:在命令行中输入vue create project-name后,一直停留在downloading template这一步,无法继续下去,这说明我们无法下载Vue的模板文件导致项目初始化失败。此时我们需要进行以下步骤,以…

    Vue 2023年5月27日
    00
  • vue实现点击按钮下载文件功能

    以下是详细讲解“vue实现点击按钮下载文件功能”的完整攻略: 1. 准备工作 在实现点击按钮下载文件功能之前,我们需要先完成以下准备工作: 1.1 确定下载文件的文件路径 要下载的文件必须事先确定好其文件路径。在Vue项目中一般会将需要下载的文件放在public目录下,因为这些文件可以直接被访问。 1.2 安装file-saver库 在Vue项目中,文件下载…

    Vue 2023年5月28日
    00
  • 基于vue,vue-router, vuex及addRoutes进行权限控制问题

    接下来我将为你详细讲解基于vue、vue-router、vuex及addRoutes进行权限控制的完整攻略。 理论基础 在进行权限控制前,需要先建立一些理论基础。在Web应用中,常见的权限控制方式有三种: 基于角色的访问控制(Role-Based Access Control, RBAC):将角色赋予用户或用户组,并将角色与资源进行关联,从而控制用户对资源的…

    Vue 2023年5月28日
    00
  • Vue中this.$nextTick的作用及用法

    Vue.js 是一个流行的JavaScript框架,结合了大量的模板语法、组件化和数据响应机制等特性,方便开发者构建交互式的Web应用。而this.$nextTick则是Vue.js框架中的一个非常重要的API,用于解决Vue更新DOM所带来的异步问题,下面就来详细讲解Vue中this.$nextTick的作用及用法: 什么是this.$nextTick? …

    Vue 2023年5月28日
    00
  • 详解如何制作并发布一个vue的组件的npm包

    制作并发布一个 Vue 的组件 npm 包,流程大致如下: 初始化项目并创建组件 编写组件原型并打包 发布 npm 包 下面将详细解释这些步骤。 初始化项目并创建组件 将组件发布到 npm 前,首先需要初始化本地项目,并创建一个 Vue 组件。我们可以使用 Vue CLI 工具来初始化项目,具体步骤如下: 安装 Vue CLI:npm install -g …

    Vue 2023年5月28日
    00
  • vue实现pdf导出解决生成canvas模糊等问题(推荐)

    使用Vue实现PDF导出功能需要涉及到以下几个步骤: 安装依赖 npm install jspdf jspdf-autotable –save 引入jspdf和jspdf-autotable包 import jsPDF from ‘jspdf’ import ‘jspdf-autotable’ 编写导出PDF的方法 exportPdf() { // 新建一…

    Vue 2023年5月27日
    00
  • 第一次在Vue中完整使用AJAX请求和axios.js的实战记录

    下面是“第一次在Vue中完整使用AJAX请求和axios.js的实战记录”的完整攻略: 简介 本攻略旨在帮助Vue初学者了解如何在Vue项目中使用AJAX请求和axios.js进行数据交互,涉及到AJAX的基本概念和使用方法,以及axios.js的安装和使用。 AJAX基本概念 AJAX全称为Asynchronous JavaScript and XML,即…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部