首页 fabric.js实现批量复制

fabric.js实现批量复制

2024-07-02 22:31:23 296 0

前端

fabric.js在选中多个object之后,如果执行复制,代码一般这样写:

var all=canvas.getActiveObjects();
                if (all.length) { // 如果有选中的物体
                    var allCopy=[];
                    all.forEach(function(object) { // 遍历选中的物体数组
                        var clonedObject = fabric.util.object.clone(object); // 复制元素

                        clonedObject.left  =  object.left +10; // 水平方向上偏移 10 个像素
                        clonedObject.top  =  object.top +10; // 垂直方向上偏移 10 个像素

                        allCopy.push(clonedObject);
                    });
                    allCopy.forEach(item=>{
                        canvas.add(item);
                    })

                    canvas.discardActiveObject().renderAll(); // 更新画布并取消选中状态
                }else{
                    alert('请选择一个产品')
                }

但是有一个问题,就是算出来的高度会变成负数。

经过计算,这个top与left是相对选中的所有object的中心点来计算的。

于是修改:

var all=canvas.getActiveObjects();
                if (all.length) { // 如果有选中的物体
                    var allCopy=[];
                    all.forEach(function(object) { // 遍历选中的物体数组
                        var clonedObject = fabric.util.object.clone(object); // 复制元素

                        clonedObject.left  = object.group.left+object.left+(object.group.width/2)+10; // 水平方向上偏移 10 个像素
                        clonedObject.top  = object.group.top+object.top+(object.group.height/2)+10; // 垂直方向上偏移 10 个像素

                        allCopy.push(clonedObject);
                    });
                    allCopy.forEach(item=>{
                        canvas.add(item);
                    })

                    canvas.discardActiveObject().renderAll(); // 更新画布并取消选中状态
                }else{
                    alert('请选择一个产品')
                }

同时产生一个问题,复制出来的元素也是相对整体的位置,只有shift+左键选择之后才可以到达预期的位置。

 

最终代码如下,模拟选中一次。

var all=canvas.getActiveObjects();
                if (all.length) { // 如果有选中的物体
                    var allCopy=[];
                    all.forEach(function(object) { // 遍历选中的物体数组
                        var clonedObject = fabric.util.object.clone(object); // 复制元素

                        clonedObject.left  = object.group.left+object.left+(object.group.width/2)+10; // 水平方向上偏移 10 个像素
                        clonedObject.top  = object.group.top+object.top+(object.group.height/2)+10; // 垂直方向上偏移 10 个像素

                        allCopy.push(clonedObject);
                    });
                    allCopy.forEach(item=>{
                        canvas.add(item);
                    })
                    const activeSelection = new fabric.ActiveSelection(allCopy, {
                        canvas: canvas
                    });
                    canvas.setActiveObject(activeSelection);
                    canvas.discardActiveObject().renderAll(); // 更新画布并取消选中状态
                }else{
                    alert('请选择一个产品')
                }

 

 

 

用户留言