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 相关文章推荐
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Feb 04 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
jquery 实现input输入什么div图层显示什么
Jun 15 Javascript
常用的javascript设计模式
Jan 11 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
Node.js数据库操作之查询MySQL数据库(二)
Mar 04 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
Apr 12 Javascript
JS创建Tag标签的方法详解
Jun 09 Javascript
jQuery实现简单的Ajax调用功能示例
Feb 15 jQuery
vue 引用自定义ttf、otf、在线字体的方法
May 09 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
Aug 31 Javascript
详解React路由传参方法汇总记录
Nov 29 Javascript
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 身份验证方面的函数
2009/10/11 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
python实现sublime3的less编译插件示例
2014/04/27 Python
浅析Python中signal包的使用
2015/11/13 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
python如何读取bin文件并下发串口
2019/07/05 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Python中itertools的用法详解
2020/02/07 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
甜点店创业计划书
2014/01/27 职场文书
组织鉴定材料
2014/06/02 职场文书
六查六看心得体会
2014/10/14 职场文书
劳模先进事迹材料
2014/12/24 职场文书
趵突泉导游词
2015/02/03 职场文书
新教师个人工作总结
2015/02/06 职场文书
家属联谊会致辞
2015/07/31 职场文书
详解Nginx 工作原理
2021/03/31 Servers
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL