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文件 document.createElement
Oct 14 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
Dec 30 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
Jan 09 Javascript
JS实现动态生成表格并提交表格数据向后端
Nov 25 Javascript
JavaScript DOM节点操作方法总结
Aug 23 Javascript
详解Vue快速零配置的打包工具——parcel
Jan 16 Javascript
npm 下载指定版本的组件方法
May 17 Javascript
JavaScript设计模式之建造者模式实例教程
Jul 02 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
Sep 30 Javascript
webpack dll打包重复问题优化的解决
Oct 10 Javascript
vue.js实现三级菜单效果
Oct 19 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 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
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
python静态方法实例
2015/01/14 Python
全面理解Python中self的用法
2016/06/04 Python
Python用模块pytz来转换时区
2016/08/19 Python
python操作oracle的完整教程分享
2018/01/30 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
游戏商店:Eneba
2020/04/25 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
Java的五个基础面试题
2016/02/26 面试题
应急处置方案
2014/06/16 职场文书
大专生自荐书范文
2014/06/22 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
收费员岗位职责
2015/02/14 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
AJAX实现省市县三级联动效果
2021/10/16 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript