如使用原生js自定义右键菜单

举报
纸飞机 发表于 2021/10/15 10:08:18 2021/10/15
【摘要】 ​ 1、右键菜单触发的基本过程实现自定义右键菜单我们首先需要了解以下内容:浏览器默认的右键菜单触发的基本过程单击右键,菜单出现菜单出现,鼠标箭头一直在菜单左上角再换个位置点击右键,原菜单消失,新菜单出现在指定位置点击左键,中键,菜单消失以上为大致实现过程,不全面,仅供参考也许文字过于抽象,我们来看看代码吧:2、HTML结构<!--start右键菜单的结构--><div id="rightme...

 1、右键菜单触发的基本过程

实现自定义右键菜单我们首先需要了解以下内容:

浏览器默认的右键菜单触发的基本过程

  1. 单击右键,菜单出现
  2. 菜单出现,鼠标箭头一直在菜单左上角
  3. 再换个位置点击右键,原菜单消失,新菜单出现在指定位置
  4. 点击左键,中键,菜单消失

以上为大致实现过程,不全面,仅供参考

也许文字过于抽象,我们来看看代码吧:

2、HTML结构

<!--start右键菜单的结构-->
<div id="rightmenu" class="rightmenu">
	<ul>
		<li disabled="disabled">
        <a href="#">返回(B)</a> 
        <span>Alt+向左箭头</span></li>
		<li><a href="#">前进(F)</a> <span>Alt+向右箭头</span></li>
		<li><a href="#">重新加载(R)</a> <span>Ctrl+R</span></li>
	</ul>
	<ul>
		<li><a href="#">另存为(A)...</a> <span>Ctrl+S</span></li>
        <li><a href="#">打印(P)..</a> <span>Ctrl+P</span></li>
		<li><a href="#">投射(C)...</a> <span>Ctrl+R</span></li>
	</ul>
	<ul>
		<li><a href="#">查看你个锤代码(V)</a> <span>Ctrl+U</span></li>
	    <li><a href="#">检查你个瓜皮(N)</a> <span>Ctrl+Shift+L</span></li>
	</ul>
</div>
<!--end右键菜单的结构-->
		
<div class="box"></div>

3、CSS样式

*{
	margin: 0;
	padding: 0;
}
li{
	list-style: none;
}
.rightmenu{
	width: 250px;
	background: #fff;
	border: 1px solid #bababa;
	position: fixed;
	box-sizing: border-box;
	display: none;
}
.rightmenu ul{
	border-bottom: 1px solid #e9e9e9;  	
}
.rightmenu ul li{
	height: 30px;
	line-height: 30px;
	color: #000;
	padding: 0 25px;
	box-sizing: border-box;
	margin: 2px 0;
		  	cursor: default;
}
.rightmenu ul li:hover{
	background: #ebebeb;
}
.rightmenu ul li a{
	font-size: 12px;
	color: #000;
	cursor: default;
	text-decoration: none;
}
.rightmenu ul li span{
	float: right;
	font-size: 12px;
	color: #000;
}
.box{
	width: 100px;
	height: 100px;
	background: red;
}

.rightmenu设置display:none是因为右键菜单本身是隐藏了因为点击了才出现,倘若不加这句,菜单会出现在页面的左上角。

3、js实现过程

分析:

①:浏览器本身就有右键菜单,我们也要做右键菜单,所以应当阻止浏览器的右键,这里可以用到preventDefault(),这个方法有着阻止默认事件的功能,科普一下,什么是默认事件:

例如: 点我可以知道这是可以跳转到百度的,所以是有个跳转时间的,这个事件我们没有去用js实现,他是默认的,所以称之为默认事件,同理,浏览器右键菜单。

②前面我们说了菜单出现,鼠标箭头一直在菜单左上角,这是怎么实现的呢,这涉及到event里面的事件发生坐标了,我们点击的位置就是我们右键点击事件发生的位置,可以用坐标来解释这个位置,clientX(事件发生点和可视区域的位置),offsetX(事件发生点和父级元素的位置),pageX(事件发生点和页面的位置),screenX(事件发生点和屏幕的位置),这里我们用offsetX/Y,因为我们是在BOW中点击,所以具体原因大家百度一下就直道了,我们还是看代码吧,代码里标注的很详细。

<script>
	document.addEventListener('DOMContentLoaded',function(){
	//获取
	var rightMenu=document.getElementById('rightmenu');
	//1.首先将右键默认行为关闭
	window.oncontextmenu=function(event){
		event.preventDefault();
		//2.设置右键行为
		rightMenu.style.display="none";//重置已经block的菜单
		rightMenu.style.display="block";
		rightMenu.style.left=event.offsetX+'px';
			rightMenu.style.top=event.offsetY+'px';
		}
		//3.根据真实浏览器的右键来看左键是可以取消右键菜单的
		document.onclick=function(event){
			rightMenu.style.display="none";
		}
		//4.功能并不完善,需要给每个li写BOM事件,这里暂时不写了
		//5.仔细检查你会发现当右键在自己定义的右键菜单上时,会出现一点小情况,可以自己测试
    })
</script>

以上仅供参考,更多的功能实现都是差不多的原理,好了,结束了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。