原生 HTML/CSS/JS 实现右键菜单和二级菜单

news2024/9/20 14:58:43

文章来源:www.huhailong.vip 站点
文章源地址:https://www.huhailong.vip/article/1764653112011841538

Demo效果演示地址
先看效果图
image.png{{{width=“auto” height=“auto”}}}

需要注意的就是边界检测处理,到极端点击底部和右侧时如果不做处理会遮挡菜单,影响使用,我的解决方案是动态监测窗口的宽高,根据右击时的横纵坐标判断菜单的最终位置,如果 右击的纵坐标+菜单高度 >= 窗口高度 则将菜单显示的高度坐标定位菜单高度,防止下方遮挡,如果 右击的横坐标+菜单宽度 >= 窗口的宽度则菜单横坐标为窗口宽度减去两倍的窗口宽度,避免菜单遮挡。

完整代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>右键菜单</title>
    <!-- 阿里图标 -->
    <!-- <link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/c/font_4453355_yizetjv4jeo.css" /> -->
    <style>
        html,
        body {
            margin: 0;
            overflow: hidden;
            width: 100%;
        }

        #test-area {
            border: 1px solid black;
            width: 100%;
            height: 100vh;
            background-color: #333333;
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .menu {
            width: 200px;
            display: flex;
            flex-direction: column;
            position: absolute;
            border: 1px solid gray;
            background-color: #333333;
            color: white;
            border-radius: 4px;
            font-size: 14px;
        }

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

        .menu>ul>li {
            padding: 10px;
            cursor: pointer;
        }

        .menu>ul>li:hover {
            background-color: #1A6CE7;
        }

        hr {
            margin: 0;
            border: 1px solid gray;
        }

        .submenu {
            padding: 0;
            left: 200px;
            margin-top: -32px;
            position: absolute;
            display: none;
        }

        .link {
            display: flex;
            align-items: center;
            justify-content: space-between;
        }

        .iconfont {
            font-size: 14px;
            padding-right: 5px;
        }

        .tip {
            font-size: 40px;
            color: gray;
        }
    </style>
</head>

<body>
    <!-- 右键点击测试区域 -->
    <div id="test-area">
        <div class="tip">
            点击右键查看效果
        </div>
    </div>
    <!-- 右键菜单1 -->
    <div class="menu" id="right-menu" hidden>
        <ul>
            <li><i class="iconfont icon-chakan1"></i>查看详情</li>
            <li><i class="iconfont icon-chakanziduan"></i>打开表字段提示</li>
            <hr />
            <li><i class="iconfont icon-chakansql"></i>在SQL编辑器查看数据</li>
            <li><i class="iconfont icon-a-Property1shengchengshuju"></i>生成测试数据</li>
            <li><i class="iconfont icon-jurassic_export-data"></i>导出数据</li>
            <li><i class="iconfont icon-jurassic_import-data"></i>导入数据</li>
            <li><i class="iconfont icon-shujuqianyi_huaban"></i>数据迁移</li>
            <li><i class="iconfont icon-biaogeduibi"></i>表结构对比</li>
            <hr />
            <li id="generate-sql">
                <div class="link">
                    <span><i class="iconfont icon-shengchengSQL"></i>生成SQL</span>
                    <span>></span>
                </div>
                <div class="submenu menu" id="right-menu2">
                    <ul>
                        <li>查找</li>
                        <li>插入</li>
                        <li>更新</li>
                        <li>删除</li>
                        <li>DDL</li>
                    </ul>
                </div>
            </li>
            <li id="copy">
                <div class="link">
                    <span><i class="iconfont icon-fuzhi"></i>复制</span>
                    <span>></span>
                </div>
                <div class="submenu menu" id="right-menu3">
                    <ul>
                        <li>Insert语句</li>
                        <li>CVS语句</li>
                    </ul>
                </div>
            </li>
            <li><i class="iconfont icon-shanchu"></i>删除</li>
            <li><i class="iconfont icon-zhongmingming"></i>重命名</li>
            <hr />
            <li><i class="iconfont icon-shuaxin"></i>刷新</li>
        </ul>
    </div>
    <script>


        //获取窗口内部大小
        var width = window.innerWidth;
        var height = window.innerHeight;

        //用于重新计算窗口大小
        window.addEventListener('resize', ()=>{
            width = window.innerWidth;
            height = window.innerHeight;
        })

        //默认隐藏右键菜单
        hiddenRightMenu('right-menu');
        document.getElementById("test-area").addEventListener('contextmenu', (e) => {
            e.preventDefault(e);    //覆盖原生右键事件
            showRightMenu(e, 'right-menu');   //显示菜单
        })
        document.getElementById("test-area").addEventListener('click', (e) => {
            hiddenRightMenu('right-menu');
        })
        function showRightMenu(e, id) {
            var rightMenu = document.getElementById(id);
            if(e.clientY + 520 >= height){
                rightMenu.style.top = (height - 530) + "px";
            }else{
                rightMenu.style.top = e.clientY + "px";
            }
            if(e.clientX + 200 >= width){
                rightMenu.style.left = (width - 400) + "px";
            }else{
                rightMenu.style.left = e.clientX + "px";
            }
            // rightMenu.style.left = e.clientX + "px";
            // rightMenu.style.top = e.clientY + "px";
            rightMenu.style.display = 'block';
        }
        function hiddenRightMenu(id) {
            document.getElementById(id).style.display = 'none';
        }
        //二级菜单事件
        document.getElementById('generate-sql').addEventListener('mouseover', (e) => {
            document.getElementById('right-menu2').style.display = 'block';
        })
        document.getElementById('generate-sql').addEventListener('mouseout', (e) => {
            document.getElementById('right-menu2').style.display = 'none';
        })
        document.getElementById('copy').addEventListener('mouseover', (e) => {
            document.getElementById('right-menu3').style.display = 'block';
        })
        document.getElementById('copy').addEventListener('mouseout', (e) => {
            document.getElementById('right-menu3').style.display = 'none';
        })
    </script>
</body>

</html>

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

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

相关文章

【网络爬虫】(2) requests模块,案例:网络图片爬取,附Python代码

1. 基本原理 1.1 requests 模块 requests 是 Python 中一个非常流行的 HTTP 客户端库&#xff0c;用于发送所有的 HTTP 请求类型。它基于 urllib&#xff0c;但比 urllib 更易用。 中文文档地址&#xff1a;Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 &#xff0…

centos 虚拟机 增加硬盘 虚拟机centos磁盘扩容

2 在centos 7 系统中挂载磁盘 2.1 查看磁盘信息 进入centos 7系统中&#xff0c;输入“# df -h”命令&#xff0c;查看磁盘信息。 这里没有写显示新增的磁盘信息。 2.2 对新加的磁盘进行分区操作 2.2.1 查看磁盘容量和分区 2.2.2 创建分区 a. 选择新增的磁盘&#xff08;这…

游戏本续航@控制中心的省电模式效果如何

文章目录 节能模式长续航模式&#x1f47a;相关工具 节能模式长续航模式&#x1f47a; 蓝天模具Control Center中的模式 根据我的试验,以及软件的提示,可以发现 Power Saving是最省电的,儿Quiet模式并不省电,它会启用独立显卡,只不过风扇的转速不像娱乐模式和性能模式那么积极而…

前端删除列表数据后页码重置逻辑

问题描述 需要调整页码的例子&#xff1a; 列表一共有10页数据&#xff0c;用户把第10页数据全部删除后&#xff0c;需要把数据重置成上一页&#xff0c;也就是第9页 不用调整页码的例子&#xff1a; 列表一共有1页数据&#xff0c;用户把本页数据全部删除后&#xff0c;页码…

代码随想录day30(2)回溯:组合(leetcode77)

题目要求&#xff1a;给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 思路&#xff1a;首先定义两个变量&#xff0c;一个存放符合条件的单一结果&#xff0c;另一个存放符合条件结果的集合&#xff0c;for循环用来横向遍历&#xff0c;递归用来纵…

Mac电脑虚拟显示器:BetterDisplay Pro for Mac v2.0.11激活版

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a;BetterDisplay Pro for Mac v2.0.11激活版 以下是BetterDisplay Pro的主要特点&…

8.软件工程

整个章节偏向于记忆、背诵&#xff1b; 主要议题&#xff1a; 软件体系&#xff1a;3层&#xff1b; UML重点&#xff0c;重点记3要素中的关系、图&#xff1b; 1.软件体系结构 分层 优点&#xff1a;利于软件的重复利用&#xff1b; 缺点&#xff1a;以什么方式分层&#…

2024 Python3.10 系统入门+进阶(三):Python变量类型和运算符

目录 一、Python变量的定义和使用二、Python整数类型&#xff08;int&#xff09;详解三、Python小数/浮点数&#xff08;float&#xff09;类型详解四、Python复数类型(complex)详解---了解五、Python字符串详解(包含长字符串和原始字符串)5.1 处理字符串中的引号5.2 字符串的…

【Linux系统】冯诺依曼与操作系统

什么是冯诺依曼体系结构&#xff1f; 如图即为冯诺依曼大致的体系结构图&#xff0c; 我们知道这些都是由我们的计算机硬件组成 输入设备&#xff1a;键盘&#xff0c; 鼠标&#xff0c; 摄像头&#xff0c; 话筒&#xff0c; 磁盘&#xff0c; 网卡... 输出设备&#xff1a…

[HGAME 2023 week2]Designer

[HGAME 2023 week2]Designer 考点&#xff1a;XSS跨站脚本攻击&#xff0c;模板注入 代码审计 function auth(req, res, next) {const token req.headers["authorization"]if (!token) {return res.redirect("/")}try {const decoded jwt.verify(token,…

你在测试金字塔的哪一层(下)

​在《你在测试金字塔的哪一层&#xff08;上&#xff09;》中介绍了自动化测试的重要性以及测试金字塔。测试金字塔分为单元测试、服务测试、UI测试&#xff0c;它们分别是什么呢&#xff1f;本期文章让我们一起详细看看测试金字塔的不同层次。 一、单元测试 单元测试是指对程…

蓝桥杯练习07小兔子爬楼梯

小兔子爬楼梯 介绍 小兔子想去月球上旅行&#xff0c;假设小兔子拥有一个阶梯子&#xff0c;当你爬完层就可以到达月球&#xff0c;小兔子每次可以跳1或者2个台阶&#xff0c;小兔子有多少种跳法可以到达月球呢&#xff1f; 给定n是一个正整数&#xff0c;代表梯子的阶数&…

apisix创建https

总结了下apisix 使用https 的问题和方法 1、apisix 默认https 端口是9443 2、apisix 需要上传证书后才可以使用https 否二curl测试会报错 SSL routines:CONNECT_CR_SRVR_HELLO 3、apisix 上传证书方法 我是使用的自签名证书&#xff0c;注意自签名证书的Common Name 要写你…

【教程】高效数据加密混淆方法及实现简介

背景 在需要对数据进行传输或者表达时&#xff0c;通常要求数据加密的安全级别不高&#xff0c;但希望加解密时间复杂度尽可能低。这时使用传统的对称加密&#xff08;如3DES、AES&#xff09;或非对称加密&#xff08;如RSA、ECC&#xff09;显然不太适合。因为加密的安全级别…

基于深度学习的海洋鱼类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................ % 对测试集进行分类预测 [Pr…

深入理解 TreeMap

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能结构篇

厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能结构篇 好几年前&#xff0c;应朋友之邀&#xff0c;为其工厂的厨余垃圾处理设备研发一套用于对现场的生产及维护进行远程查看、管理和质量监控的厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件系统。 因为…

STM32之HAL开发——Keil调试工具介绍

Debug介绍 在Keil工具中有许多常用的小工具&#xff0c;下面将会依次为大家介绍每个工具的用途。 命令行窗口 在窗口内可以输入一些指令&#xff0c;来进行断点设置以及删除&#xff0c;一般不常用 反汇编窗口 可以查看当前C代码的汇编指令 标志窗口 寄存器窗口 可以用来查看C…

【Linux】信号量与信号

目录 先导知识 信号量 信号 信号概念及产生信号的一般方式 进程递达、阻塞和捕捉 信号集操作函数 信号的捕捉 可重入函数 先导知识 信号量与信号没有任何关系&#xff0c;它们是两个完全不同的概念&#xff01; 操作系统的本质&#xff0c;就是一个死循环&#xff1b;…

Cookie在网络爬虫中的重要作用

在互联网的海量数据中&#xff0c;网络爬虫如同一只勤劳的小蜜蜂&#xff0c;不断采集着网页上的信息。而在这过程中&#xff0c;Cookie扮演了不可或缺的角色&#xff0c;它就像是爬虫手中的“通行证”&#xff0c;帮助其顺利获取所需数据。本文将深入探讨Cookie在网络爬虫中的…