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 Select操作大集合
May 26 Javascript
jquery插件之easing使用
Aug 19 Javascript
探讨jQuery的ajax使用场景(c#)
Dec 03 Javascript
jquery鼠标停止移动事件
Dec 21 Javascript
使用jquery实现IE下按backspace相当于返回操作
Mar 18 Javascript
简单实现js页面切换功能
Jan 10 Javascript
javascript 中的继承实例详解
May 05 Javascript
Angular4的输入属性与输出属性实例详解
Nov 29 Javascript
微信小程序wx:for和wx:for-item的用法详解
Apr 01 Javascript
命令行批量截图Node脚本示例代码
Jan 25 Javascript
搭建一个Koa后端项目脚手架的方法步骤
May 30 Javascript
如何在node环境实现“get数据解析”代码实例
Jul 03 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下使用curl模拟用户登陆的代码
2010/09/10 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
php 文件缓存函数
2011/10/08 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
IE 当eval遇上function的处理
2011/08/09 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
Bootstrap table的使用方法
2016/11/02 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
python paramiko实现ssh远程访问的方法
2013/12/03 Python
Python的迭代器和生成器
2015/07/29 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
神经网络python源码分享
2017/12/15 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
python实现滑雪游戏
2020/02/22 Python
python中id函数运行方式
2020/07/03 Python
Python学习笔记之装饰器
2020/08/06 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
一道Delphi上机题
2012/06/04 面试题
2015年禁毒工作总结
2015/04/30 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电