Fabric.js 元素选中状态的事件与样式
本文简介
带尬猴!
你是否在使用 Fabric.js
时希望能在选中元素后自定义元素样式或选框(控制角和辅助线)的样式?
如果是的话,可以放心往下读。
本文将手把脚和你一起过一遍 Fabric.js
在对象元素选中后常用的样式设置。
我将对象元素选中后的设置分成3类进行讲解:
- 控制角
- 辅助边
- 其他样式
- 状态
准备工作
创建一个画布和一个圆形。为什么是圆形而不是矩形?等下你就知道了。
<canvas id="c" style="border: 1px solid #ccc;"></canvas><script>const canvas = new fabric.Canvas('c', {width: 400,height: 400,})let circle = new fabric.Circle({top: 80,left: 80,radius: 50,fill: '#ffde7d' // 淡黄色})canvas.add(circle)
</script>
一个蛋黄出现了。上面这段代码是 Fabric.js
的基础。如果不太了解或者忘记语法了,可以查看 《Fabric.js 从入门到膨胀》。
我最近也在整理 Fabric.js
的常用方法,有兴趣的可以看看 《Fabric.js中文教程》
约定
本文所说的控制角和辅助边请看下图。翻译能力有限,将就理解下吧~
控制角
控制角就是选中元素后周边出现的几个方形。
实心控制角
默认情况下,控制角是空心的。也就是只有边框,没有填充色。
如果想要做成实心的控制角,只需将元素的 transparentCorners
属性设置为 true
即可。
// 省略部分代码
let circle = new fabric.Circle({transparentCorners: false,// 其他配置...
})
控制角颜色
元素的 cornerColor
属性可以控制控制角的颜色。
// 省略部分代码
let circle = new fabric.Circle({transparentCorners: false,cornerColor: 'pink',// 其他配置...
})
此时控制角的边框颜色和填充颜色都变成了粉红色。
控制角边框颜色
如果你想单独设置控制角的边框颜色也行!要设置的属性叫 cornerStrokeColor
。
// 省略部分代码
let circle = new fabric.Circle({transparentCorners: false,cornerColor: 'pink',cornerStrokeColor: 'blue',// 其他配置...
})
控制角大小
想修改控制角的大小,可以修改 cornerSize
的值。
// 省略部分代码
let circle = new fabric.Circle({cornerSize: 30,// 其他配置...
})
和前面的例子对比,将 cornerSize
设置成 30
之后,控制角明显大了很多。
控制角边框虚线规则
控制角那几个小把手的边框是可以设置成虚线的。要调整的参数是 cornerDashArray
,该参数的值是一个数值型数组。
虚线的规则主要分以下几种情况:
- 数组只有1个元素:虚线和实现的长度相等。
- 数组有2个元素:第一个元素是实线长度,第二个元素是虚线长度。
- 数组有3个或3个以上的元素:实线、虚线、实线、虚线…… 一直轮回下去。
为了方便演示,我先将控制角的尺寸设置得大一点。
情况1:数组只有1个元素
// 省略部分代码
let circle = new fabric.Circle({cornerSize: 30,cornerDashArray: [4],// 其他配置...
})
情况2:数组有2个元素
// 省略部分代码
let circle = new fabric.Circle({cornerSize: 30,cornerDashArray: [4, 10],// 其他配置...
})
情况3:数组有3个或3个以上的元素
// 省略部分代码
let circle = new fabric.Circle({cornerSize: 30,cornerDashArray: [4, 10, 20],// 其他配置...
})
控制角形状
控制角除了是正方形外,还可以将它设置成圆形。只需将 cornerStyle
设置为 circle
即可。
// 省略部分代码
let circle = new fabric.Circle({cornerStyle: 'circle',// 其他配置...
})
辅助边
前面说完控制角,接下来讲讲辅助边
辅助边颜色
我们可以通过 selectionBackgroundColor
属性设置辅助边的颜色。
// 省略部分代码
let circle = new fabric.Circle({borderColor: 'red',// 其他配置...
})
辅助边粗细
设置辅助边粗细的属性名叫 borderScaleFactor
。
// 省略部分代码
let circle = new fabric.Circle({borderScaleFactor: 4,// 其他配置...
})
辅助边虚线规则
设置辅助边虚线规则使用的属性是 borderDashArray
。使用规则和 cornerDashArray
是一样的。
// 省略部分代码
let circle = new fabric.Circle({borderDashArray: [10, 20, 30],// 其他配置...
})
其他样式
内边距
设置内边距的属性是 padding
,这名字和 css
的内边距是一样的。
在 Fabric.js
中,给元素设置了内边距,会影响控制角和辅助边到元素边缘的距离。
padding
接受一个数值,不需要传入单位。
// 省略部分代码
let circle = new fabric.Circle({padding: 20,// 其他配置...
})
和前面的例子对比一下,将 padding
设置为 20
后,辅助边和元素之间的距离明显增大了。
背景色
这里所说的背景色和 css
里面的背景色不是同一回事。
本文要介绍 Fabric.js
的背景色有2种。一种是元素自身的背景色,另一种是选中后的背景色。
在 Fabric.js
里,背景色和填充色是两回事。
- 填充色:
fill
- 背景色:
backgroundColor
- 选中后的背景色:
selectionBackgroundColor
填充色是基础,忘了的话可以查看 《Fabric.js 从入门到膨胀》 ,本文不再讲解。
Fabric.js
是以矩形的方式去计算元素占位面积的,这也很好理解,比较方便嘛。所以使用 backgroundColor
设置背景颜色就能看到元素占据多大面积了。
// 省略部分代码
let circle = new fabric.Circle({fill: '#ffde7d',backgroundColor: '#f6416c',// 其他配置...
})
而 selectionBackgroundColor
属性是设置元素选中后的背景色。
但需要注意,如果你同时设置了 backgroundColor
和 selectionBackgroundColor
,重叠的部分 backgroundColor
的优先级更高。
那什么地方才是不重叠的地方呢?那就是设置了 padding
的地方。
// 省略部分代码
let circle = new fabric.Circle({fill: '#ffde7d',backgroundColor: '#f6416c',padding: 20,selectionBackgroundColor: '#00b8a9',// 其他配置...
})
移动元素时的透明度
元素移动时会先进入选中状态。此时会产生控制角和辅助线。
你可以使用 borderOpacityWhenMoving
设置控制角和辅助线的透明度。这个属性接受 0 ~ 1
的值。
0
表示完全透明,1
表示完全不透明。
注意,borderOpacityWhenMoving 设置的是『移动时』控制角和辅助边的透明度。 重点词是 『移动时』。
// 省略部分代码
let circle = new fabric.Circle({borderOpacityWhenMoving: 0.1,// 其他配置...
})
本例将 borderOpacityWhenMoving
设置为 0.1
,所以移动时就只能隐隐约约看到控制角和辅助边了。
状态
我把能否选中、局部控制操作等内容放在“状态”章节里。
禁止选中
如果你不希望元素被选中,可以将元素的 selectable
属性设置为 false
。
// 省略部分代码
let circle = new fabric.Circle({borderOpacityWhenMoving: 0.1,// 其他配置...
})
无法通过空白区域操作元素
如果图形不是矩形,在选中元素后,辅助边和图形之间会有一个空白区。也就是前面用 backgroundColor
填充的那部分。
箭头所指的4个地方都是空白区域。
默认情况下,你可以点击空白区选中或者拖拽图形。
但如果你希望只能点击图形区域才能选中图形的话,可以将图形的 perPixelTargetFind
属性设置为 true
。
// 省略部分代码
let circle = new fabric.Circle({perPixelTargetFind: true,// 其他配置...
})
隐藏控制角
可以通过 hasControls
属性设置控制角的显示和隐藏。
如果将 hasControls
设置为 false
,就会将控制角隐藏起来,你也就无法通过控制角去缩放和旋转元素了。
// 省略部分代码
let circle = new fabric.Circle({hasControls: false,// 其他配置...
})
隐藏辅助边
同样你也可以将辅助边隐藏起来,只需将 hasBorders
属性设置为 false
即可。
// 省略部分代码
let circle = new fabric.Circle({hasBorders: false,// 其他配置...
})
设置控制角的可见性
前面将 hasControls
属性设置为 false
后就可以隐藏所有控制角。
其实 Fabric.js
还提供了2个方法可以单独设置指定控制角的可见性:
setControlsVisibility(optionsopt)
:批量设置控制角可见性setControlVisible(controlKey, visible)
:单独设置控制角可见性
这两个方法的作用是一样的,只是使用方式上有点不同。
需要注意的是,一旦把控制角隐藏起来,就意味着不能通过被隐藏的控制角去缩放和旋转元素了。
在使用者两个方法之前,你需要了解一堆属性:tl
, tr
, br
, bl
, ml
, mt
, mr
, mb
, mtr
,它们分别对应9个控制点,如下图所示。
setControlsVisibility(optionsopt)
setControlsVisibility()
方法接收一个对象参数,在这对象中可以描述要显示或者隐藏哪些控制角。
比如我想把左上角和右下角隐藏。
// 省略部分代码
let circle = new fabric.Circle({// 其他配置...
})circle.setControlsVisibility({tl: false,br: false
})
setControlVisible(controlKey, visible)
setControlVisible()
方法一次只能设置1个控制角的可见性,它接收2个参数。第一个参数是要操作的控制角,第二个参数是控制角的显示状态。
比如我想将左下角的控制角隐藏起来。
// 省略部分代码
let circle = new fabric.Circle({// 其他配置...
})circle.setControlsVisibility('bl', false)
返回控制角的可见性
可以使用 isControlVisible(controlKey)
方法获取控制角当前的可见性。
// 省略部分代码
let circle = new fabric.Circle({// 其他配置...
})circle.setControlsVisibility('bl', false)console.log(circle.isControlVisible('bl')) // 返回 false
console.log(circle.isControlVisible('br')) // 返回 true
获取当前被选中的对象
Fabric.js
还提供了2个方法可以捕捉到当前被选中的对象。这2个方法分别叫 getActiveObject()
和 getActiveObjects()
。需要在 canvas
对象中调用的。
getActiveObject()
和 getActiveObjects()
从名字来看就已经知道,末尾没加 s
的就是返回当前选中的元素;末尾加了 s
的就是返回当前选中的所有元素(比如通过框选操作选择了一堆元素)。
选中元素时,getActiveObject()
会返回的当前元素对象,而 getActiveObjects()
则返回一个数组集合。
没选中元素时,getActiveObject()
会返回 null
,而 getActiveObjects()
会返回一个空数组。
可以通过这两个方法获取当前选中的对象再做其他操作(比如修改填充颜色、描边颜色、描边粗细等)。
代码仓库
⭐ Fabric.js 元素选中状态的事件与样式
推荐阅读
我最近在整理 Fabric.js
常用方法,有兴趣的可以看看 《Fabric.js中文教程》
👍《Fabric.js 拖放元素进画布》
👍《Fabric.js 限制边框宽度缩放》
👍《Fabric.js 监听元素相交(重叠)》
👍《Fabric.js 橡皮擦的用法(包含恢复功能)》
👍《Fabric.js 喷雾笔刷 从入门到放肆》
👍《Fabric.js 设置容器类名要注意这几点》
点赞 + 关注 + 收藏 = 学会了 代码仓库
相关文章:

Fabric.js 元素选中状态的事件与样式
本文简介 带尬猴! 你是否在使用 Fabric.js 时希望能在选中元素后自定义元素样式或选框(控制角和辅助线)的样式? 如果是的话,可以放心往下读。 本文将手把脚和你一起过一遍 Fabric.js 在对象元素选中后常用的样式设置…...

数据通信——传输层(UDP)
引言 我们上网观看比赛的时候,一旦网络信号出现问题,那可就太难受了,这意味着卡顿的时间内,你会错过这段时间内的内容。这种特性要归功于UDP(User Datagram Protocol)用户数据报协议。 无连接性 一般的&am…...

Python(八十六)字符串的编码与解码
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...
Android OkHttp 源码浅析二
OkHttp 配置参数: get:JvmName("dispatcher") val dispatcher: Dispatcher builder.dispatcherget:JvmName("connectionPool") val connectionPool: ConnectionPool builder.connectionPool/*** Returns an immutable list of interceptors that observe…...

Python(八十四)字符串的切片操作
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...

【QT】绘制旋转等待
很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 程序中经常会遇到耗时的操作,需要提供等待的窗口,防止用户多次点击造成卡顿等问题。本文分享旋转等待技术,希望对各位小伙伴有所帮助!结果如下:...

Electron学习3 使用serialport操作串口
Electron学习3 使用serialport操作串口 一、准备工作二、 SerialPort 介绍1. 核心软件包(1) serialport(2) serialport/stream(3) serialport/bindings-cpp(4) serialport/binding-mock(5) serialport/bindings-interface 2. 解析器包3. 命令行工具 三、创建一个demo程序1. 创建…...

激活函数总结(十七):激活函数补充(PELU、Phish)
激活函数总结(十七):激活函数补充 1 引言2 激活函数2.1 Parametric Exponential Linear Unit(PELU)激活函数2.2 Phish激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、…...

[bug日志]springboot多模块启动,在yml配置启动端口8081,但还是启动了8080
【问题描述】 配置的启动端口是8081,实际启动端口是8080 【解决方法】 1.检查application.yml的配置是否有错误(配置项中,显示白色就错,橙色无措) 2.检查pom.xml的打包方式配置项配置,主pom.xml中的配置项一般为:&l…...

【每日易题】七夕限定——单身狗问题以及进阶问题位运算法的深入探讨
君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,在写这篇博客的前一天是七夕,也是中国传统的“情人节”,不知道各位脱单了吗?碰巧最近刷题时遇到了经典的单身狗问题想带大家深入探…...

消息队列前世今生 字节跳动 Kafka #创作活动
消息队列前世今生 1.1 案例一: 系统崩溃 首先大家跟着我想象一下下面的这个的场景, 看到新出的游戏机,太贵了买不起,这个时候你突然想到,今天抖音直播搞活动,打开抖音搜索,找到直播间以后&am…...

『SEQ日志』在 .NET中快速集成轻量级的分布式日志平台
📣读完这篇文章里你能收获到 如何在Docker中部署 SEQ:介绍了如何创建和运行 SEQ 容器,给出了详细的执行操作如何使用 NLog 接入 .NET Core 应用程序的日志:详细介绍了 NLog 和 NLog.Seq 来配置和记录日志的步骤日志记录示例&…...

Django会话技术
文章目录 Cookie实践运行结果 CSRF防止CSRF Session实践 Cookie 理论上,一个用户的所有请求燥作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆,而web应用程序是使用HTTP协议传输数据的。HTT…...
Tree of Thoughts: Deliberate Problem Solving with Large Language Models
本文是LLM系列的文章,针对《Tree of Thoughts: Deliberate Problem Solving with Large Language Models》的翻译。 思维树:用大模型进行深思熟虑的问题解决 摘要1 引言2 背景3 思维树:用LM进行深思熟虑的问题解决4 实验5 相关工作6 讨论 摘…...

C语言刷题(13)
第一题 第二题 第三题 第四题 第五题 第六题 第七题 注意 1.nsqrt(n),sqrt本身不会将n开根 2.初始化已经令sumn了,故相加的个数为m-1次...

RK3568 uart串口
一.简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传 输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信 距离远,但是速度相对会低&a…...

企业数字化转型中,VR数字展厅能有哪些体验?
在数字化转型的浪潮下,企业纷纷开始注重数字展厅的开展,VR虚拟展厅结合VR全景技术,可以创造出许多有趣的玩法和体验,无论是虚拟参观、互动体验还是VR云会议对接,都为企业客户带来了全新的感知方式。 同传统展厅相比&am…...
关于cesium中tif文件处理加载在三维地图中得方式
项目场景: 在Gis项目关于tif影像数据是不能直接在地图上面加载,只能通过后端进行处理,或者前端进行处理之后才能叠加到地图上面! 处理方式 1.安装geotiff插件 npm install geotiff -g2.利用插件处理tif文件 import GeoTIFF, { fromBlob, fromUrl, fromArrayBuff…...

JAVA结合AE(Adobe After Effects)AE模板文件解析生成视频实现类似于逗拍(视频DIY)的核心功能
最近看抖音上有很多各种视频表白生成的直播而且直播间人很多,于是就思考如何实现的视频内的文字图片内容替换的呢 ,答案需要用到类似与逗拍一样的视频DIY的功能,苦于我是java,百度了半天没有办法和思路,总不能为了一个…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...