惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
V
Visual Studio Blog
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 【当耐特】
MyScale Blog
MyScale Blog
月光博客
月光博客

博客园 - Zion0707

Codex接入DeepSeek token实现对话与操作,so easy! Openclaw只能聊天不能操作解决方案 Ubuntu从零搭建Openclaw Openclaw安装问题记录 React数字滚动,增加或减少效果 react hooks实现对元素拖拽及鼠标滚轮缩放 前端实现图片文字识别并提取 ECharts实现两条曲线数据比较,数据高出区域高亮显示 canvas实现视频播放并支持自动播放 fabricjs实现虚线流动动画效果 React国际化方案及示例 fabricjs如何导入echarts 萤石云视频监控和回放方案 React仿photoshop参考线功能 react-router-dom v6 使用 “DatePicker”不能用作 JSX 组件。 Element plus的tree组件实现单选和搜索功能 16进制相关操作方法 js 版 AES-128 算法加解密 js 版 React 下拉多选,全选/全不选功能组件
fabricjs元素对齐方式实现
Zion0707 · 2023-03-15 · via 博客园 - Zion0707
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;