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的仿flash的广告轮播代码
Nov 04 Javascript
jQuery判断元素是否是隐藏的代码
Apr 24 Javascript
js遍历td tr等html元素
Dec 13 Javascript
require.js深入了解 require.js特性介绍
Sep 04 Javascript
js简单实现图片延迟加载的方法
Jul 19 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
May 27 jQuery
JS回调函数原理与用法详解【附PHP回调函数】
Jul 20 Javascript
javascript关于“时间”的一次探索
Jul 24 Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 Javascript
layui文件上传控件带更改后数据传值的方法
Sep 23 Javascript
Jquery cookie插件实现原理代码解析
Aug 04 jQuery
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导出CSV抽象类实例
2014/09/24 PHP
php递归创建目录的方法
2015/02/02 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
取选中的radio的值
2010/01/11 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
Python写的服务监控程序实例
2015/01/31 Python
python多线程http压力测试脚本
2019/06/25 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
css3遮罩层镂空效果的多种实现方法
2020/05/11 HTML / CSS
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
自考自我鉴定范文
2013/10/30 职场文书
搞笑获奖感言
2014/01/30 职场文书
行政副总岗位职责
2014/02/23 职场文书
大学生活自我评价
2014/04/09 职场文书
班级体育活动总结
2014/07/05 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
python关于集合的知识案例详解
2021/05/30 Python
数据库之SQL技巧整理案例
2021/07/07 SQL Server
python基础之//、/与%的区别详解
2022/06/10 Python