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 相关文章推荐
捕获关闭窗口的脚本
Jan 10 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
Aug 12 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
Javascript编写俄罗斯方块思路及实例
Jul 07 Javascript
jquery实现简单文字提示效果
Dec 02 Javascript
JavaScript简单实现鼠标移动切换图片的方法
Feb 23 Javascript
Bootstrap布局之栅格系统详解
Jun 13 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
Nov 01 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
JavaScript中常见的八个陷阱总结
Jun 28 Javascript
详解vue-cli 2.0配置文件(小结)
Jan 14 Javascript
vue中实现弹出层动画效果的示例代码
Sep 25 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安装全攻略:APACHE
2006/10/09 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
php数据序列化测试实例详解
2017/08/12 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
JavaScript的eval JSON object问题
2009/11/15 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python使用百度翻译进行中翻英示例
2014/04/14 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
django 中QuerySet特性功能详解
2019/07/25 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
python实现简单文件读写函数
2021/02/25 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
五年级语文教学反思
2014/01/30 职场文书
函授大学生自我鉴定
2014/02/05 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
活动总结新闻稿
2014/08/30 职场文书
高中生自我评价范文2015
2015/03/03 职场文书
毕业生登记表班级意见
2015/06/05 职场文书