自定义菜单
最近的后台管理项目中使用到了右侧标签栏方便用户切换不同模块。但当标签栏过多时一个个关闭明显示是反人类的,所以参考了element admin
后写了一个自定义指令来实现点击鼠标右键实现自定义菜单。
最终效果图:
结构代码
ui部分
html代码:
1 | <div class="tags_div" v-menus> |
css代码:
1 | .tags_div { |
这块没什么好说的,主要是设置子相父绝定位,鼠标点击的时候好去设置菜单栏的位置。
自定义指令实现右键菜单栏
自定义指令我在上篇已经介绍过了,这里主要说一下设计到的相关事件和属性(上篇自定义拖拽弹窗介绍过的这里不再列出)。
相关属性(事件对象event,dom元素)
event.pageX:pageX
事件属性返回当事件被触发时鼠标指针向对于html
的body
的水平坐标。event.pageY:pageY
事件属性返回当事件被触发时鼠标指针向对于html
的body
垂直坐标。offsetParen
t属性:可以返回当前元素上个定位父级元素。
相关事件
oncontextmenu
:事件在元素中用户点击鼠标右键时触发。onmouseup
:在用户松开鼠标按键时触发。
实现代码
vue代码:
1 | directives: { |
分析
- 首先是通过
oncontextmenu
阻止浏览器的上下文菜单,在绑定onmouseup
事件判断鼠标右键点击。 - 获取当前元素距离
body
顶端的距离,在与鼠标在页面中的实际距离想减获取鼠标在div中的位置,进而设置菜单栏出现的位置。 - 给
document
绑定onmouseup
事件,点击页面其他地方关闭菜单栏。
注意点
- 获取当前元素距离
body
顶端的距离要判断当前元素有没有上级定位元素,如果有当前元素距离body
顶端的距离是它的距离body
顶端的距离与定位父级距离body
顶端的距离之和。这里我写了两个递归来实现距离的计算getElementToPageTop
,getElementToPageLeft
。 - 点击其它的地方关闭菜单栏,这里在自定义指定的元素上点击右键时设置了一个标识,只有当这个标识为
false
的时候才不会关闭菜单栏。
结语
这个方法可以用来实现禁止剪切和复制网页内容…