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日

相关文章

  • 九宫图比较常用的多控件布局(GridView)使用介绍

    下面我将详细讲解“九宫图比较常用的多控件布局(GridView)使用介绍”的完整攻略。 简介 GridView 是一种常见的多控件布局,它类似于表格布局,可以让开发者在一个视图中以表格的形式显示多个子控件。GridView 可以横向或纵向展示数据,并添加分页和滚动功能来实现更多的显示效果。在移动应用开发中,九宫图就是一个非常常见的使用 GridView 来实…

    other 2023年6月27日
    00
  • 详解Flutter中网络框架dio的二次封装

    我可以为您详细讲解“详解Flutter中网络框架dio的二次封装”的完整攻略。 一、dio网络框架简介 dio是一款基于Dart语言、纯Flutter应用的轻量级、强大的网络请求框架,提供了诸多功能,例如: restful请求封装 拦截器机制 全局error统一处理 FormData、拼接url参数、header封装 下载进度、上传进度监听等 dio是Flu…

    other 2023年6月25日
    00
  • smarty的section嵌套循环用法示例

    Smarty的section嵌套循环用法示例攻略 Smarty是一种流行的模板引擎,用于在PHP应用程序中分离逻辑和视图。其中,section是Smarty模板引擎中的一个重要特性,它允许我们在模板中创建循环结构。本攻略将详细讲解section的嵌套循环用法,并提供两个示例说明。 1. 基本语法 section的基本语法如下: {section name=s…

    other 2023年7月27日
    00
  • 暗黑3 2.4圣教军远古散件轰炮流 词缀选择释疑

    暗黑3 2.4圣教军远古散件轰炮流 词缀选择释疑攻略 策略概述 圣教军远古散件轰炮流是暗黑3中一种常见的强力构筑之一,它充分利用了圣教军远古套装的增益效果,同时还能够选择合适的词缀来提升输出和生存能力。下面我们将详细解释这个构筑,并介绍如何选择合适的词缀。 构筑介绍 套装选择 这个构筑的核心是圣教军远古套装,包括以下六个物品: 圣教军之靴 圣教军之头 圣教军…

    other 2023年6月27日
    00
  • iOS开发之适配iOS10以及Xcode8

    iOS开发之适配iOS10以及Xcode8 简介 随着iOS 10的推出以及Xcode 8的正式发布,许多iOS开发者发现在新版本的开发环境中需要对项目进行一些适配工作才能确保应用程序在iOS 10上正常运行,本文将详细介绍如何适配iOS 10以及Xcode 8开发环境。 环境适配 在Xcode 8中,苹果引入了一些新特性以及变化,因此需要对开发环境进行一些…

    other 2023年6月26日
    00
  • 数据结构TypeScript之链表实现详解

    首先,为了讲解数据结构TypeScript之链表实现详解,我们需要先了解什么是链表。链表是一种数据结构,在其中每个元素都包含了指向下一个元素的引用。在链表的表头中,这个引用指向链表中的第一个元素;在链表的表尾中,该引用指向 Null。 在 TypeScript 中实现链表,我们可以先定义一个 Node 类来表示链表中的一个节点,该节点包含两个属性:它自己的值…

    other 2023年6月27日
    00
  • yum和apt-get的区别详解

    yum和apt-get的区别详解 介绍 yum和apt-get都是常见的包管理工具,用于在Linux系统中安装、更新和卸载软件包。它们在不同的Linux发行版中使用,并具有一些区别。 yum yum是CentOS、Fedora和RHEL等Red Hat系列发行版中的包管理工具。它使用RPM包管理系统,可以从软件仓库中下载和安装软件包。 示例:使用yum安装n…

    other 2023年10月14日
    00
  • Flutter系统网络图片加载流程解析

    Flutter系统网络图片加载流程解析 Flutter系统提供了许多网络图片加载的功能,但是对于初学者来说,很难理解这些功能的原理和使用方法。本文将对Flutter系统网络图片加载的流程进行解析,并提供两个示例说明。 图片加载的流程 Flutter系统网络图片加载的流程大致如下: 根据图片的URL创建一个ImageProvider对象。 ImageProvi…

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