Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Fabric.js 自定义控件

Fabric.js 自定义控件

作者头像
德育处主任
发布于 2023-03-12 02:44:17
发布于 2023-03-12 02:44:17
4.9K00
代码可运行
举报
运行总次数:0
代码可运行

本文简介

带尬猴,我是德育处主任

虽然 Fabric.js 提供的基础功能已经很丰富了,但有时难免需要定制一些需求。比如本文要讲的 『自定义控件』。掌握创建自定义控件这个功能,能够创建更加精美和实用的图形应用程序,提高用户体验和用户满意度。

尽管 Fabric.js 的文档很一般,但 demo 还挺丰富。本文讲解 Fabric.js 官网收录的 Custom controls, render and actions

自定义控件

先看看官方例子

这个例子创建了2个自定义控件,一个是复制,一个是删除。

官方代码我会放到文末,接下来我们试着创建一个“自定义删除控件”。

初始化画布和页面元素

按照 Custom controls, render and actions 的样式创建一个矩形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<canvas id="c" width="500" height="400" style="border:1px solid #ccc"></canvas>

<script>
  // 绑定页面画布
  let canvas = new fabric.Canvas('c')

  // 创建矩形
  let rect = new fabric.Rect({
    left: 100,
    top: 50,
    fill: 'yellow',
    width: 200,
    height: 100,
    objectCaching: false,
    stroke: 'lightgreen',
    strokeWidth: 4,
  })

  // 将矩形添加到画布里
  canvas.add(rect)
</script>

使用上面的代码就可以在画布中创建一个矩形。如果你对这些代码还不太熟悉的话,推荐阅读一下 《Fabric.js 中文入门教程》

创建删除按钮

创建自定义控件通常有一下2步操作:

  1. 创建控件
  2. 添加功能事件

Fabric.js 提供了 fabric.Control() 方法创建自定义控件。该方法可以定义控件的基础属性和事件绑定,基础属性包括控件位置、鼠标经过时的样式等。常用的事件有鼠标按下(mouseDownHandler)、鼠标抬起(mouseUpHandler)、鼠标拖拽(actionHandler)等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 省略前面的代码……

// 删除元素的方法
function deleteObject(eventData, transform) {
  let target = transform.target
  let canvas = target.canvas
  canvas.remove(target) // 删除元素
  canvas.requestRenderAll() // 刷新画布
}

// 创建自定义控件并添加到矩形里
rect.controls.deleteControl = new fabric.Control({
  x: 0.5,
  y: -0.5,
  offsetY: -16,
  offsetX: 16,
  cursorStyle: 'pointer', // 鼠标移到控件时的指针样式
  mouseUpHandler: deleteObject, // 鼠标抬起时触发的事件
  render: function(ctx, left, top, styleOverride, fabricObject) { // 渲染一个粉红色的正方形
    ctx.save()
    let size = this.cornerSize
    ctx.fillStyle = 'pink'
    ctx.translate(left, top)
    ctx.fillRect(-size / 2, -size / 2, size, size)
    ctx.restore()
  },
  cornerSize: 24
})

fabric.Control() 方法接收一个对象参数,该对象有一个 render 属性用来渲染自定义控件。这里面涉及到部分原生 canvas 的基础知识,比如 ctx.save()ctx.restore() ,这部分内容给我在 《canvas 状态管理》 里提到过,有兴趣的工友可以去看看。

Custom controls, render and actions 的代码

前面讲到的就是创建自定义控件的基本方法, Fabric.js 官网收录的 Custom controls, render and actions 例子中使用了 base64 格式的图片作为自定义控件的展示元素,而且还加多了一个复制元素的控件。经过前面的例子,相信你已经能看得懂 Custom controls, render and actions 的代码。

我把代码复制到这里,有兴趣的可以看看~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="controls">
  <p>
    <button id="add" onclick="Add()">Add a rectangle</button>
  </p>
</div>
<canvas id="c" width="500" height="400" style="border:1px solid #ccc"></canvas>

<script src="../js/fabric.js"></script>
<script>
  var canvas = this.__canvas = new fabric.Canvas('c');

  var deleteIcon = "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E%3Csvg version='1.1' id='Ebene_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='595.275px' height='595.275px' viewBox='200 215 230 470' xml:space='preserve'%3E%3Ccircle style='fill:%23F44336;' cx='299.76' cy='439.067' r='218.516'/%3E%3Cg%3E%3Crect x='267.162' y='307.978' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -222.6202 340.6915)' style='fill:white;' width='65.545' height='262.18'/%3E%3Crect x='266.988' y='308.153' transform='matrix(0.7071 0.7071 -0.7071 0.7071 398.3889 -83.3116)' style='fill:white;' width='65.544' height='262.179'/%3E%3C/g%3E%3C/svg%3E";

  var cloneIcon = "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='iso-8859-1'%3F%3E%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 55.699 55.699' width='100px' height='100px' xml:space='preserve'%3E%3Cpath style='fill:%23010002;' d='M51.51,18.001c-0.006-0.085-0.022-0.167-0.05-0.248c-0.012-0.034-0.02-0.067-0.035-0.1 c-0.049-0.106-0.109-0.206-0.194-0.291v-0.001l0,0c0,0-0.001-0.001-0.001-0.002L34.161,0.293c-0.086-0.087-0.188-0.148-0.295-0.197 c-0.027-0.013-0.057-0.02-0.086-0.03c-0.086-0.029-0.174-0.048-0.265-0.053C33.494,0.011,33.475,0,33.453,0H22.177 c-3.678,0-6.669,2.992-6.669,6.67v1.674h-4.663c-3.678,0-6.67,2.992-6.67,6.67V49.03c0,3.678,2.992,6.669,6.67,6.669h22.677 c3.677,0,6.669-2.991,6.669-6.669v-1.675h4.664c3.678,0,6.669-2.991,6.669-6.669V18.069C51.524,18.045,51.512,18.025,51.51,18.001z M34.454,3.414l13.655,13.655h-8.985c-2.575,0-4.67-2.095-4.67-4.67V3.414z M38.191,49.029c0,2.574-2.095,4.669-4.669,4.669H10.845 c-2.575,0-4.67-2.095-4.67-4.669V15.014c0-2.575,2.095-4.67,4.67-4.67h5.663h4.614v10.399c0,3.678,2.991,6.669,6.668,6.669h10.4 v18.942L38.191,49.029L38.191,49.029z M36.777,25.412h-8.986c-2.574,0-4.668-2.094-4.668-4.669v-8.985L36.777,25.412z M44.855,45.355h-4.664V26.412c0-0.023-0.012-0.044-0.014-0.067c-0.006-0.085-0.021-0.167-0.049-0.249 c-0.012-0.033-0.021-0.066-0.036-0.1c-0.048-0.105-0.109-0.205-0.194-0.29l0,0l0,0c0-0.001-0.001-0.002-0.001-0.002L22.829,8.637 c-0.087-0.086-0.188-0.147-0.295-0.196c-0.029-0.013-0.058-0.021-0.088-0.031c-0.086-0.03-0.172-0.048-0.263-0.053 c-0.021-0.002-0.04-0.013-0.062-0.013h-4.614V6.67c0-2.575,2.095-4.67,4.669-4.67h10.277v10.4c0,3.678,2.992,6.67,6.67,6.67h10.399 v21.616C49.524,43.26,47.429,45.355,44.855,45.355z'/%3E%3C/svg%3E%0A"

  var deleteImg = document.createElement('img');
  deleteImg.src = deleteIcon;

  var cloneImg = document.createElement('img');
  cloneImg.src = cloneIcon;

  fabric.Object.prototype.transparentCorners = false;
  fabric.Object.prototype.cornerColor = 'blue';
  fabric.Object.prototype.cornerStyle = 'circle';

  function Add() {
    var rect = new fabric.Rect({
      left: 100,
      top: 50,
      fill: 'yellow',
      width: 200,
      height: 100,
      objectCaching: false,
      stroke: 'lightgreen',
      strokeWidth: 4,
    });

    canvas.add(rect);
    canvas.setActiveObject(rect);
  }

  function renderIcon(icon) {
    return function renderIcon(ctx, left, top, styleOverride, fabricObject) {
      var size = this.cornerSize;
      ctx.save();
      ctx.translate(left, top);
      ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle));
      ctx.drawImage(icon, -size/2, -size/2, size, size);
      ctx.restore();
    }
  }

  fabric.Object.prototype.controls.deleteControl = new fabric.Control({
    x: 0.5,
    y: -0.5,
    offsetY: -16,
    offsetX: 16,
    cursorStyle: 'pointer',
    mouseUpHandler: deleteObject,
    render: renderIcon(deleteImg),
    cornerSize: 24
  });

  fabric.Object.prototype.controls.clone = new fabric.Control({
    x: -0.5,
    y: -0.5,
    offsetY: -16,
    offsetX: -16,
    cursorStyle: 'pointer',
    mouseUpHandler: cloneObject,
    render: renderIcon(cloneImg),
    cornerSize: 24
  });

  Add();

  function deleteObject(eventData, transform) {
    var target = transform.target;
        var canvas = target.canvas;
      canvas.remove(target);
      canvas.requestRenderAll();
    }

  function cloneObject(eventData, transform) {
    var target = transform.target;
    var canvas = target.canvas;
    target.clone(function(cloned) {
      cloned.left += 10;
      cloned.top += 10;
      canvas.add(cloned);
    });
  }
</script>

代码仓库

基础自定义控件用法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Fabric.js 橡皮擦的用法(包含恢复功能)
Fabric.js 的基础包并没有包含橡皮擦模块,如果你的项目需要使用橡皮擦,要使用定制版的 Fabric.js 。
德育处主任
2022/09/23
2.7K0
Fabric.js 橡皮擦的用法(包含恢复功能)
从零开发一款图片编辑器Mitu-Dooring
我们知道,为了提高企业研发效能和对客户需求的快速响应,现在很多企业都在着手数字化转型,不仅仅是大厂(阿里,字节,腾讯,百度)在做低代码可视化这一块,很多中小企业也在做,拥有可视化低代码相关技术背景的程序员也越来受重视。
徐小夕
2021/09/03
1.2K0
从零开发一款图片编辑器Mitu-Dooring
fabric.js和高级画板
本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式、网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角
磊哥
2018/05/08
11.3K1
fabric.js和高级画板
基于Vue + fabric.js的图片标注组件搭建
做这个组件的初衷,是基于AI组的标注识别,传送一张图片以及图片上的一些坐标,返回对应的识别结果,前端要做的就是基于一张图片,在图片上绘制出相应的标注框,并将标注框对应的坐标以及宽高传送给后端进行识别,这是最基础的需求。在图片上进行绘制,首先想到的是用canvas,cancas强大的功能能让我们在图片上为所欲为,原生的canvasapi众多且繁杂,上手不易,fabric是一个基于canvas的强大的框架,提供一种类似面向对象的方法来编写canva,在原生canvas之上提供了交互式对象模型,通过简洁的api就可以在画布上进行丰富的操作。因此选择fabric来作为基础框架。
扬起
2022/06/28
5.7K1
基于Vue + fabric.js的图片标注组件搭建
Fabric.js 控制元素层级 👑
元素数量多了,难免会产生重叠。又或者某些效果需要几个元素重叠起来。这些情况大概率需要控制元素的层级。
德育处主任
2022/08/31
4K0
Fabric.js 控制元素层级 👑
Fabric.js 居中元素 🎗️
阅读本文需要你有一定的 Fabric.js 基础,如果还不太了解 Fabric.js 是什么,可以阅读 《Fabric.js 从入门到膨胀》
德育处主任
2022/06/10
3.7K0
Fabric.js 居中元素 🎗️
Fabric.js 自定义选框样式
框选是 fabric.js 默认提供的一种操作,fabric.js 提供了几个属性可以设置选框样式。
德育处主任
2022/09/23
2.3K0
Fabric.js 自定义选框样式
Fabric.js 讲解官方demo:Stickman
Fabric.js 官网有很多有趣的Demo,不仅可以帮助我们了解其功能,还可以为我们提供创意灵感。其中,Stickman是一个非常有趣的例子。
德育处主任
2023/05/03
8200
Fabric.js 讲解官方demo:Stickman
Fabric.js 从入门到________
如果你需要用 canvas 做特效,那我推荐你使用 Fabric.js ,因为 Fabric.js 语法更加简单易用,而且还提供了很多交互类的 api。
德育处主任
2022/04/17
13.5K0
Fabric.js 从入门到________
Fabric.js 拖拽顶点修改多边形形状
其实 Fabric.js 官网也有这个demo:Fabric.js demos · Custom controls, polygon 。但这个demo可能对于刚接触 Fabric.js 的工友来说有点过于复杂,所以本文就把该demo进一步简化,简化到老奶奶也能看得懂的!
德育处主任
2023/05/11
2K0
Fabric.js 拖拽顶点修改多边形形状
Fabric.js 样式不更新怎么办?
不知道你有没有遇到过在使用 Fabric.js 时无意中一些骚操作修改了元素的样式,但刷新画布却没更新元素样式?
德育处主任
2023/02/26
2.9K0
Fabric.js 样式不更新怎么办?
Fabric.js 保存自定义属性
但从上图可以看出,创建 矩形rect 时自定义了一个 my_id 的属性,但输出时却看不到 my_id。
德育处主任
2022/10/28
2.9K0
Fabric.js 保存自定义属性
Fabric.js 使用图片遮盖画布(前景图)
在 《Fabric.js 使用纯色遮挡画布(前景色)》 中讲到使用纯色的方式遮盖画布。如果你的常见需要使用图片来遮盖的话,fabric.js 也提供了相应的属性来配置。
德育处主任
2022/09/23
1.9K0
Fabric.js 使用图片遮盖画布(前景图)
Fabric.js 铅笔笔刷
fabric.js 的铅笔其实是继承基础画笔的一个工具,在基础画笔的基础上多了“拐角平滑度”等配置项。
德育处主任
2022/09/23
1.6K0
Fabric.js 铅笔笔刷
Fabric.js 笔刷到底怎么用?
之前写过 《Fabric.js 橡皮擦的用法》 也用到了绘图模式,有兴趣的可以去看看。
德育处主任
2022/06/10
3.6K0
Fabric.js 笔刷到底怎么用?
Fabric.js 复制粘贴元素
当你要复制一个 fabric 的元素时,你考虑到的是什么?是深拷贝当前选中对象再添加到画布中?
德育处主任
2023/06/10
7290
Fabric.js 复制粘贴元素
Fabric.js 自定义子类,创建属于自己的图形~
虽然 fabric.js 提供了非常简单的方法创建自定义子类,但如果需要创建复杂的图形,还是需要有一定 canvas 基础的。
德育处主任
2022/09/23
1.7K0
Fabric.js 自定义子类,创建属于自己的图形~
动态海报营销FabricJs方案
Fabric.js是一个可以简化Canvas程序编写的库。 Fabric.js为Canvas提供所缺少的对象模型, svg parser, 交互和一整套其他不可或缺的工具。Fabric.js可以做很多事情,如下:
张炳
2019/10/15
3.5K0
动态海报营销FabricJs方案
Fabric.js 拖拽平移画布
不过我们可以利用一些小技巧让画布具有被拖拽的能力,fabric.js 官网也提供了一个 demo ,但文档上并没有详细的讲解拖拽画布的实现原理。
德育处主任
2022/09/23
3.4K0
Fabric.js 拖拽平移画布
聊聊 19.7k Star 的 canvas 绘图神器 fabric.js
我们想在画布上画个基本的简单形状的时候,使用 Canvas 不会觉得有什么繁琐。但当画布上需要任何形式的互动,绘制复杂的图形和在特定情况需要改变图片的时候,使用原生 canvas API 将会变得很困难。 而 Fabric 旨在解决这个问题。
秋风的笔记
2021/09/22
3.6K0
聊聊 19.7k Star 的 canvas 绘图神器 fabric.js
相关推荐
Fabric.js 橡皮擦的用法(包含恢复功能)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验