fabric.js开发图片编辑器的细节实现

简介: 如何用vue和fabric.js快速开发一款编辑器,并利用fabric.js的api提供标准编辑器的能力。

之前写过一篇笔记,《使用fabric.js 快速开发一个图片编辑器》,简单介绍了如何用vue和fabric.js快速开发一款编辑器。

当时的版本比较粗糙,只能说是一个基础版的Demo,很多细节不够完善,参考了稿定设计和创客贴的设计编辑器,优化了很多必要的细节,也算是fabric.js的进阶用法,整理成笔记分享出来。

项目地址:https://github.com/nihaojob/vue-fabric-editor

预览地址:https://nihaojob.github.io/vue-fabric-editor/

正文

1、架构演进

最早的设计是将 fabric.js创建的canvas对象通过provide传递给子组件使用,功能代码封装到vue组件中。前期基础功能尚能满足,但后期迭代时发现无法复用功能代码,如复制功能原来以按钮的形式存在,代码全部在复制组件中,在后期迭代中要在快捷键和右键菜单中增加复制功能,没办法复用;

所以在原来的基础上,封装出Editor对象,将通用方法挂载到Editor对象上实现复用。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/bf36aa6ba093d0d603d68482d201f0c78d2b1f2c/src/core/index.js#L19

2、辅助线

辅助线是很常见的必要功能,官方提供了辅助线方法,在官方仓库中,只需要引入方法即可。

实现代码:https://github.com/fabricjs/fabric.js/blob/master/lib/aligning_guidelines.js

3、控制条样式

稿定设计和创客贴的元素控制条看起来都很精致,而fabric.js自带的控制条较为简陋,可以通过自定义样式方法把控制条修饰的稍微美观一些。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/main/src/core/initControls.js

4、右键菜单

fabric.js并没有自带右键菜单的功能,但可以监听到右键菜单事件,我们可以通过监听方法来实现右键菜单功能。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/bf36aa6ba093d0d603d68482d201f0c78d2b1f2c/src/components/mouseMenu.vue#L72

5、快捷键功能

快捷键可以提高操作效率,比如组合/拆分组合、复制、删除等,只需要将快捷键事件和Editor的功能方法做绑定即可快速实现快捷键功能。

快捷键监听有现成的工具库hotkeys-js,只需要绑定事件即可。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/main/src/core/initHotKeys.js

6、锁定图层

锁定元素可以让元素不可编辑,比如下图中的白色背景元素,设置大小和位置后就不希望再选中和它,可以设置图层锁定,这样编辑上方元素时就会干扰到下方元素。

使用selectable属性控制元素不可选中,需要注意的点是,当我们遍历所有元素时,要对锁定元素单独处理。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/bf36aa6ba093d0d603d68482d201f0c78d2b1f2c/src/components/lock.vue#L41

7、画布大小调整

最早的版本的画布大小调整就是对fabric.js的canvas大小做调整,这样做有2个问题,一是没办法将画布大小保存到json文件中,另外一个问题是缩小放画布时,缩小后画布颜色和背景颜色一致,无法区分画布的边界,效果较差。

最后的实现思路是,使用矩形元素模拟画布区域,fabric.js的canvas大小根据视口DOM的宽高自适应,通过调整矩形元素属性来设置画布到大小和颜色,其他元素通过属相面板修改属性。这样就解决了上边的2个问题。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/main/src/core/initWorkspace.js

8、元素画布超出区域

参考稿定设计和创客贴的编辑器,都有一个细节,就是当元素拖出画布区域后,看不到元素但可以展示控制条,由于画布是通过矩形模拟出来的,通过clipPath可以便捷的实现。

实现代码:https://github.com/nihaojob/vue-fabric-editor/commit/8512e3293f991dc8b2633669c4feb1514dca9a02

9、拖拽到画布

将基础元素添加到画布有两种方式,一种是点击元素,会添加到画布中央,另一种是直接拖拽元素到画布,可以将元素添加到指定位置,使用拖拽事件实现。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/bf36aa6ba093d0d603d68482d201f0c78d2b1f2c/src/components/tools.vue#L163

10、渐变配置

渐变在背景、字体颜色上很常用,fabric.js有提供渐变的配置方法,我们只需要按照纯色、渐变2种方式设置颜色即可,功能已实现,细节需要优化,没有合并到main分支。

实现代码:https://github.com/nihaojob/vue-fabric-editor/blob/f85fede86b37be0a22362cd68c346cab19ef507e/src/components/attribute.vue#L493

结尾

开源过程中遇到很多志同道合的开发者,为项目提供思路、代码、PR ,让项目从0涨到了600star,感谢大家的帮助,希望能够继续迭代,打磨成像稿定设计和创客贴一样好用的开源图形编辑器。

目前的版本仍在继续迭代,很多细节还不完善,基础功能还在补充,比如滤镜设置、图片替换、图片裁剪、字体样式模板等,还有一些文档、vue3升级、单元测试的工作。

在开发的过程中我的收获也很大,如果你也比较感兴趣,是fabric.js的爱好者或者自己也在开发类似的项目,欢迎加入交流群,期待你的Issue和PR,一起打造一款好用的设计编辑器。

致谢:

  • June 多次深夜为项目贡献代码,提供快捷键、右键菜单等功能。
  • xiaozeo 宝妈百忙中为项目提交代码,让属性面板更美观。
  • icleitoncosta 异国他乡的开发者朋友,提供了国际化功能。
  • asang28 为项目提供了vue3版本代码。
  • 晗萧℡ 会自己写编辑器的设计师,多次为项目提供代码示例。
  • RHS 为项目提供缩放思路、标尺代码。
  • 放牛哥 为项目提供代码和实现思路。
  • 冯志辉 一直在关注我们,为我们加油打气。
  • ...

篇幅有限,不再一一列举名单,感谢大家的支持与帮助,希望vue-fabric-editor在未来的日子里不负期望,和大家一起越变越好。

相关文章
|
8天前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
35 0
|
3天前
|
JavaScript API 数据库
深入理解Node.js事件循环及其在后端开发中的应用
【9月更文挑战第3天】本文将深入浅出地介绍Node.js的事件循环机制,探讨其非阻塞I/O模型和如何在后端开发中利用这一特性来处理高并发请求。通过实际的代码示例,我们将看到如何有效地使用异步操作来优化应用性能。文章旨在为读者揭示Node.js在后端开发中的核心优势和应用场景,帮助开发者更好地理解和运用事件循环来构建高性能的后端服务。
|
3天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【9月更文挑战第3天】本文将带你走进Node.js的世界,通过深入浅出的方式,让你了解Node.js的基本概念、特性以及如何在后端开发中应用。我们将从Node.js的安装开始,逐步深入到异步编程模型、事件驱动机制等核心概念,最后通过一个简单的Web服务器示例,让你对Node.js有一个全面的认识。无论你是前端开发者还是后端开发者,只要你对Node.js感兴趣,这篇文章都将为你打开一扇新的大门。
|
6天前
|
Kubernetes JavaScript Cloud Native
深入浅出Node.js后端开发
【8月更文挑战第31天】在数字化浪潮中,云原生技术如同星辰大海中的航船,引领企业乘风破浪。本文将带你从Docker容器的基础出发,探索至Kubernetes集群的奥秘,用代码示例点亮技术的灯塔,助你在云原生的海洋中找到属于自己的航道。
|
6天前
|
JavaScript 开发者
深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第31天】 本文将带你走进Node.js的事件循环机制,通过浅显易懂的语言和实例代码,揭示其背后的工作原理。我们将一起探索如何高效利用事件循环进行异步编程,提升后端应用的性能和响应速度。无论你是Node.js新手还是有一定经验的开发者,这篇文章都能给你带来新的启发和思考。
|
6天前
|
开发者 Java 存储
JSF 与 CDI 携手共进,紧跟技术热点,激发开发者情感共鸣,开启高效开发新征程
【8月更文挑战第31天】JavaServer Faces (JSF) 与 Contexts and Dependency Injection (CDI) 在 Java EE 领域中紧密协作,助力开发者高效构建现代 Web 应用。JSF 凭借其丰富的组件库和页面导航功能受到青睐,而 CDI 则优雅地管理对象生命周期并实现依赖注入。两者结合,不仅简化了复杂企业应用的开发,还实现了松耦合架构,增强了代码的灵活性、可维护性和可扩展性。通过示例展示了如何利用 CDI 将业务服务对象注入 JSF Managed Bean,以及如何在不同页面间共享数据,突显了这一组合的强大功能。
19 0
|
6天前
|
大数据 数据处理 分布式计算
JSF 逆袭大数据江湖!看前端框架如何挑战数据处理极限?揭秘这场技术与勇气的较量!
【8月更文挑战第31天】在信息爆炸时代,大数据已成为企业和政府决策的关键。JavaServer Faces(JSF)作为标准的 Java Web 框架,如何与大数据技术结合,高效处理大规模数据集?本文探讨大数据的挑战与机遇,介绍 JSF 与 Hadoop、Apache Spark 等技术的融合,展示其实现高效数据存储和处理的潜力,并提供示例代码,助您构建强大的大数据系统。
13 0
|
7天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【8月更文挑战第31天】在数字时代的浪潮中,Node.js以其非阻塞、事件驱动的特性,成为炙手可热的后端技术。本文将带你领略Node.js的魅力所在,从搭建开发环境到实战演练,我们用浅显易懂的语言和生动的例子,让你轻松掌握Node.js后端开发的精髓。无论你是新手还是有经验的开发者,这篇文章都将为你的技术之路添砖加瓦。
|
7天前
|
SQL 缓存 JavaScript
深入浅出Node.js后端开发
【8月更文挑战第31天】本文将带你走进Node.js的世界,从基础到进阶,逐步深入探讨如何在后端开发中利用Node.js的异步特性和丰富的库来构建高效、可扩展的应用。我们将通过实际代码示例,展示如何搭建一个简单的RESTful API,并讨论最佳实践和性能优化策略。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技能。
|
7天前
|
JavaScript 安全 数据安全/隐私保护
深入Node.js与Express:从表单接收到数据验证的完整指南——实战技巧揭秘后端开发中的表单处理流程
【8月更文挑战第31天】在Web开发中,处理表单数据至关重要。本文通过实例详细讲解了如何利用Node.js与Express框架接收和验证表单数据。首先,搭建环境并初始化一个简单的Express应用;接着,演示如何接收用户注册表单中的`username`和`email`字段;最后,引入`joi`模块进行数据验证,确保数据安全准确。掌握这些技能有助于开发者构建更安全、友好的Web应用。随着Node.js和Express的不断进步,未来将有更多高级功能值得期待。
14 0
下一篇
DDNS