Web前端中实现自定义右键菜单

在原生的桌面应用中,右键菜单是个很常见也很常用的东西,但是在Web应用中,由于浏览器自带了右键菜单,所以我们很少见到应用有自己的右键菜单,但不常见并不代表没有,本文就会介绍一个右键菜单的实现。

重点

实现右键菜单的重点就是对鼠标右键点击事件的拦截,防止他响应浏览器默认事件,右键点击事件是 contextmenu,使用 preventDefault() 方法来阻止事件被浏览器响应之后写入正常的dom操作即可。

实现

<!DOCTYPE html>
<html>
<head>
    <title>右键菜单</title>
    <style type="text/css">
        body {
            background: linear-gradient(to bottom right, blue 20%, pink 20%, red);
            background-size: 100vw 100vh;
        }
        
        #right-menu {
            position: absolute;
            width: 200px;
            height: auto;
            display: none;
            padding: 2px 0;
            box-shadow: 0px 0 5px #aaa;
            border-radius: 8px;
            background: rgba(255, 255, 255, .75);
            backdrop-filter: saturate(180%) blur(20px);
            --webkit-backdrop-filter: saturate(180%) blur(20px);
        }
        
        .menu-item {
            height: 35px;
            line-height: 35px;
            margin: 4px 0;
            padding: 0 10px;
            cursor: pointer;
            background-color: transparent;
        }
        
        .menu-item:hover {
            background: rgba(223, 223, 223, 0.55);
        }
        
        .menu-item-separator {
            border-top: 1px #ccc solid;
            height: 1px;
        }
    </style>
</head>
<body>
    <div id="right-menu">
        <div class="menu-item">返回</div>
        <div class="menu-item">执行</div>
        <div class="menu-item">启动</div>
        <div class="menu-item">删除</div>
        <div class="menu-item">导出</div>
        <div class="menu-item">导入</div>
    </div>
    <script type="text/javascript">
        const menu = document.querySelector("#right-menu");
        window.addEventListener('contextmenu', (e) => {
            e.preventDefault();
            menu.style.display = "block";
            menu.style.left = e.clientX + "px";
            menu.style.top = e.clientY + "px";
        });
        window.addEventListener('click', (e) => {
            menu.style.display = "none";
        });
    </script>
</body>
</html>
发布时间:2022-02-13

其他阅读

管道技术——中间件的灵魂

在现代Web开发中,中间件技术使用越来越广泛,本文带大家了解中间件的基础,同时也是中间件的灵魂所在,管道技术。在C#中,依赖于委托,我们可以很容易就实现一个中间件管道。所以在阅读本文前,请确保你已经学会了什么是委托,包括但不限于Delegate,Action,Func。除此之外,本文还会使用到反射相关知识,请确保你已经学会了什么是反射。

Apple中的模糊效果

本文主要介绍在前端里比较重要的一个效果——高斯模糊效果,也有人称为毛玻璃特效。在Mac和Windows系统样式上也都在使用模糊效果。下面聚焦于Web前端中的模糊效果开发。

Nginx重定向HTTP到HTTPS

HTTP协议以纯文本形式进行数据的交互,数据明文传输,容易被监听,窃取和伪造,HTTPS在HTTP的基础上,使用了TLS/SSL对通信过程进行加密,数据得到了有效的保护,就算被拦截到也无法获取信息,更没法实施中间人攻击。本文将会介绍如何在Nginx中配置HTTP重定向到HTTPS。

Js使用原型链对对象进行扩展

在C#的扩展方法中,我们了解到了一种不需要修改源对象定义即可为对象添加新的行为的方法,在JavaScript中,我们通过原型链也可以实现类似的效果,为对象添加新的行为。需要一定的Js原型链基础。

在ASP.NET Core中使用过滤器

ASP.NET Core是一个高性能的Web开发框架,过滤器(Filter)在ASP.NET Core中被用于路由方法之上,可以在路由方法执行前后完成一些额外的操作。本文将会介绍在ASP.NET Core中使用 IActionFilter 实现过滤器并读取路由方法中的参数。