前端:实现二级菜单(点击实现二级菜单展开)

news2024/11/20 12:21:13

效果

代码

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>左侧二级菜单实现</title>
    </head>
    <style>
    * {
        margin: 0;
        padding: 0;
    }

    /* 取消所有列表的序号 */
    ul,
    li {
        list-style-type: none;
    }

    /* 取消所有超链接的下划线 */
    a {
        text-decoration-line: none;
        color: white;
    }

    /* 全部样式 */
    .all_content {
        display: flex;
    }

    /* 左侧导航栏 */
    .left_nav {
        background-color: #222d32;
        width: 10%;
        height: 100vh;
    }

    /* 外层li */
    .menu-item {
        padding: 10px;
        background-color: #222d32;
    }

    .submenu {
        width: 100%;
        margin-top: 10px;
        margin-left: -10px;
        display: none;
        background-color: #181f23;
    }

    .submenu-li {
        background-color: #181f23;
        width: 100%;
        padding: 10px;
    }

    .submenu-link:hover {
        font-weight: 600;
    }

    .menu-item.active .submenu {
        display: block;
    }

    /* 右侧内容 */
    .right_content {
        width: 90%;
    }

    .content {
        display: none;
        /* 隐藏所有内容 */
    }

    .content.active {
        display: block;
        /* 显示被激活的内容 */
    }

    .selected {
        background-color:#4e73df;
        /* 设置选中状态的背景色 */
    }
</style>
    <body>
        <div class="all_content">
            <div class="left_nav">
                <ul class="menu">
                    <li class="menu-item">
                        <a href="#" class="menu-link">销售</a>
                        <ul class="submenu">
                            <li class="submenu-li"><a href="#"
                                    class="submenu-link"
                                    data-content-id="content1">功能1</a></li>
                            <li class="submenu-li"><a href="#"
                                    class="submenu-link"
                                    data-content-id="content2">报表1</a></li>
                        </ul>
                    </li>
                    <li class="menu-item">
                        <a href="#" class="menu-link">采购</a>
                        <ul class="submenu">
                            <li class="submenu-li"><a href="#"
                                    class="submenu-link"
                                    data-content-id="content3">功能2</a></li>
                            <li class="submenu-li"><a href="#"
                                    class="submenu-link"
                                    data-content-id="content4">报表2</a></li>
                        </ul>
                    </li>
                </ul>
            </div>
            <div class="right_content">
                <div id="content1" class="content">功能1的内容</div>
                <div id="content2" class="content">报表1的内容</div>
                <div id="content3" class="content">功能2的内容</div>
                <div id="content4" class="content">报表2的内容</div>
            </div>
        </div>
        <script>
        // 获取所有一级菜单项
        var menuItems = document.querySelectorAll('.menu-item');
        var contents = document.querySelectorAll('.content');

        // 为每个一级菜单项添加点击事件处理程序
        menuItems.forEach(function (menuItem) {
            var menuLink = menuItem.querySelector('.menu-link');
            var submenu = menuItem.querySelector('.submenu');

            menuLink.addEventListener('click', function (e) {
                e.preventDefault();
                // 关闭其他一级菜单的展开状态
                menuItems.forEach(function (item) {
                    if (item !== menuItem) {
                        item.classList.remove('active');
                    }
                });

                // 切换当前一级菜单的展开状态
                menuItem.classList.toggle('active');
            });
        });

        // 为每个二级菜单项添加点击事件处理程序
        var submenuLinks = document.querySelectorAll('.submenu-link');
        submenuLinks.forEach(function (link) {
            link.addEventListener('click', function (e) {
                e.preventDefault();
                // 移除所有内容的激活状态
                contents.forEach(function (content) {
                    content.classList.remove('active');
                });

                // 获取被点击项对应的内容ID
                var contentId = link.getAttribute('data-content-id');

                // 添加激活状态到对应的内容
                var activeContent = document.getElementById(contentId);
                activeContent.classList.add('active');

                // 关闭其他一级菜单的展开状态
                menuItems.forEach(function (menuItem) {
                    menuItem.classList.remove('active');
                });

                // 保持对应的一级菜单打开
                link.closest('.menu-item').classList.add('active');

                // 移除其他二级菜单的选中状态背景色
                submenuLinks.forEach(function (submenuLink) {
                    submenuLink.parentElement.classList.remove('selected');
                });

                // 给选中的二级菜单添加选中状态背景色
                link.closest('.submenu-li').classList.add('selected');
            });
        });
    </script>
    </body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1269495.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring 日志

日志的作用: 1.定位和发现问题 2.系统监控 3.数据采集 观察日志 先写一段打印日志的代码 日志内容 日志级别分类 默认日志级别是Info,级别一下的就不打印了 Spring 帮我们集成了日志框架,我们直接使用即可 我们测试一下用日志框架打印日志是如何 我们就会发现打印的结果跟…

TypeScript 5.3

导入属性 TypeScript 5.3支持导入属性提案的最新更新。 导入属性的一个用例是向运行库提供有关模块预期格式的信息。 // We only want this to be interpreted as JSON, // not a runnable/malicious JavaScript file with a .json extension. import obj from "./somet…

VSCODE 在新窗口中打开

使用VS习惯了&#xff0c;经常在新窗口中打开查看 但是VSCODE&#xff0c;无法拖动标签到一个新窗口中&#xff0c;一直以为没这个功能 后来发现 使用快捷健 ctlk,o 可以将标签页在新窗口中打开&#xff0c;虽然不如vsstudio方便&#xff0c;不过也可实现在新窗口打开的功能…

Mac 浏览器下载的文件名总是「乱码」

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 本文所说的方法是在出现文件名乱码情况下&#xff0c;如何恢复文件名的正确中文名称&#xff0c;并非一劳永逸地避免乱码的出现。这是由于下载文件名称乱码的出现&#xff0c;往往是系统、浏览器、网站三方面因素共…

基于containerd容器运行时,kubeadmin部署k8s 1.28集群

一.主机准备 1.1主机配置与操作系统说明 centos7u9 1.2主机硬件配置说明 序号主机名ip地址CPU内存硬盘1k8s-master1192.168.1.2002C2G100G2k8s-worker1192.168.1.2012C2G100G3k8s-worker2192.168.1.2022C2G100G 1.3主机配置 1.3.1主机名配置 hostnamectl set-hostname k…

【滑动窗口】长度最小的数组

长度最小的数组 长度最小的数组 文章目录 长度最小的数组题目描述解法暴力解法滑动窗口Java示例代码c示例代码 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, num…

【web安全】CSRF漏洞攻击与防御

前言 总结&#xff0c;仅供学习。 csrf的理解 我们了解一个网站有修改信息&#xff0c;密码&#xff0c;添加删除管理&#xff0c;支付转账的功能之后。 通过抓包抓取对方修改操作的数据包样式&#xff0c; 然后在自己网站搭建一个指令。 当别人来访时&#xff0c; 如果…

el-select实现分屏效果

动态绑定class值 &#xff0c;多种判断 :class"type 8 ? home-stye-2 : type 24 ? home-stye-1 : home-stye-3" <div class"home-right-top"><div class"home-right-top-video"><el-row :gutter"20"><el-c…

身份验证和电子邮件的网络安全即将迎来地震

任何拥有 Gmail 或 Yahoo 电子邮件帐户的人都清楚&#xff0c;如果不是明确的欺诈企图&#xff0c;他们的收件箱中可能充满了未经请求的邮件。 这些服务的用户很可能多次想知道他们的提供商是否可以采取措施至少减少垃圾邮件的数量以及随之而来的诈骗风险。 好消息是&#xf…

深入理解网络阻塞 I/O:BIO

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

CSS:calc() 函数 / 动态计算长度值 / 不同场景使用

一、理解 css calc() 函数 CSS calc() 函数是一个用于计算 CSS 属性值的函数。它可以在 CSS 属性值中使用数学表达式&#xff0c;从而实现动态计算属性值的效果。calc() 函数可以使用加减乘除四种基本数学运算符来计算属性值&#xff0c;还可以使用括号来改变优先级。 二、ca…

从薛定谔的猫——量子理论基础

在介绍量子理论基础之前&#xff0c;先介绍一下薛定谔的猫的故事&#xff0c;这个故事可能大多数朋友并不陌生&#xff0c;下面首先回顾一下&#xff1a; 薛定谔的猫是一个在量子力学中用来说明量子叠加态和测量结果的思维实验。这个思维实验最早由物理学家Erwin Schrdinger在1…

lxd提权

lxd/lxc提权 漏洞介绍 lxd是一个root进程&#xff0c;它可以负责执行任意用户的lxd&#xff0c;unix套接字写入访问操作。而且在一些情况下&#xff0c;lxd不会调用它的用户权限进行检查和匹配 原理可以理解为用用户创建一个容器&#xff0c;再用容器挂载宿主机磁盘&#xf…

Alignment of HMM, CTC and RNN-T,对齐方式详解——语音信号处理学习(三)(选修二)

参考文献&#xff1a; Speech Recognition (option) - Alignment of HMM, CTC and RNN-T哔哩哔哩bilibili 2020 年 3月 新番 李宏毅 人类语言处理 独家笔记 Alignment - 7 - 知乎 (zhihu.com) 本次省略所有引用论文 目录 一、E2E 模型和 CTC、RNN-T 的区别 E2E 模型的思路 C…

【安全-SSH】SSH安全设置

今天发现自己的公有云服务器被攻击了 然后查看了登录日志&#xff0c;如上图 ls -sh /var/log/secure vim /var/log/secure然后增加了安全相关的设置 具体可以从以下方面增加安全性&#xff1a; 修改默认SSH端口公有云修改安全组策略及防火墙端口设置登录失败次数锁定用户及…

vuepress-----4、侧边栏

# 4、侧边栏 # 自动生成侧栏 如果你希望自动生成一个仅仅包含了当前页面标题&#xff08;headers&#xff09;链接的侧边栏&#xff0c;你可以通过 YAML front matter 来实现&#xff1a; --- sidebar: auto ---你也可以通过配置来在所有页面中启用它&#xff1a; // .vuep…

自己动手写 chatgpt: Attention 机制的原理与实现

chatgpt等大模型之所以成功都有赖于一种算法突破&#xff0c;那就是 attention 机制。这种机制能让神经网络更有效的从语言中抽取识别其内含的规律&#xff0c;同时它支持多路并行运算&#xff0c;因此相比于原来的自然语言处理算法&#xff0c;它能够通过并发的方式将训练的速…

深度学习之十二(图像翻译AI算法--UNIT(Unified Neural Translation))

概念 UNIT(Unified Neural Translation)是一种用于图像翻译的 AI 模型。它是一种基于生成对抗网络(GAN)的框架,用于将图像从一个域转换到另一个域。在图像翻译中,这意味着将一个风格或内容的图像转换为另一个风格或内容的图像,而不改变图像的内容或语义。 UNIT 的核心…

Swift 常用关键字

目录 一、数据类型 1. 流程控制 2. 访问控制 3. 功能修饰词 4. 错误处理 5. 泛型和类型 6. 其它关键字 二、部分关键字说明 1. guard 2. class 和 struct struct&#xff08;结构体&#xff09; class&#xff08;类&#xff09; 使用场景 3. mutating 4. proto…

【JUC】十五、中断协商机制

文章目录 1、线程中断机制2、三大中断方法的说明3、通过volatile变量实现线程停止4、通过AtomicBoolean实现线程停止5、通过Thread类的interrupt方法实现线程停止6、interrupt和isInterrupted方法源码7、interrupt方法注意点8、静态方法interrupted的注意点 1、线程中断机制 一…