验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

fabric.js图层功能独立显隐、添加、删除、预览怎么实现

阅读:519 来源:乙速云 作者:代码code

fabric.js图层功能独立显隐、添加、删除、预览怎么实现

原理

fabric本身有提供group功能,本意是让你将画布上的一些元素组合起来,这也将成为本次图层功能的基础 既以一个group代表一个图层,画布下第一层children只有图层(group),而在group中,才是用户实际绘制的内容

效果预览

本次demo实现:

  • 用户可手动添加/删除图层

  • 可对每个图层进行独立显隐操作,并反馈到画布中

  • 可对每个图层单独预览

效果图:

fabric.js图层功能独立显隐、添加、删除、预览怎么实现

小Tips

首先fabric是需要到官方上下载的,在选择你需要的模块后再进行打包

虽然npm上也可以下载,但那不是官方的包,是有网友打包好以后上传的,其中没有包含橡皮擦模块,很可能会不符合你的需求

所以我个人建议你可以自行去官网上打包,然后传到你的私有npm库里,然后就可以通过npm来管理了

fabric自定义打包下载地址:Custom Fabric build — Fabric.js Javascript Canvas Library (fabricjs.com)

fabric的事件文档:Event inspector | Fabric.js Demos (fabricjs.com)

接下来的demo将会通过直接引入的方式来使用fabric,虽然我平时写项目都是ts,但练手demo我个人建议还是js,问就是省事

完整代码

目录:

  • fabric.js即为官网下载的插件包,这个文件就不放了,大家可以自行去官网打包下载

  • index.html即本次的页面,主要负责dom的处理,直接扔浏览器运行就可以

  • sketchpad.js 是对fabric的二次封装,同时也避免在html中写太多fabric功能代码

fabric.js图层功能独立显隐、添加、删除、预览怎么实现

index.html代码




    
    
    
    Document
    


    
        
            
            
                增加图层
                
                    {{ item.show ? '已显示' : '已隐藏'}}
                    
                    {{ item.name }}
                    删除
                
            
                                                                                               整个画布预览:                                                              

sketchpad.js代码

console.log('Sketchpad load');
class Sketchpad {
    /** fabric实例 */
    instance = null;
    /** 当前所在图层的id */
    currentLayer = '';
    /** 画布宽度 */
    width = 600;
    /** 画布高度 */
    height = 600
    /** 事件订阅 */
    listeners = {
        /**
         * 图层内容变化时的回调
         * @param {string} id 图层id
         * @param {base64} data 图层内容的base64格式
         */
        change: (id, data) => {}
    }
    constructor(id, listeners) {
        this.instance = new fabric.Canvas(id);
        this.width = this.instance.width;
        this.height = this.instance.height;
        this.instance.isDrawingMode = true;
        this.listeners.change = listeners.change
        this.instance.on('object:added', ((options) => {
                if (options.target.type === 'group') return;
                const groups = this.instance.getObjects()
                groups.forEach(v => {
                    if (v.layerId === this.currentLayer  && v.type === 'group') {
                        v.addWithUpdate(options.target);
                        this.instance.remove(options.target);
                        this.listeners.change(v.layerId, v.toDataURL({
                            width: this.width,
                            height: this.height
                        }))
                    }
                })
        }))
        console.log('Sketchpad init')
    }
    /** 添加图层 */
    addLayer(id) {
        const group = new fabric.Group([], {
            width: this.width,
            height: this.width,
        });
        // 在这里增加一个自定义属性 layerId ,用于区分图层
        group.layerId = id
        this.instance.add(group)
        this.currentLayer = id;
            this.listeners.change(id, group.toDataURL({
                width: this.width,
                height: this.height
            }))
    }
    /** 改变图层的显示/隐藏 */
    changeLayerVisible(id) {
        const groups = this.instance.getObjects()
        groups.forEach(v => {
            if (v.layerId === id && v.type === 'group') {
                v.visible = !v.visible;
                this.instance.renderAll() // 刷新画布,改变group的visible属性,必须通过刷新画布,才能应用新属性值
            }
        })
    }
    /** 选择要操作的图层 */
    changeCurrentLayer(id) {
        this.currentLayer = id
    }
    /** 删除图层 */
    deleteLayer(id) {
        const groups = this.instance.getObjects()
        groups.forEach(v => {
            if (v.layerId === id && v.type === 'group') {
                this.instance.remove(v)
                this.instance.renderAll() // 刷新画布
            }
        })
    }
    /** 获取画布数据,以img标签可以识别的base64格式 */
    getImage() {
        return this.instance.toDataURL()
    }
}

将以上这两个文件代码直接复制粘贴到编辑器里,然后再去打包个fabric.js也放进编辑器里,就可以运行啦

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>