Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

先看效果图(我没有做美化,简陋了亿点点)。

然后我先讲解一下大概的逻辑: 在用户右键时,获取其右键的位置,然后在用户右键的位置展示出右键菜单。在用户左键时,关闭右键菜单。
在用户右键的位置展示出右键菜单这一步很简单,只需要添加一个绝对定位的盒子,然后将这个盒子移动到右键的位置即可。
那么请看代码:

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="./test.js"></script>
</body>
</html>

这是js代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// test.js
// 创建右键菜单盒子
let rightMenuDiv = document.createElement("div");
// 计数,用于关闭右键菜单
let rightMenuCount = 0;
// 设置右键菜单样式
rightMenuDiv.style.backgroundColor = "red";
rightMenuDiv.style.position = "absolute";
// 防止点击右键菜单中的内容的时候冒泡,导致关闭右键菜单
rightMenuDiv.addEventListener("mousedown", (event)=>{event.stopPropagation();})
// 给右键菜单添加内容(子节点)
let rightMenuChildLink = document.createElement("a");
rightMenuChildLink.appendChild(document.createTextNode("www.gray-ice.com"));
rightMenuChildLink.setAttribute("href", "https://www.gray-ice.com");
rightMenuDiv.appendChild(rightMenuChildLink);

// 展示右键菜单
function showRightMenu(x, y)
{
// 因为右键菜单有postion: absolute属性,已经脱标了,只要父元素没有定位,添加到哪都行,我这里是随便添加到底部了。
document.body.appendChild(rightMenuDiv);
// 调整右键菜单的位置,将其至于当前鼠标所在的位置上。
rightMenuDiv.style.left = String(x) + "px";
rightMenuDiv.style.top = String(y) + "px";
}
// 这里利用了事件冒泡,无论在哪个节点上点击的右键,最终都会冒泡到document上
document.addEventListener("contextmenu", function(event){
console.log(event);
// 避免触发浏览器的右键菜单
event.preventDefault();
// 显示自定义的右键菜单
showRightMenu(event.pageX, event.pageY);
// 将当前右键菜单的状态设置为 打开
rightMenuCount = 1;
})

// 关闭右键菜单
document.addEventListener("mousedown", function(event){
// 如果右键菜单当前是打开状态
if(rightMenuCount)
{
// 如果按下的是主键
if(event.button === 0)
{
// 从body上移除右键菜单
document.body.removeChild(rightMenuDiv);
// 将右键菜单的状态设置为关闭
rightMenuCount = 0;
}
}
})

// 创建100个p标签,用来测试页面高度变化是否会影响右键菜单的行为
function create100P()
{
let str = "";
for(let i = 0; i < 100; i++)
{
str += `<p>${i}</p>\n`;
}
let ps = document.createElement("div");
document.body.appendChild(ps);
ps.innerHTML = str;
}
create100P();

就是这样。
本篇完。

评论



愿火焰指引你