JS自定义右键菜单实现代码解析


Posted in Javascript onJuly 16, 2020

今天来讲一个关于右键菜单的小demo,抛砖引玉。

首先,我们要用css和html做一个自定义右键菜单。

<!--自定义右键菜单html代码-->
<div id="menu">
<div class="menu">功能1</div>
<div class="menu">功能2</div>
<div class="menu">功能3</div>
<div class="menu">功能4</div>
<div class="menu">功能5</div>
</div>

/*css代码*/
#menu{
width: 0; /*设置为0 隐藏自定义菜单*/
height: 125px;
overflow: hidden; /*隐藏溢出的元素*/
box-shadow: 0 1px 1px #888,1px 0 1px #ccc;
position: absolute; /*自定义菜单相对与body元素进行定位*/
}
.menu{
width: 130px;
height: 25px;
line-height: 25px;
padding: 0 10px;
}

现在我们已经有了自定义菜单,还需要一个很重要的事件 contextmenu。

> contextmenu :当你在页面上右键点击时,会触发此事件,并会跳出浏览器自带的右键菜单。

所以,我们要做的就是,在触发contextmenu事件时,取消掉默认行为(也就是阻止浏览器显示自带的菜单)

通过传入的事件对象,来确定鼠标的点击位置,作为left和top的值来进行元素的定位,并显示自定义菜单

window.oncontextmenu=function(e){
//取消默认的浏览器自带右键 很重要!!
e.preventDefault();

//获取我们自定义的右键菜单
var menu=document.querySelector("#menu");

//根据事件对象中鼠标点击的位置,进行定位
menu.style.left=e.clientX+'px';
menu.style.top=e.clientY+'px';

//改变自定义菜单的宽,让它显示出来
menu.style.width='125px';
}
//关闭右键菜单,很简单
window.onclick=function(e){

//用户触发click事件就可以关闭了,因为绑定在window上,按事件冒泡处理,不会影响菜单的功能

document.querySelector('#menu').style.height=0;
}

这里只是一个很简单的例子,contextmenu事件支持所有 HTML 元素,这意味者你可以给不同的元素,自定义不同的右键菜单,由于contextmenu事件会冒泡传播,子节点上触发的事件,在父节点上也会触发,所以应该调用对应的函数或者设置对应的属性值来阻止事件冒泡。

根据事件对象来定位其实很复杂也很简单,除了clientY和clientX,鼠标事件对象提供了一系列复杂的相关信息,诸如layerX,pageX等等,这些值并不直观,还存在浏览器兼容问题,不过clientX和clientY,可以说是万金油属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery获取样式中的背景颜色属性值/颜色值
Dec 17 Javascript
setInterval,setTimeout与jquery混用的问题
Apr 08 Javascript
javascript复制粘贴与clipboardData的使用
Oct 16 Javascript
JavaScript实现的双向跨域插件分享
Jan 31 Javascript
理解JavaScript中Promise的使用
Jan 18 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
Jun 22 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
jQuery选择器之基本选择器用法实例分析
Feb 19 jQuery
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
Vue 实现拨打电话操作
Nov 16 Javascript
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
JS如何在不同平台实现多语言方式
Jul 16 #Javascript
vue使用axios实现excel文件下载的功能
Jul 16 #Javascript
vue实现自定义多选按钮
Jul 16 #Javascript
vue实现div单选多选功能
Jul 16 #Javascript
vue+AI智能机器人回复功能实现
Jul 16 #Javascript
vue.js实现h5机器人聊天(测试版)
Jul 16 #Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
Jul 16 #Javascript
You might like
php array_slice函数的使用以及参数详解
2008/08/30 PHP
php 表单数据的获取代码
2009/03/10 PHP
PHP连接access数据库
2015/03/27 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
document.createElement()用法
2013/03/13 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
Python实现多线程抓取妹子图
2015/08/08 Python
实例Python处理XML文件的方法
2015/08/31 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python生成器以及应用实例解析
2018/02/08 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
详解anaconda安装步骤
2020/11/23 Python
美国NBA官方商店:NBA Store
2019/04/12 全球购物
群众路线自查报告及整改措施
2014/11/04 职场文书
高中家长意见怎么写
2015/06/03 职场文书
高中信息技术教学反思
2016/02/16 职场文书
MySQL 数据类型详情
2021/11/11 MySQL