本文简介 Fabric。js默认没提供鼠标右键事件,只有鼠标按键点击、鼠标按键抬起、鼠标移动等事件。但在工作中有可能需要用到右键事件,比如右键菜单。所以就有了本文。 本文主要关注Fabric。js的主要api有:fireRightClick:允许右键点击stopContextMenu:禁用默认右键菜单mouse:down:鼠标点击事件 如果不知道Fabric。js的同学,可以看Fabric。js中文入门教程 本案例是使用原生方式开发,不基于Vue、React等框架,所以不用太担心运行环境等问题。 案例代码放了在文末 环境和版本Chrome浏览器版本:96。0。4664。45 Fabric。js版本:4。6。0 思路 先说说需求:右键单击元素,弹出菜单;弹出菜单分4种情况(菜单在鼠标右侧,菜单在鼠标左侧,菜单在鼠标上方,菜单在鼠标下方);左键单击画布其他地方,隐藏菜单; 实现思路:创建画布;创建菜单的DOM元素;去官网查找右键相关事件;右键单击在元素上,根据鼠标离画布边缘的距离,计算菜单要显示的位置;左键单击在画布上,隐藏菜单; 实现查文档 在上面的思路中,其实难点只有右键相关事件。 在对象相关的文档里,关于鼠标的事件好像没有右键,稍微沾边点的就是鼠标点击(这里我选了mousedown)。 于是我去画布的文档里找了下,发现这两个属性:fireRightClick:画布是否可以触发右键事件stopContextMenu:禁止默认右键菜单 哈哈哈哈,发达了 经我仔细观察,发现mouse:down事件里有个button属性:左键:button的值为1右键:button的值为3中键(也就是点击滚轮),button的值为2,前提需要设置fireMiddleClick:true 动手开发 布局style容器,相对定位。box{position:relative;}画布,给个边框canvas{border:1pxsolidccc;}菜单。menux{visibility:hidden;隐藏菜单zindex:100;position:absolute;top:0;left:0;boxsizing:borderbox;borderradius:4px;boxshadow:004pxrgba(0,0,0,0。3);backgroundcolor:fff;}菜单每个选项。menuli{boxsizing:borderbox;padding:4px8px;borderbottom:1pxsolidccc;cursor:pointer;}鼠标经过的选项,更改背景色。menuli:hover{backgroundcolor:antiquewhite;}第一个选项,顶部两角是圆角。menuli:firstchild{bordertopleftradius:4px;bordertoprightradius:4px;}最后一个选项,底部两角是圆角,底部不需要边框。menuli:lastchild{borderbottom:none;borderbottomleftradius:4px;borderbottomrightradius:4px;}style!容器(相对定位)!画布canvasidcanvaswidth600height600canvas!右键菜单(绝对定位,且默认是隐藏的)什么都不做什么都不做什么都不做什么都不做删除 此时的效果如上图所示。 初始化画布,并生成图形 添加点击事件(判断右键) 上面的代码中,通过opt。target是否为null来判断当前点击的对象。 opt。targetnull,就是点击在画布上(没有点击在图形元素上)。 如果你的项目需求是右键点击画布也展示不同菜单,你可以修改上面代码的判断。 代码仓库 推荐 Fabric。js中文入门教程 Fabric。js元素选中状态的事件与样式 Fabric。js拖放元素进画布掘金 Fabric。js渐变的用法(径向渐变和线性渐变)