JavaScript+CSS实现的可折叠二级菜单实例

yizhihongxing

下面是“JavaScript+CSS实现的可折叠二级菜单实例”的完整攻略。

1. 实现思路

该二级菜单实例的实现思路如下:

  1. 初始状态二级菜单处于收缩状态,点击主菜单可以展开或关闭对应的二级菜单。

  2. 主菜单和二级菜单分别定义为一组HTML结构,通过CSS样式实现布局和样式。

  3. 通过JavaScript事件绑定实现主菜单点击后对应的二级菜单的展开和收缩。

2. HTML结构

<nav class="menu">
  <ul>
    <li class="has-children">
      <a href="#">主菜单1</a>
      <ul>
        <li><a href="#">子菜单1</a></li>
        <li><a href="#">子菜单2</a></li>
      </ul>
    </li>
    <li class="has-children">
      <a href="#">主菜单2</a>
      <ul>
        <li><a href="#">子菜单3</a></li>
        <li><a href="#">子菜单4</a></li>
      </ul>
    </li>
  </ul>
</nav>

该HTML结构包括一个nav标签,里面有一个无序列表ul,每个li标签表示一个主菜单项,含有一个has-children类,表示该主菜单项有子菜单。每个主菜单项包含一个超链接标签a,点击后可以展开或关闭对应的二级菜单。在每个li标签中,有一个子无序列表ul,表示该主菜单项的二级菜单,里面有多个子菜单项li,每个子菜单项包含一个超链接标签a,用于向对应网页链接。

3. CSS样式

.menu {
  width: 200px;
  border: 1px solid #ccc;
  padding: 10px;
}

.menu > ul {
  list-style: none;
  padding-left: 0;
  margin: 0;
}

.menu a {
  text-decoration: none;
  color: #333;
  display: block;
}

.menu .has-children > a {
  position: relative;
}

.menu .has-children > a:after {
  content: "+";
  display: inline-block;
  font-size: 12px;
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  margin: auto;
  width: 10px;
  height: 10px;
  text-align: center;
  line-height: 10px;
}

.menu .has-children.open > a:after {
  content: "-";
}

.menu .sub-menu {
  list-style: none;
  padding-left: 0;
  margin: 0;
  display: none;
}

.menu .has-children.open > .sub-menu {
  display: block;
  margin: 5px 0 0;
}

该CSS样式中定义了.menu作为二级菜单的容器样式,.menu > ul作为主菜单样式,主菜单项的超链接标签样式为.menu a,具有不同的字体颜色。主菜单项含有子菜单时,会在超链接标签后面出现一个“+”号,表示该主菜单项有子菜单。当主菜单项被点击后,对应的子菜单项将显示出来。对.menu .sub-menu样式的设定,用于定义子菜单的样式,设置了display:none,表示子菜单默认是隐藏状态。

4. JavaScript

const toggleMenu = function() {
  const parentElem = this.parentElement;
  if (parentElem.classList.contains('open')) {
    parentElem.classList.remove('open');
  } else {
    parentElem.classList.add('open');
  }
}

const menuItems = document.querySelectorAll('.menu .has-children > a');
for (let i = 0; i < menuItems.length; i++) {
  menuItems[i].addEventListener('click', toggleMenu);
}

该JavaScript代码通过querySelectorAll选择所有的主菜单超链接,然后通过addEventListener绑定点击事件处理函数toggleMenu。在toggleMenu事件处理函数中,首先获取对应主菜单项的父元素,判断该父元素是否有.open类,如果有则移除该类,表示将子菜单进行收缩;如果没有则添加.open类,表示展开子菜单。

5. 示例说明

示例一

在主菜单1上单击,将会展开主菜单1的子菜单。

<li class="has-children">
  <a href="#">主菜单1</a>
  <ul>
    <li><a href="#">子菜单1</a></li>
    <li><a href="#">子菜单2</a></li>
  </ul>
</li>

在该例子中,单击主菜单1后,将展开主菜单1下的子菜单。

示例二

在主菜单2上双击,将会让主菜单2的子菜单收缩。

<li class="has-children">
  <a href="#">主菜单2</a>
  <ul>
    <li><a href="#">子菜单3</a></li>
    <li><a href="#">子菜单4</a></li>
  </ul>
</li>

在该例子中,双击主菜单2后,将关闭主菜单2下子菜单的展开状态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript+CSS实现的可折叠二级菜单实例 - Python技术站

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

相关文章

  • 解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)

    下面是解决Vue中this.$forceUpdate()处理页面刷新问题的攻略,步骤如下: 1. 确认是否需要使用this.$forceUpdate() Vue.js是一款响应式的框架,因此它能准确地知道所需渲染的组件和组件之间的数据关系。当你的模板中发生数据变化时,Vue会自动侦测到并更新视图,不需要手动触发刷新。但是有时候我们面临的问题需要手动强制刷新页…

    Vue 2023年5月29日
    00
  • VUE实现强制渲染,强制更新

    为了让Vue组件显示更加准确、更新更加迅速,我们可以实现强制渲染和强制更新。下面是实现这些功能的完整攻略: 强制渲染 强制渲染是指通过使用Vue的$forceRender方法,强制重新渲染(重绘)一个组件,使该组件的所有子组件都重新渲染。这种方法适用于需要重绘整个组件树的情况,例如在组件被销毁和重新安装时。下面是一个示例: export default { …

    Vue 2023年5月29日
    00
  • vue深度监听(监听对象和数组的改变)与立即执行监听实例

    Vue.js 是一个非常流行的前端框架,它提供了很多方便的数据监听和响应式机制,其中包括深度监听和立即执行监听。下面将详细介绍这两种监听方式的用法和示例。 Vue 深度监听 Vue 的深度监听可以在属性改变时触发回调函数,包括对象和数组的改变。Vue 提供了 watch API 来实现深度监听,它可以监听一个对象的所有属性变化,同时也可以监听数组的变化。下面…

    Vue 2023年5月28日
    00
  • 一篇文章看懂Vue组合式API

    一篇文章看懂Vue组合式API 什么是Vue组合式API Vue组合式API是Vue 3中新增的语法特性,它提供了一种新的组件编写方式,能够更加优化组件的可复用性、可维护性和可测试性。与Vue 2.x的Options API相比,Vue 3.x的组合式API更加灵活且容易理解使用。本文将介绍Vue组合式API的使用方法。 setup函数 在使用Vue组合式A…

    Vue 2023年5月28日
    00
  • Vue Cli3 创建项目的方法步骤

    Vue Cli3 是 Vue.js 的一个脚手架工具,提供了快速创建 Vue.js 项目的能力。下面将详细讲解 Vue Cli3 创建项目的方法步骤。 第一步:安装 Node.js Vue Cli3 需要依赖 Node.js 环境,所以必须先安装 Node.js。在终端中输入以下命令进行安装: $ curl -o- https://raw.githubuse…

    Vue 2023年5月28日
    00
  • Springboot与vue实现文件导入方法具体介绍

    下面是“Springboot与Vue实现文件导入方法”的完整攻略。 1. 前置条件 在介绍如何实现文件导入功能之前,需要确保以下条件已经满足: 已经安装好Springboot和Vue开发环境; 熟悉Springboot和Vue的基本开发知识; 掌握基本的前端与后端的交互方式和Ajax异步请求的使用; 2. 实现思路 文件导入功能的实现思路如下: 前端页面中使…

    Vue 2023年5月27日
    00
  • Vue中的同步和异步调用顺序详解

    Vue中的同步和异步调用顺序详解 前言 在Vue的开发过程中,同步和异步调用顺序经常是我们需要关注的问题。本篇文章主要讲解同步和异步调用的概念,并通过示例来详细说明Vue中同步和异步调用的顺序。 同步和异步调用的概念 在JavaScript中,同步调用是指函数按照代码的顺序依次执行,执行完一个函数后才能执行下一个函数。异步调用则是指函数不按照代码的顺序执行,…

    Vue 2023年5月28日
    00
  • 详解Vue的七种传值方式

    详解Vue的七种传值方式 在Vue中,数据传递是开发中不可避免的问题,而Vue又提供了多种传值方式,方便我们进行数据的双向绑定和组件之间的交互。本文将详细介绍Vue的七种传值方式,并通过示例代码让你了解它们的使用方法及各自的优缺点。 父组件向子组件传值 1. props 最常见的方式就是通过props向子组件传值。使用该方式,父组件可以将需要传递的数据作为p…

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