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

下面是“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日

相关文章

  • webpack+vue.js构建前端工程化的详细教程

    下面就给您讲解一下“webpack+vue.js构建前端工程化的详细教程”的完整攻略。 1. 准备工作 首先,我们需要准备一些必要的工具和环境: Node.js环境 全局安装webpack、webpack-cli和vue-cli,可以使用以下命令进行安装: npm install -g webpack webpack-cli vue-cli 2. 创建项目 …

    Vue 2023年5月27日
    00
  • vue.js入门教程之计算属性

    下面是关于“vue.js入门教程之计算属性”的完整攻略: 什么是计算属性 计算属性是Vue.js的一个重要特性,它能够对绑定的数据进行计算,然后返回一个新的值。 Vue.js官网对计算属性的介绍: 计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要message没有发生改变,多次访问计算属性vm.rever…

    Vue 2023年5月27日
    00
  • Vue3 JSX解释器的实现

    下面是“Vue3 JSX解释器的实现”的完整攻略。 1. 了解JSX JSX是一种JavaScript的语法扩展,它可以在JavaScript代码中直接嵌入XML标签和属性,并使用类似HTML的语法格式。Vue3支持使用JSX语法来定义组件模板,其主要实现方式是通过JSX转换器将JSX语法转换为普通的JavaScript语法。在实现Vue3 JSX解释器之前…

    Vue 2023年5月27日
    00
  • 详解Vue3的响应式原理解析

    详解Vue3的响应式原理解析 什么是响应式原理 Vue3的核心原理之一是响应式原理。简单来说,响应式原理是让运用了Vue3的项目能够在数据发生改变时实时进行视图更新的机制。 响应式原理的实现 Vue3的响应式原理通过Proxy实现。Proxy是ES6引入的一种代理机制,类似于Object.defineProperty(),但是比defineProperty更…

    Vue 2023年5月27日
    00
  • 详解从新建vue项目到引入组件Element的方法

    下面就是关于“详解从新建vue项目到引入组件Element的方法”的完整攻略: 一、新建vue项目 首先,在命令行窗口中执行以下命令,使用vue-cli创建一个新的vue项目: vue create my-project 其中,“my-project”是你想要命名的项目名称,你可以自己调整。 执行完该命令后,会提示你选择一个vue项目的配置模板,如果你是一个…

    Vue 2023年5月28日
    00
  • vue实现横向时间轴

    下面是Vue实现横向时间轴的完整攻略。 实现思路 实现横向时间轴的关键在于CSS部分的设计。我们需要定义好每个时间点的样式以及它们之间的间隔。 在Vue中,我们可以采用循环遍历的方式,动态生成时间点列表。同时,为了实现滚动效果,我们需要监听鼠标事件,并且动态计算容器滚动的距离。 具体实现 第一步:HTML结构 我们需要先定义好HTML结构。 <div …

    Vue 2023年5月28日
    00
  • AntV+Vue实现导出图片功能

    AntV 是 Ant Design 团队出品的数据可视化解决方案,而 Vue 是当下广泛使用的前端框架之一。本文将介绍如何在 Vue 项目中使用 AntV 实现导出图片功能。具体实现流程如下: 1. 环境搭建 在 Vue 项目中使用 AntV,需要先安装 @antv/g2 和 @antv/data-set 两个依赖包: npm install @antv/g…

    Vue 2023年5月28日
    00
  • vue 3.0 使用ref获取dom元素的示例

    使用 ref 获取 DOM 元素是 Vue.js 3.0 新增的功能。下面是使用 ref 获取 DOM 元素的示例: 1. 在模板中使用 ref 在模板中使用 ref 可以方便地获取 DOM 元素及组件实例。下面是一个简单的示例,用于获取一个输入框 (<input>): <template> <div> <input…

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