fabricjs元素对齐方式实现

需求:
  canvas 画布实现选中元素【左对齐】、【右对齐】、【顶对齐】、【底对齐】、【垂直居中对齐】、【水平居中对齐】
 
相关库及版本:
  React(^18.2.0)、fabric(^5.2.4)
 
效果:

 

 

 

实现:
index.jsx
import React, { useEffect } from 'react';
import { fabric } from 'fabric';
import './index.less';

window.__cvs = null;
const Test = () => {
    useEffect(() => {
        // 初始化画布
        window.__cvs = new fabric.Canvas('canvas', {
            backgroundColor: '#fff',
            width: 400,
            height: 400,
        });

        // 添加三个不同颜色矩形元素
        const rect1 = new fabric.Rect({
            left: 100,
            top: 100,
            width: 70,
            height: 70,
            fill: '#E64B47',
        });

        const rect2 = new fabric.Rect({
            left: 150,
            top: 150,
            width: 60,
            height: 60,
            fill: '#E1D184',
        });

        const rect3 = new fabric.Rect({
            left: 200,
            top: 200,
            width: 50,
            height: 50,
            fill: '#895F41',
        });

        window.__cvs.add(rect1, rect2, rect3);
    }, []);

    return (
        <div className="test">
            <canvas id="canvas"></canvas>
            <div className="btns">
                <button
                    type="button"
                    onClick={() => {
                        const activeObjects = window.__cvs.getActiveObject();
                        activeObjects?._objects?.forEach((el) => {
                            const left = activeObjects.width / 2 - activeObjects.width;
                            el.set({
                                left,
                            });
                        });
                        window.__cvs.renderAll();
                    }}
                >
                    左对齐
                </button>

                <button
                    type="button"
                    onClick={() => {
                        const activeObjects = window.__cvs.getActiveObject();
                        activeObjects?._objects?.forEach((el) => {
                            const left = activeObjects.width - el.width - activeObjects.width / 2;
                            el.set({
                                left,
                            });
                        });
                        window.__cvs.renderAll();
                    }}
                >
                    右对齐
                </button>

                <button
                    type="button"
                    onClick={() => {
                        const activeObjects = window.__cvs.getActiveObject();
                        activeObjects?._objects?.forEach((el) => {
                            const top = activeObjects.height / 2 - activeObjects.height;
                            el.set({
                                top,
                            });
                        });
                        window.__cvs.renderAll();
                    }}
                >
                    顶对齐
                </button>

                <button
                    type="button"
                    onClick={() => {
                        const activeObjects = window.__cvs.getActiveObject();
                        activeObjects?._objects?.forEach((el) => {
                            const top = activeObjects.height - el.height - activeObjects.height / 2;
                            el.set({
                                top,
                            });
                        });
                        window.__cvs.renderAll();
                    }}
                >
                    底对齐
                </button>

                <button
                    type="button"
                    onClick={() => {
                        const activeObjects = window.__cvs.getActiveObject();
                        activeObjects?._objects?.forEach((el) => {
                            const left = (activeObjects.width - el.width) / 2 - activeObjects.width / 2;
                            el.set({
                                left,
                            });
                        });
                        window.__cvs.renderAll();
                    }}
                >
                    垂直居中对齐
                </button>

                <button
                    type="button"
                    onClick={() => {
                        const activeObjects = window.__cvs.getActiveObject();
                        activeObjects?._objects?.forEach((el) => {
                            const top = (activeObjects.height - el.height) / 2 - activeObjects.height / 2;
                            el.set({
                                top,
                            });
                        });
                        window.__cvs.renderAll();
                    }}
                >
                    水平居中对齐
                </button>
            </div>
        </div>
    );
};

export default Test;
View Code

index.less

.test {
    width: 100%;
    height: 100%;
    overflow-y: auto;
    .canvas-container {
        border: 1px solid #ddd;
        margin: 20px auto;
    }
    .btns {
        text-align: center;
        button {
            margin: 0 5px;
        }
    }
}
View Code

 

 

posted @ 2023-03-15 16:53  Zion0707  阅读(351)  评论(0编辑  收藏  举报