使用Vue实现一个当鼠标悬浮时出现,鼠标离开时消失的双层菜单

2023-12-16

前言

分享一个基于Vue实现一个当鼠标悬浮时出现,鼠标离开时消失的双层菜单。同时也是为了以后需要类似的需求时,可以提供一个实现思路,以及可以快速ctrl+c和ctrl+v操作,提高工作效率~

一、示例代码

(1)/src/views/Example/DiyNavMenu/index.vue

<template>
  <div class="index">
    <ul>
      <li
        v-for="(item, index) in tabList"
        :key="index"
        :class="{ 'active-tab': index == activeTabIndex }"
        @mouseover="
          item.name == '项目管理'
            ? (item.isVisibleMenuBox = true)
            : (item.isVisibleMenuBox = false)
        "
        @mouseleave="
          item.isVisibleMenuBox = false;
          isVisibleSubMenuBox = false;
          isMenuHover = -1;
        "
      >
        <span class="tab-label">{{ item.name }}</span>

        <div class="menu" v-show="item.isVisibleMenuBox">
          <div class="menu-box">
            <div class="menu-box-cascader">
              <div
                class="menu-item"
                v-for="(menuItem, menuIndex) in menuList"
                :key="menuIndex"
                :class="{ 'menu-hover': menuIndex == isMenuHover }"
                @mouseover="handleMenuMouseOver(menuItem, menuIndex)"
              >
                <span>{{ menuItem.label }}</span>
                <i class="el-icon-arrow-right" />
              </div>
            </div>

            <div class="menu-box-cascader" v-show="isVisibleSubMenuBox">
              <div
                class="menu-item"
                v-for="(subMenuItem, subMenuIndex) in subMenuList"
                :key="subMenuIndex"
                @click="handleSubMenuClick(subMenuItem, subMenuIndex)"
              >
                <span>{{ subMenuItem.label }}</span>
              </div>
            </div>
          </div>
        </div>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data: () => ({
    // 默认激活的页签索引
    activeTabIndex: 1,
    // 页签列表
    tabList: [
      {
        name: '系统中心',
        isVisibleMenuBox: false,
      },
      {
        name: '项目管理',
        isVisibleMenuBox: false,
      },
      {
        name: '用户管理',
        isVisibleMenuBox: false,
      },
    ],
    // 菜单列表
    menuList: [
      {
        label: '卡拉OK项目工程',
        children: [
          {
            label: '卡拉一期',
          },
          {
            label: '卡拉二期',
          },
          {
            label: '卡拉三期',
          },
          {
            label: '卡拉四期',
          },
          {
            label: '卡拉五期',
          },
        ],
      },
      {
        label: '芭比Q项目工程',
        children: [
          {
            label: '芭比一期',
          },
          {
            label: '芭比二期',
          },
        ],
      },
      {
        label: '最流批的项目工程',
        children: [
          {
            label: '最流批一期',
          },
        ],
      },
    ],
    // 菜单索引
    isMenuHover: -1,
    // 子菜单是否可见
    isVisibleSubMenuBox: false,
    // 子菜单列表
    subMenuList: [],
  }),
  methods: {
    /**
     * 菜单鼠标悬浮事件
     */
    handleMenuMouseOver(menuItem, menuIndex) {
      this.isMenuHover = menuIndex
      if (menuItem.children) {
        this.isVisibleSubMenuBox = true
        this.subMenuList = menuItem.children
      }
    },

    /**
     * 子菜单点击事件
     */
    handleSubMenuClick(subMenuItem, subMenuIndex) {
      console.log('handleSubMenuClick ->', subMenuItem, subMenuIndex)
    },
  },
};
</script>

<style lang="less" scoped>
.index {
  width: 100%;
  height: 35px;
  display: flex;
  justify-content: center;
  background-color: #fff;
  border-bottom: 1px solid #eee;

  ul {
    min-width: 300px;
    height: 100%;
    display: flex;
    justify-content: space-between;

    li {
      height: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
      list-style: none;
      position: relative;

      .tab-label {
        padding: 0px 10px;
        font-size: 14px;
        line-height: 34px;
        border-bottom: 1px solid transparent;
      }

      .tab-label:hover {
        border-bottom: 1px solid #072fbe;
        cursor: pointer;
        color: #072fbe;
      }

      .menu {
        position: absolute;
        top: 35px;
        left: 0;
        z-index: 10;
        width: 150px;
        height: auto;
        background-color: #fff;

        .menu-box {
          position: relative;
          display: flex;
          width: 100%;
          height: auto;

          .menu-box-cascader {
            width: 100%;
            height: 200px;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 1px 2px 8px 0 rgba(0, 0, 0, 0.15);

            &:nth-of-type(2) {
              position: absolute;
              top: 0;
              left: 152px;
              width: 180px;
              // background-color: #faf;
            }

            .menu-item {
              position: relative;
              width: 100%;
              height: 28px;
              display: flex;
              align-items: center;
              justify-content: center;
              cursor: pointer;

              span {
                font-size: 13px;
              }

              .el-icon-arrow-right {
                font-size: 12px;
                position: absolute;
                right: 2px;
              }

              &:hover {
                background-color: #072fbe1a;

                span, .el-icon-arrow-right {
                  color: #072fbe;
                }
              }
            }

            .menu-hover {
              background-color: #072fbe1a;

              span, .el-icon-arrow-right {
                color: #072fbe;
              }
            }
          }
        }
      }
    }

    .active-tab {
      // background-color: aqua;

      .tab-label {
        border-bottom: 1px solid #072fbe;
        color: #072fbe;
      }
    }
  }
}
</style>

二、运行效果

// Todo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Vue实现一个当鼠标悬浮时出现,鼠标离开时消失的双层菜单 的相关文章

  • 图像语义分割技术在医学影像诊断中的应用

    随着计算机视觉和人工智能技术的快速发展 图像语义分割技术在医学影像诊断中的应用日益广泛 图像语义分割技术能够将医学影像中的不同组织和病变区域进行精确的分割和标记 为医生提供更准确 更全面的诊断信息 本文将介绍图像语义分割技术的基本原理和方法
  • 控制变量在准确预测模型中的作用

    在科学研究和实际应用中 准确的预测模型对于决策和规划至关重要 然而 要建立一个准确的预测模型并不容易 因为我们需要考虑到多个因素对结果的影响 在这个过程中 控制变量发挥着重要的作用 本文将介绍控制变量在准确预测模型中的作用 帮助您更好地理解

随机推荐

  • 拼图软件多图有哪些软件可以做到?看看这份良心测评

    嘿 朋友们 出去旅游照片太多发不完怎么办 别提了 前段时间和舍友去了毕业旅行 看到什么我们是疯狂拍拍拍 回到家整理起图片才是叫苦不迭 为什么社交平台要限制发图数量啊 这样很多图片都发不了 不是很浪费吗 幸好 舍友给我推荐了一个拼图工具 竟然
  • 我们为什么需要设计模式

    设计模式是软件开发中的重要概念 它们是解决常见问题的经验总结和最佳实践 设计模式提供了一种可重用的解决方案 可以帮助开发人员更高效地开发和维护软件系统 下面将探讨为什么我们需要设计模式以及它们的重要性 首先 设计模式可以提高代码的可读性和可
  • 基于注意力机制的序列到序列模型

    序列到序列 Sequence to Sequence 简称Seq2Seq 模型是一种重要的深度学习模型 广泛应用于机器翻译 语音识别 文本摘要等自然语言处理任务中 然而 传统的Seq2Seq模型存在着无法处理长序列 信息丢失等问题 为了解决
  • ClickHouse:高性能列存储数据库,加速数据分析

    ClickHouse是俄罗斯最大的搜索引擎Yandex开源的一款基于列存储的数据库 专为实时数据分析而设计 相比传统的方法 ClickHouse的数据处理速度快了100到1000倍 它的性能超过了市场上其他面向列的数据库管理系统 每秒钟每台
  • 智能配音工具怎么样?手把手教你制作酷炫的机器配音

    嘿朋友们 今天我要给大家介绍一款超酷的东西 它就像是你的私人配音演员 能够让你的生活变得更有趣 是的没错 我要说的就是智能配音工具软件 想象一下 你正在制作一个有趣的视频 但是你的声音总是听起来很无聊 别担心 有了智能配音工具软件 你可以轻
  • Linux命令行系列:防火墙命令

    Firewall命令 一 Firewall的基本命令 查看firewall运行状态 systemctl status firewall 停止firewall systemctl stop firewall 启动firewall system
  • 未来生活的数字替身:数字化身影的价值与应用

    随着科技的不断发展 数字替身成为了未来生活中的一项重要技术 数字替身是指通过数字化技术创建的个人化虚拟形象 能够模拟和代表现实世界中的个体 本文将科普未来生活中数字替身的价值与应用 数字替身的价值在于它能够提供个性化的服务和体验 通过分析个
  • 手写识别汉字有难度?3个软件让文字会说话

    你知道吗 有一次我在家整理书桌的时候 突然发现了一本古老的手写笔记本 里面记满了我小时候的涂鸦和字迹 我突然有个奇怪的想法 能不能把这些手写的文字转化成电子文件呢 当然有 那就是使用手写识别图片的软件 首先 让我们一起来看看手写识别软件的妙
  • Linux安装系列:SonarQube

    下载sonarqube wget https binaries sonarsource com Distribution sonarqube sonarqube 8 9 7 52159 zip 安装配置jdk unzip sonarqube
  • 电脑自动识别字幕用哪个软件好?外语视频学习一点都不难

    伙计们 可别说我不照顾你们 今天我要给你们介绍一个超级厉害的软件 那就是自动识别字幕的软件 这个软件简直就是留学生学习的必备神器啊 想象一下 你在异国他乡 上课听不懂老师说的英文 或者看电影听不清台词 是不是很郁闷 别担心 有了这个软件 你
  • Top-Down性能分析方法

    Top Down性能分析方法是由Intel的工程师提出的一种性能分析方法 旨在帮助开发人员更好地理解和优化计算机系统的性能 该方法主要通过从高层次到底层次的分析 逐步识别和解决性能瓶颈 以提高系统的整体性能和效率 Top Down方法介绍
  • 【网络安全】HVV爆火的漏洞:最新 WPS RCE (远程命令执行) 复现

    0x00 影响版本 WPS Office 2023 个人版 lt 11 1 0 15120 WPS Office 2019 企业版 lt 11 8 2 12085 0x01 环境配置 wps版本 WPS V11 1 0 12300 靶机 w
  • 【网络安全】SQL注入绕过技巧

    1 绕过空格 注释符 a0 两个空格代替一个空格 用Tab代替空格 a0 空格 20 09 0a 0b 0c 0d a0 00 最基本的绕过方法 用注释替换空格 注释 使用浮点数 select from users where id 8E0
  • WindowsServer服务器系列:定时备份 MySQL

    一 编写脚本 echo 取日期 时间变量值 set yy date 0 4 set mm date 5 2 set dd date 8 2 if i time 0 2 lss 10 set hh 0 time 1 1 if i time 0
  • SpringBoot基础系列:工具类使用

    断言 Assert 要求参数 object 必须为非空 Not Null 否则抛出异常 不予放行 参数 message 参数用于定制异常信息 void notNull Object object String message 要求参数必须空
  • CS5565设计资料|CS5565规格书|typec转HDMI 8k60Hz方案

    CS556x是一款高性能的Type C DisplayPort1 4到HDMI2 1协议转换器 可通过Type C DisplayPort链路接收视频和音频流 并转换为支持TMDS或FRL输出信令的HDMI DP接收器在4个通道上支持高达8
  • 【小程序】-【

    swiper swiper item轮播图 swiper 是滑块视图容器 其中只可放置 swiper item 组件 部分常用属性如下 其余属性详见 官方文档
  • EasyRecovery2024专业版下载安装步骤图文详细教程

    EasyRecovery是一款操作安全 价格便宜 用户自主操作的非破坏性的只读应用程序 它不会往源驱上写任何东西 也不会对源驱做任何改变 它支持从各种各样的存储介质恢复删除或者丢失的文件 其支持的媒体介质包括 硬盘驱动器 光驱 闪存 以及其
  • FL Studio21.3中文至尊完整版含2024Crack文件

    FL studio21中文直装版 中文名为水果软件 是一款非常专业的音频制作软件 该软件推出了全新的21 0版本 在功能和体验上更加的强大 它不仅适用于音乐制作 还可以用于电子声音 电视 广播等多种领域 它在所有音频制作软件中最适合初学者
  • 使用Vue实现一个当鼠标悬浮时出现,鼠标离开时消失的双层菜单

    前言 分享一个基于Vue实现一个当鼠标悬浮时出现 鼠标离开时消失的双层菜单 同时也是为了以后需要类似的需求时 可以提供一个实现思路 以及可以快速ctrl c和ctrl v操作 提高工作效率 一 示例代码 1 src views Exampl