js实现完全自定义可带多级目录的网页鼠标右键菜单方法

实现完全自定义可带多级目录的网页鼠标右键菜单的方法,一般需要以下步骤:

1. HTML结构

首先,创建一个HTML菜单结构,包含多级目录的层级关系,可以使用<ul><li>元素实现,例如:

<ul id="menu">
  <li>
    <a href="#">一级菜单1</a>
    <ul>
      <li><a href="#">二级菜单1</a></li>
      <li><a href="#">二级菜单2</a></li>
    </ul>
  </li>
  <li>
    <a href="#">一级菜单2</a>
    <ul>
      <li><a href="#">二级菜单3</a></li>
      <li><a href="#">二级菜单4</a></li>
    </ul>
  </li>
</ul>

2. CSS样式

样式用来展示鼠标右键菜单的外观效果,包括背景颜色、字体颜色、边框等,例如:

#menu {
  position: absolute;
  display: none;
  z-index: 999;
  border: 1px solid #999;
  background-color: #fff;
  color: #333;
  padding: 5px;
}

#menu ul {
  margin: 0;
  padding: 0;
}

#menu li {
  list-style: none;
  margin: 0;
  padding: 2px 10px;
}

#menu li:hover {
  background-color: #f0f0f0;
  cursor: pointer;
}

#menu ul ul {
  display: none;
  position: absolute;
  top: 0;
  left: 100%;
  border: 1px solid #999;
  background-color: #fff;
  color: #333;
  padding: 5px;
}

#menu li:hover > ul {
  display: block;
}

3. JavaScript实现

通常使用 JavaScript 实现鼠标右键菜单功能,主要包含以下步骤:

3.1 阻止浏览器默认右键菜单事件

document.addEventListener('contextmenu', function (e) {
  e.preventDefault();
});

3.2 监听document点击事件,隐藏菜单

document.addEventListener('click', function (e) {
  document.getElementById('menu').style.display = 'none';
});

3.3 监听鼠标右键事件,显示菜单

document.addEventListener('mousedown', function (e) {
  if (e.button === 2) {
    var menu = document.getElementById('menu');
    menu.style.display = 'block';
    menu.style.left = e.clientX + 'px';
    menu.style.top = e.clientY + 'px';
  }
});

3.4 实现点击菜单项事件

var menuItems = document.querySelectorAll('#menu li');

for (var i = 0; i < menuItems.length; i++) {
  menuItems[i].addEventListener('click', function (e) {
    alert(e.target.innerText);
  });
}

这样就可以实现一个基本的鼠标右键菜单功能了。

以下是一个完整的示例:

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>自定义鼠标右键菜单</title>
  <style>
    #menu {
      position: absolute;
      display: none;
      z-index: 999;
      border: 1px solid #999;
      background-color: #fff;
      color: #333;
      padding: 5px;
    }

    #menu ul {
      margin: 0;
      padding: 0;
    }

    #menu li {
      list-style: none;
      margin: 0;
      padding: 2px 10px;
    }

    #menu li:hover {
      background-color: #f0f0f0;
      cursor: pointer;
    }

    #menu ul ul {
      display: none;
      position: absolute;
      top: 0;
      left: 100%;
      border: 1px solid #999;
      background-color: #fff;
      color: #333;
      padding: 5px;
    }

    #menu li:hover > ul {
      display: block;
    }
  </style>
</head>

<body>
  <h1>自定义鼠标右键菜单</h1>
  <p>右键单击下面的区域试试:</p>
  <div id="contextmenu">
    <ul id="menu">
      <li>
        <a href="#">一级菜单1</a>
        <ul>
          <li><a href="#">二级菜单1</a></li>
          <li><a href="#">二级菜单2</a></li>
        </ul>
      </li>
      <li>
        <a href="#">一级菜单2</a>
        <ul>
          <li><a href="#">二级菜单3</a></li>
          <li><a href="#">二级菜单4</a></li>
        </ul>
      </li>
    </ul>
  </div>

  <script>
    document.addEventListener('contextmenu', function (e) {
      e.preventDefault();
    });

    document.addEventListener('click', function (e) {
      document.getElementById('menu').style.display = 'none';
    });

    document.addEventListener('mousedown', function (e) {
      if (e.button === 2) {
        var menu = document.getElementById('menu');
        menu.style.display = 'block';
        menu.style.left = e.clientX + 'px';
        menu.style.top = e.clientY + 'px';
      }
    });

    var menuItems = document.querySelectorAll('#menu li');

    for (var i = 0; i < menuItems.length; i++) {
      menuItems[i].addEventListener('click', function (e) {
        alert(e.target.innerText);
      });
    }
  </script>
</body>

</html>

另一个示例是增强版,可以根据当前鼠标位置不断调整菜单的位置,保证菜单显示在浏览器可视区域内:

document.addEventListener('mousedown', function (e) {
  if (e.button === 2) {
    var menu = document.getElementById('menu');
    menu.style.display = 'block';
    menu.style.left =
      e.clientX + menu.offsetWidth > window.innerWidth ?
      window.innerWidth - menu.offsetWidth + 'px' :
      e.clientX + 'px';
    menu.style.top =
      e.clientY + menu.offsetHeight > window.innerHeight ?
      window.innerHeight - menu.offsetHeight + 'px' :
      e.clientY + 'px';
  }
});

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现完全自定义可带多级目录的网页鼠标右键菜单方法 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • cmd批处理常用符号详解

    CMD批处理常用符号详解 在CMD中,常用一些特殊符号进行一些特殊的操作。下面就详细讲解一下这些符号: 1. %和变量 在CMD中,我们可以使用%符号来引用变量。%符号用在变量名的前后,来获取变量的值。例如,指定一个变量名称为a,可以在CMD中输入 set a=hello,然后在后面使用 %a% 来获取变量a的值。示例如下: set a=hello echo…

    other 2023年6月26日
    00
  • Java 线程的生命周期完整实例分析

    Java 线程的生命周期完整实例分析 在 Java 中,线程是非常常见的概念。了解线程的生命周期对于正确编写多线程程序是非常重要的。本文将介绍 Java 线程的完整生命周期,并给出两个实例进行说明。 Java 线程的生命周期 Java 线程的生命周期可以归纳为以下 6 个阶段: 新建(New):当线程对象被创建后处于新建状态。 就绪(Runnable):当调…

    other 2023年6月27日
    00
  • 关于自动化测试框架pytest的Fixture固件

    关于自动化测试框架pytest的Fixture固件攻略 什么是Fixture固件? 在pytest中,Fixture固件是一种用于提供测试环境的机制。它可以在测试用例执行之前或之后执行一些预定义的操作,例如创建、初始化或清理测试数据、启动或关闭服务等。Fixture固件可以帮助我们更方便地编写和管理测试用例。 如何使用Fixture固件? 1. 定义Fixt…

    other 2023年8月21日
    00
  • swift3.0:associatedtype

    Swift 3.0: AssociatedType的完整攻略 在Swift 3.0中,AssociatedType是一种非常有用的类型协议,它允许我们在协议中定义一个占位符类型,以便在实现协议时指定具体的类型。本文将介绍AssociatedType的定义、使用方法和两个示例说明。 AssociatedType的定义 AssociatedType是一种协议中的…

    other 2023年5月9日
    00
  • js+css实现换肤效果

    JS+CSS实现换肤效果攻略 简介 换肤功能是一种让用户可以自定义网站界面风格的常见需求。使用JavaScript(JS)和CSS可以轻松实现这个功能,使用户能够切换不同的主题样式。 在本攻略中,我们将介绍如何通过JS和CSS实现换肤效果,包括创建主题样式表、切换样式表、保存用户的偏好等。 步骤 1. 创建主题样式表 首先,我们需要创建不同的主题样式表,每个…

    other 2023年6月28日
    00
  • simulink仿真入门到精通(十一)模块的封装

    Simulink仿真入门到精通(十一)模块的封装 在Simulink中,模块的封装是一项非常重要的任务。本文将介绍如何封装模块,并提供两个示例说明。 步骤一:创建模块 首先,创建一个模块。以下是一个示例: 打开Simulink,“File” -> “New” -> “Model”,创建一个新模型。 在模型中添加一个模块,例如一个加法器。 在块的输…

    other 2023年5月7日
    00
  • WPF实现斜纹圆角进度条样式

    WPF实现斜纹圆角进度条样式 在WPF中,样式是一种用于控件视觉呈现的强大机制。可以使用样式为控件定义外观,并在多个控件之间共享。在本篇文章中,我们将使用样式在WPF中实现一个具有斜纹圆角的进度条。 实现思路 首先,我们需要定义一个名为”ProgressStyle”的样式来定义进度条的外观。在这个样式中,我们使用了”LinearGradientBrush”作…

    其他 2023年3月28日
    00
  • jQuery源码解读之removeClass()方法分析

    jQuery源码解读之removeClass()方法分析 介绍 本攻略旨在详细讲解jQuery源码中removeClass()方法的实现原理和功能。removeClass()方法用于从网页元素中移除指定的CSS类。 源码解析 1. 示例代码 以下是一个简单的示例代码,展示了如何使用removeClass()方法: <!DOCTYPE html> …

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部