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 select选中的一个小问题
Oct 11 Javascript
使用js获取图片原始尺寸
Dec 03 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 Javascript
基于jQuery的Web上传插件Uploadify使用示例
May 19 Javascript
json的使用小结
Jun 08 Javascript
老生常谈angularjs中的$state.go
Apr 24 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
bootstrap multiselect下拉列表功能
Aug 22 Javascript
JavaScript错误处理操作实例详解
Jan 04 Javascript
JavaScript DOM常用操作代码汇总
Jul 03 Javascript
Element Collapse 折叠面板的使用方法
Jul 26 Javascript
详解JavaScript 事件流
Sep 02 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 socket方式提交的post详解
2008/07/19 PHP
php仿discuz分页效果代码
2008/10/02 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
多广告投放代码 推荐
2006/11/13 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
python简单实现操作Mysql数据库
2018/01/29 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
python+logging+yaml实现日志分割
2019/07/22 Python
Python实现ATM系统
2020/02/17 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
python 调整图片亮度的示例
2020/12/03 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
餐饮加盟计划书
2014/01/10 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
中国入世承诺
2014/04/01 职场文书
校庆口号
2014/06/20 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
安全检查汇报材料
2014/12/26 职场文书
三八节活动简报
2015/07/20 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android