• fabric 右键菜单


    import { fabric } from 'fabric';
    import { Rect } from './rect';
    
    /**
     * 按钮
     */
    export class ContextMenu {
        // 测试调用方法
        copy = 'copy';
        isMenuShow = false;
        isMenuEleShow = false;
    
        constructor(canvas) {
            // 设置启用右键,禁止默认右键菜单
            canvas.set({
                fireRightClick: true, // 启用右键,button 为 3
                stopContextMenu: true, // 禁止默认右键菜单
            });
            // 添加矩形
            canvas.add(new fabric.Rect(Rect.defaultRect()));
            // 添加菜单
            this.addContextMenu();
            // 绑定鼠标右键
            this.bindMouseClick(canvas);
        }
    
        /**
         * 添加右键菜单
         */
        addContextMenu(canvas) {
            let self = this;
            let ele = `
                <div id="contextMenuEle" class="contextMenu">
                    <div class="contextMenu-copy">复制</div>
                    <div class="contextMenu-cut">剪切</div>
                    <div class="contextMenu-delete">删除</div>
                    <div class="contextMenu-moveUp">上移</div>
                    <div class="contextMenu-moveDown">下移</div>
                    <div class="contextMenu-toTop">置顶</div>
                    <div class="contextMenu-toBottom">置底</div>
                    <div class="contextMenu-export">导出选中</div>
                    <div class="contextMenu-exportAll">导出全部</div>
                </div>
                <div id="contextMenu" class="contextMenu">
                    <div class="contextMenu-paste">粘贴</div>
                    <div class="contextMenu-revoke">撤销</div>
                    <div class="contextMenu-reDo">重做</div>
                    <div class="contextMenu-enlarge">放大</div>
                    <div class="contextMenu-reduce">缩小</div>
                    <div class="contextMenu-import">导入</div>
                    <div class="contextMenu-exportAll">导出全部</div>
                </div>`
            $('body').append(ele);
            // 绑定对应事件
            $('.contextMenu-copy').on('click', (e) => {
                self.doCopy(self);
            });
        }
    
        /**
         * 模拟调用事件
         * @param self
         */
        doCopy(self) {
            console.log(self.copy);
        }
    
        /**
         * 绑定鼠标点击事件
         * @param canvas
         */
        bindMouseClick(canvas) {
            canvas.on('mouse:down', (e) => {
                let menuId = 'contextMenu';
                let menuEleId = 'contextMenuEle';
                if (e.button === 3) {
                    if (e.target) {
                        let activeEle = e.target;
                        this.isMenuEleShow = true;
                        this.showMenu(e, menuEleId);
                        this.isMenuShow && (this.hideMenu(menuId), this.isMenuShow = false);
                    } else {
                        this.isMenuShow = true;
                        this.showMenu(e, menuId);
                        this.isMenuEleShow && (this.hideMenu(menuEleId), this.isMenuEleShow = false);
                    }
                } else {
                    this.isMenuShow && (this.hideMenu(menuId), this.isMenuShow = false);
                    this.isMenuEleShow && (this.hideMenu(menuEleId), this.isMenuEleShow = false);
                }
            });
        }
    
        /**
         * 显示菜单
         * @param e
         * @param showId
         */
        showMenu(e, showId) {
            // 默认 canvas 右键
            let menu = $(`#${ showId }`);
            let menuWidth = menu.width();
            let menuHeight = menu.height();
            let canvas = $('.upper-canvas');
            let canvasWidth = canvas.width();
            let canvasHeight = canvas.height();
            let pointX = e.pointer.x;
            let pointY = e.pointer.y;
            if (canvasWidth - pointX <= menuWidth) {
                pointX -= menuWidth - 10;
            } else {
                pointX += 10;
            }
            if (canvasHeight - pointY <= menuHeight) {
                pointY -= menuHeight - 8;
            } else {
                pointY += 12;
            }
            menu.css({
                top: pointY, // 鼠标指针稍下方
                left: pointX,
                visibility: 'visible',
            });
        }
    
        /**
         * 隐藏菜单
         */
        hideMenu(showId) {
            if (showId) {
                $(`#${ showId }`).css('visibility', 'hidden');
            } else {
                $('#contextMenuEle').css('visibility', 'hidden');
                $('#contextMenu').css('visibility', 'hidden');
            }
        }
    }
  • 相关阅读:
    [译]CasperJS,基于PhantomJS的工具包
    [译]JavaScript:typeof的用途
    [译]JavaScript写的一个quine程序
    [译]Ruby中的解构赋值
    [译]DOM:元素ID就是全局变量
    [译]ECMAScript 6中的集合类型,第一部分:Set
    [译]JavaScript:Array.prototype和[]的性能差异
    [译]Web Inspector开始支持CSS区域
    [译]JavaScript:反科里化"this"
    [译]JavaScript:用什么来缩进
  • 原文地址:https://www.cnblogs.com/guofan/p/16160160.html
Copyright © 2020-2023  润新知