Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Javascript零碎之自定义鼠标右键列表 #5

Open
kekobin opened this issue Jul 10, 2019 · 0 comments
Open

Javascript零碎之自定义鼠标右键列表 #5

kekobin opened this issue Jul 10, 2019 · 0 comments

Comments

@kekobin
Copy link
Owner

kekobin commented Jul 10, 2019

我们都知道,点击鼠标右边默认会有一个选项列表,给我们提供了很多的快捷操作。如果我们要自定义这个选项列表是否可行呢?
答案是肯定的,浏览器给我们提供了"contextmenu"这个事件让我们自定义右键列表。而且,很可喜的是,Chrome、Edge、Firfox全都支持,并且它的用法呢也很简单:
首先,定义一个只能使用自定义右键列表的区块和自定义右键列表:

<div class="custom-menu-area"></div>
<ul id="customMenu">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
</ul>

然后,添加上简单的样式:

.custom-menu-area {
  width: 500px;
  height: 500px;
  background: green;
}
ul,
li {
  list-style: none;
  padding: 0;
  margin: 0;
}
li {
  width: 100%;
  text-align: left;
  height: 45px;
  line-height: 45px;
  font-weight: bold;
}
li:hover {
  background: #f2f2f2;
}
#customMenu{
  visibility: hidden;
  position: absolute;
  top:0;
  left:0;
  z-index: 999;
  width:100px;
  background: yellow;
  text-align: center;
}

接下类处理下逻辑即可,具体看注释,因为比较简单就不进一步解释了:

const el = document.getElementById('customMenu')
const el2 = document.querySelector('.custom-menu-area')

// 禁止el2区域的右键鼠标默认事件,显示自定义的右键列表
el2.addEventListener('contextmenu', (e) => {
  e.preventDefault();
  // 更新自定义右边列表的位置
  el.style.top = e.clientY + 'px';
  el.style.left = e.clientX + 'px';
  // 显示自定义右边列表
  el.style.visibility = 'visible';
})

// 在空白位置点击时,应该隐藏掉自定义右边列表
document.body.addEventListener('click', () => {
  el.style.visibility = 'hidden';
})

这样,很简单的一个示例,完整的说明了自定义鼠标右键列表的原理。
完整示例请查看自定义鼠标右键列表

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant