本文最后更新于:2024-11-02T17:08:04+08:00
目录
前言
设计思路
BaseElem
Menu
CustomElement
BaseDrag
Drag
Resize
最终效果
总结
相关代码
前言
分享一下之前公司实现自定义菜单的思路,禁用浏览器右键菜单,使用自定义的菜单将其代替,主要功能有:鼠标右键调出菜单,双击选中/取消选中标签,新建标签,删除标签,调整位置,调整大小,取消拖拽,关闭菜单
设计思路
- MessageCenter来自于消息中心,为组件提供基础通信功能
- BaseElem: 自定义标签的基类,提供一些通用的方法和属性,继承自MessageCenter,通过消息中心对外通信
- Menu: 菜单类,用于创建和显示自定义菜单。它继承自BaseElem,实现创建菜单、渲染菜单列表等方法
- CustomElement: 自定义元素类,用于创建和操作自定义标签。它继承自BaseElem,提供创建标签、选中标签、复制标签、删除标签等方法
- BaseDrag: 拖拽基类,提供了基本的拖拽功能。它继承自BaseElem,实现鼠标事件的处理和触发
- Drag: 拖拽调整标签位置类,继承自BaseDrag,实现拖拽标签位置的功能
- Resize: 拖拽调整标签尺寸类,继承自BaseDrag,实现拖拽调整标签尺寸的功能。
BaseElem
自定义标签基类提供了移动和删除标签功能,它充当公共类的作用,后面的自定义标签都继承与该类
菜单类的作用是创建自定义菜单,代替浏览器原有的右键菜单。其中每个菜单子项的数据结构如下
菜单类
我们在HTML中使用一下菜单功能,通过label配置菜单选项,handler设置点击事件
效果如下
CustomElement
为了让菜单与被控标签解耦(实际上也没有联系),使用新的类承载标签管理。其中自定义标签主要包含以下功能:
create:新建标签
cloneNode:复制标签
removeEle:删除标签
select:选中/取消选中标签(通过双击触发该函数)
setCount:标签的计数器
结合上述类的实现,我们在页面中增加几种菜单
效果如下
BaseDrag
完成上述基础功能后,我们可以尝试对标签位置和大小进行修改,所以我们建立一个鼠标拖拽的基类,用来实现拖拽的公共函数
可以看到,上述的代码的__mouseHandler函数中我们对鼠标事件进行了拦截,并且借助消息中心将事件传递出去,方便后续的拓展
Drag
接着是拖拽移动标签的功能,该类拖拽了鼠标按下和移动的回调
Resize
最后我们将位置改成高度宽度,实现一下调整标签尺寸的类
最终效果
最后我们在HTML中使用上述的所有功能,演示一下全部功能
总结
当涉及到自定义菜单时,JavaScript提供了丰富的功能和API,让我们能够创建具有定制化选项和交互性的菜单。文章主要介绍了前端自定义菜单的实现过程,描述了创建标签、选中标签、复制标签、删除标签、拖拽位置及大小等功能。
以上就是文章全部内容了,感谢你看到了最后,如果觉得不错的话,请给个三连支持一下吧,谢谢!
相关代码
utils-lib-js: JavaScript工具函数,封装的一些常用的js函数
myCode: 基于js的一些小案例或者项目 - Gitee.com