HTML5画布框架fabricjs学习笔记(一)——引入

2023-10-25 07:20

本文主要是介绍HTML5画布框架fabricjs学习笔记(一)——引入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 它能做什么?
  • 安装与引入
    • 安装
    • 引入到项目中
    • 初始化
    • 代码
    • 结果
  • 绘制基础图形
    • 矩形(fabric.Rect)
      • 代码
      • 结果
    • 圆形(fabric.Circle)
      • 代码
      • 结果
    • 三角形(fabric.Triangle)
      • 代码
      • 结果
    • 直线(fabric.Line)
      • 代码
      • 结果
    • 文本框
      • 静态文本框(fabric.Text)
        • 代码
        • 结果
      • 可交互的单行文本框(fabric.IText)
        • 代码
        • 结果
      • 可交互的多行文本框(fabric.Textbox)
        • 代码
        • 结果
  • 总览
  • 系列博文
  • 后记

前言

由于需要实现一个前端的画布编辑器,因此找到了一个老牌的前端开源画布框架——fabricjs,他的维护者们目前仍在高速迭代着,大约每个月会有一个Release。我在撰写这篇博文时,它的最新Release版本是4.6.0

作为首篇博文,我们的目标是引入并实现一个画布,然后学习在其中绘制所有的基础对象,最终效果图如下:
请添加图片描述


它能做什么?

以下是官方的介绍:

  • fabricjs 是一个框架,可以很容易地使用HTML5 canvas元素。 它是一个位于画布元素之上的交互式对象模型。 它也是一个svg到画布的解析器。
  • 使用Fabric.js,你可以在画布上创建和填充对象; 对象喜欢简单的几何形状——矩形、圆形、椭圆、多边形或由成百上千条简单路径组成的更复杂的形状。 然后你可以用鼠标缩放、移动和旋转这些对象; 修改它们的属性、颜色、透明度、z-index等。 你也可以一起操作这些对象——通过简单的鼠标选择将它们分组。

按照通俗的理解,fabricjs是一个前端画布框架,它支持:

  1. 在画布上绘制圆、三角、矩形、线条等常规图形
  2. 在画布中添加文本框、图片等
  3. 通过鼠标与画布中的图形对象进行交互
  4. 导入并渲染SVG图片
  5. 将画布的数据序列化为JSON字符串,并在需要的时候将其反序列化并渲染出来

安装与引入

安装

npm install fabric

引入到项目中

import {fabric} from "fabric";

初始化

初始化时需要我们先创建一个HTML5的canvas标签,它需要几个必要的属性:

  • id:用于通过唯一标识和定位该canvas标签
  • width:不同于style中的width,用于表示画布的宽度
  • height:不同于style中的height,用于表示画布的高度

代码

  • html
    添加一个id为canvas,宽度为300px,长度为200px的canvas标签
<canvas id="canvas" width="300px" height="200px"/>
  • css
    为画布添加上边框
  #canvas {border: 1px solid black;}
  • javaScript
    实例化fabric的canvas对象
// 传入的"canvas"即上文中的标签id
// 这个canvas对象就是本文的主角,通过它对画布进行各种操作
let canvas = new fabric.Canvas("canvas");

结果

初始画布


绘制基础图形

矩形(fabric.Rect)

为了举例,我们绘制一个矩形在画布上

代码

  let properties = {left: 20,  // 左上角顶点横坐标20pxtop: 20,  // 左上角顶点纵坐标20pxfill: '#AFE164',  // 填充颜色为#AFE164width: 60,  // 宽度为60pxheight: 60,  // 高度为60pxobjectCaching: false,  // 对象缓存设为falsestroke: 'transparent',  //边框线颜色为透明strokeWidth: 1  //边框线宽度设为1px };let rect = new fabric.Rect(properties);// 将矩形添加到画布上canvas.add(rect);

结果

于是我们在画布上得到了:
在这里插入图片描述

圆形(fabric.Circle)

代码

  let properties = {left: 80,  // 左上角顶点横坐标80pxtop: 80,  // 左上角顶点纵坐标80pxfill: '#7DD2F0',  // 填充颜色为#7DD2F0radius: 30,  // 半径为30pxobjectCaching: false,  // 对象缓存设为falsestroke: 'transparent',  //边框线颜色为透明strokeWidth: 1  //边框线宽度设为1px};let circle = new fabric.Circle(properties);canvas.add(circle);

结果

在这里插入图片描述

三角形(fabric.Triangle)

代码

  let properties = {left: 120,  // 左上角顶点横坐标120pxtop: 40,  // 左上角顶点纵坐标40pxfill: '#B61234',  // 填充颜色为#B61234width: 50,height: 60,  // 半径为30pxobjectCaching: false,  // 对象缓存设为falsestroke: 'transparent',  //边框线颜色为透明strokeWidth: 1  //边框线宽度设为1px};let triangle = new fabric.Triangle(properties);canvas.add(triangle);

结果

在这里插入图片描述

直线(fabric.Line)

代码

  let points = [140, 20, 240, 40];  // 两个点确定一条直线,[x1, y1, x2, y2]let properties = {strokeWidth: 4,  //线段宽度设为4pxstroke: "#000000",  // 线段颜色为#000000objectCaching: false  // 对象缓存设为false};let line = new fabric.Line(points, properties);canvas.add(line);

结果

在这里插入图片描述

文本框

文本框有三种:基础静态文本框Text,可交互的单行文本框IText和可交互的多行文本框Textbox。关系上,IText继承了Text,Textbox又继承了IText。

  fabric.Text = fabric.util.createClass(fabric.Object, {...});fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, {...});fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {...});

静态文本框(fabric.Text)

Text是静态的文本框,仅显示设定的文本,类似于一个Label,不可交互。
构造方法接受两个参数textoptions

    initialize: function(text, options) {...}
  • text:要显示的文本内容
  • option:初始的一些属性,如topleftstroke
代码
  let properties = {left: 180,  // 左上角顶点横坐标180pxtop: 100,  // 左上角顶点纵坐标100pxstrokeWidth: 1,  // 字体宽度1pxfontSize: 24,  // 字体大小24pxfill: "orange",  // 字体颜色为橘色objectCaching: false  // 对象缓存设为false};let text = new fabric.Text("Static Text", properties);canvas.add(text);
结果

在这里插入图片描述

可交互的单行文本框(fabric.IText)

IText是可交互的单行文本框,顾名思义,其有两个特点:

  1. 可交互,用户可通过双击使其变为编辑态,并可修改其中的文本内容,失去焦点时即退出编辑态。
  2. 单行,当其中的文本内容越来越多时,其宽度width会变得越来越大以适应不断增多的文字,不会换行,因此当文字过多时他会超出画布,超出话不得部分无法显示出来。
代码
	let properties = {left: 60,  // 左上角顶点横坐标60pxtop: 160,  // 左上角顶点纵坐标140pxfontSize: 24,  // 字体大小24pxfill: "pink",  // 字体颜色为粉色objectCaching: false  // 对象缓存设为false};let iText = new fabric.IText("Interactive one line Text", properties);canvas.add(iText);
结果

请添加图片描述

可交互的多行文本框(fabric.Textbox)

TextboxIText的区别是,前者可以固定宽度值width,当其中的文本内容越来越多时,其高度height会按需膨胀,即将超过宽度的文字自动流入下一行。

代码
	let properties = {left: 10,  // 左上角顶点横坐标10pxtop: 140,  // 左上角顶点纵坐标140pxfontSize: 24,  // 字体大小24pxfill: "purple",  // 字体颜色为紫色width: 210,  // 最大宽度为210pxobjectCaching: false  // 对象缓存设为false};let textbox = new fabric.Textbox("Interactive multi-line Text", properties);canvas.add(textbox);
结果

可见,文本内容的总长度超过设定的210px时,fabric.Textbox会自动换行
请添加图片描述


总览

现在再来看看这一节中,我们的画布,和绘制出来的所有基础对象
请添加图片描述

本节完整代码见CodeSandbox


系列博文

HTML5画布框架fabricjs学习笔记(一)——引入
HTML5画布框架fabricjs学习笔记(二)——图片与背景
HTML5画布框架fabricjs学习笔记(三)——自定义选择控制框样式

(以下博文创作中,敬请期待)
HTML5画布框架fabricjs学习笔记(四)——用户交互(上)


后记

开始学习使用fabricjs之后,由于作者是外国人,因此第一手的文档都是英文的。在这过程中通过自行翻译、理解,并对照等着代码和注释进行学习,对深入理解大神的代码颇有裨益。

从这篇博文开始,我会写一些使用该框架过程中的踩坑、爬坑经过,还有一些基于该框架的我自己实现的功能。

这篇关于HTML5画布框架fabricjs学习笔记(一)——引入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/280956

相关文章

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交