采用d3开发流程设计器(二)添加右键菜单

上一节完成了架子的搭建以及节点的拖拽,这节完成节点菜单右键的操作
需求:
1、右键点击节点,弹出菜单,选中属性菜单项,右边再弹出菜单配置panel
2、点击其他节点或者界面空白处隐藏下拉菜单

效果图:
1、右键节点弹出菜单
在这里插入图片描述
点击属性节点弹出右边的panel
在这里插入图片描述

其中的核心代码:
第一步:注册右键菜单

   node.append("circle")
        .attr("r", nodeWidth)
        .attr("fill", nodeColor)
        .on("click", d => {
            //左键盘点击 则隐藏右键菜单
            this.vueMethods.hideNodeMenu&&this.vueMethods.hideNodeMenu();
            //隐藏以前相应的选中状态
            this.svgObj.selectAll("rect")
                .attr("fill-opacity", 0)
                .attr("stroke-opacity", 0);
            //将当前节点设置为选中状态
            window.d3.select("#"+"rect_"+d.id)
                .attr("fill-opacity", 1)
                .attr("stroke-opacity", 1);
            console.log(d,"====");
        })
        .on("contextmenu", d => {
            this._showNodeMenu(d);
        })
    ;
    // .attr("cx", 20)
    // .attr("cy", 20);

    node.append("text")
        .attr("x", -nodeWidth/2)
        .attr("y", "0.31em")
        .text(nodeText)
        .attr("fill", "#fff")
        .attr("stroke", "white")
        .attr("stroke-width", "0.5px")
        .style('stroke',"#FFF")
        .attr("stroke", "#fff")
        .on("click", d => {
            this.vueMethods.hideNodeMenu&&this.vueMethods.hideNodeMenu();
        })
        .on("contextmenu", d => {
            this._showNodeMenu(d);
        })
    ;

对圆圈和字都进行了菜单右键的注册,因为svg感觉没有事件冒泡这个说法,如果不是都注册可能导致点击没效果。

第二步:在vue的界面实现菜单

  <div class="flow-node-menu" id="nodeMenu" v-show="nodeMenuFlag">
            <div class="prop-menu-item" @click="propClick">
                <div class="pull-left">
                    <i class=" flow go-end"></i>
                </div>
                <div class="pull-left item_label">
                    <label>属性</label>
                </div>
            </div>
            <div class="prop-menu-item" @click="removeNodeClick">
                <div class="pull-left">
                    <i class=" flow go-end"></i>
                </div>
                <div class="pull-left item_label">
                    <label>删除</label>
                </div>
            </div>
        </div>

第三步:自然就是控制显示隐藏菜单的方法

 //显示节点但右键菜单信息
            showNodeMenu(x,elY,curNode){
                this.curNode=curNode;
                let {y}=GoingUtils.getElementPosition($("#flowLayout").get(0));
                this.nodeMenuFlag=true;
                if(x>0){
                    console.log(x,"====")
                    $("#nodeMenu").css("left",x+"px");
                }
                if(y>0){
                    console.log(y,"====")
                    $("#nodeMenu").css("top",elY-y+"px");
                }
            },

第四步:就是取消父界面的默认右键菜单操作,注册一个@contextmenu.prevent方法

<div slot="right" @contextmenu.prevent class="demo-split-pane" style="width: 100%;height: 100%;">
                <div style="overflow: auto;width: 100%;height: calc(100% - 40px);position: relative;">
                    <div id="treeContainer" style="width: 100%;height: 100%;position: relative;margin: auto;">

                    </div>

                </div>
            </div>

第五步:准备右边的panel,我用的ivew的Drawer组件

      <Drawer  :inner="true" width="300"  :transfer="false" :mask-closable="false" :mask="false" :closable="false" v-model="nodeProp">
            <div class="drawer-header">
                <div class="pull-left">
                    属性设置
                </div>
                <div class="pull-right" style="position: relative;top:-1px;color:#999;cursor: pointer;">
                    <i @click="closePropSetting" class=" goingicon go-doubleright"></i>
                </div>
            </div>
        </Drawer>

最后自然就是添加panle的控制与显示了

   //点击属性
            propClick(){
                this.nodeProp=true;
                this.nodeMenuFlag=false;
            },

基本思路和大概代码就是如此了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要为一张图片设置一个右键菜单,您需要使用HTML中的`contextmenu`属性和CSS来定义菜单的样式。下面是设置图片右键菜单的示例代码: HTML代码: ```html <img src="image.png" contextmenu="myMenu"> ``` 在这个例子中,我们为这张图片添加了一个`contextmenu`属性,并将它的值设置为`myMenu`,这是我们将在下面定义的菜单ID。 CSS代码: ```css /* 定义菜单的样式 */ #myMenu { position: absolute; z-index: 1; background-color: #f1f1f1; border: 1px solid #d3d3d3; border-radius: 5px; padding: 5px; } #myMenuOption1:hover, #myMenuOption2:hover { background-color: #e7e7e7; cursor: pointer; } ``` 在这个例子中,我们定义了菜单的样式,包括背景颜色、边框、圆角等。我们还使用`:hover`伪类为菜单选项定义了鼠标悬停时的样式,以及将鼠标光标更改为指针。 JavaScript代码: ```javascript /* 给菜单选项添加事件监听 */ var menuOption1 = document.getElementById("myMenuOption1"); menuOption1.addEventListener("click", function() { // 执行菜单选项1的操作 }); var menuOption2 = document.getElementById("myMenuOption2"); menuOption2.addEventListener("click", function() { // 执行菜单选项2的操作 }); /* 监听右键单击事件,并显示菜单 */ document.addEventListener("contextmenu", function(e) { var menu = document.getElementById("myMenu"); menu.style.display = "block"; menu.style.left = e.pageX + "px"; menu.style.top = e.pageY + "px"; e.preventDefault(); }); /* 监听单击事件,并隐藏菜单 */ document.addEventListener("click", function() { var menu = document.getElementById("myMenu"); menu.style.display = "none"; }); ``` 在这个例子中,我们为菜单选项1和菜单选项2添加了事件监听,以便在用户单击它们时执行相应的操作。我们还监听了右键单击事件,并显示菜单,同时防止默认的上下文菜单出现。最后,我们监听单击事件,并隐藏菜单。 需要注意的是,菜单的显示位置是相对于鼠标指针的位置来确定的,因此我们需要使用`e.pageX`和`e.pageY`属性来设置菜单的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值