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 相关文章推荐
百度留言本js 大家可以参考下
Oct 13 Javascript
JQuery.closest(),parent(),parents()寻找父结点
Feb 17 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 Javascript
javascript解决innerText浏览器兼容问题思路代码
May 17 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
Feb 14 Javascript
详解React-Todos入门例子
Nov 08 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
Nov 23 Javascript
js,jq,css多方面实现简易下拉菜单功能
May 13 Javascript
Scala解析Json字符串的实例详解
Oct 11 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
Apr 28 Javascript
js实现移动端tab切换时下划线滑动效果
Sep 08 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
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP数字格式化
2006/12/06 PHP
php生成略缩图代码
2012/07/16 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
什么是就业协议书
2014/04/17 职场文书
民事诉讼授权委托书范文
2014/08/02 职场文书
迁户口计划生育证明
2014/10/19 职场文书
会议室管理制度范本
2015/08/06 职场文书
合理化建议书范文
2015/09/14 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
css背景和边框标签实例详解
2021/05/21 HTML / CSS