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,百度了半天没有办法和思路,总不能为了一个…...
美容行业如何快速搭建自己的预约小程序?
现在,搭建一个专属于美容行业的预约小程序不再是只有程序员才能做到的事情了。有了一些小程序制作平台的存在,任何人都可以轻松地制作出自己的小程序。下面,我将揭秘一个快速搭建专属美容行业预约小程序的秘诀。 首先,登录小程序制…...
如何使用CSS实现一个水平居中和垂直居中的布局?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 水平居中布局⭐ 垂直居中布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣…...
关于css 的选择器和 css变量
css 选择器 常用的选择器 1. 后代选择器:也就是我们常见的空格选择器,选择的对象为该元素下的所有子元素 。例如,选择所有 元素下的 元素 div p{font-size:14px}2. 子元素选择器 ‘>’ 选择某元素下的直接子元素。例如,选择所…...
大数据技术概述(三)——编程语言的选择
文章目录 1.6编程语言的选择1.6.1java和Scala1.6.2Python1.6.3SQL 1.6编程语言的选择 大数据编程一般会使用Java、Scala和python等编程语言,Flink目前也支持上述3种语言。 1.6.1java和Scala Java支持多线程,其生态圈中可用的第三方库众多。Java虚拟机…...
Flutter对象状态动态监听Watcher
场景:当一个表单需要在表单全部或者特定项赋值后才会让提交按钮可点击。 1.普通实现方式: ///场景:检查[test11][test12][test13]均不为空时做一些事情,例如提交按钮变成可点击String? test11;String? test12;int? test13;///当…...
期权分仓开户资金是否安全?具体保障措施有哪些?
网上关于期权分仓系统的真假一直都没有定论,两方人的争论也让很多没有接触过期权分仓系统的人摸不着头脑,那么期权分仓靠谱吗?资金在里面安全吗?下文为大家科普期权分仓开户资金是否安全?具体保障措施有哪些? 一、期权…...
Unity Mac踩坑日记
1、读取外部文件夹使用IO,读取StreamingAsset或者Unity定义文件夹或者服务器文件使用www或者UnityRequest 2、mac下使用www 需要添加前缀:"file://" 3、Mac下的Rider很好用,断点调试也很方便 4、改变文件编码格式,使…...
什么是负载均衡
前提概述 关于负载均衡,我会从四个方面去说 1. 负载均衡产生的背景 2. 负载均衡的实现技术 3. 负载均衡的作用范围 4. 负载均衡的常用算法 负载均衡的诞生背景 在互联网发展早期,由于用户量较少、业务需求也比较简单。对于软件应用,我们只需要…...
尽管价格走势平淡,但DeFi领域仍然非常有趣
DEX代表加密货币交易的创新,就在去年,这些去中心化、非托管平台的活动与CEX比相形见绌,但自那时以来,DEX已经迎头赶上,并在几个月内超越了中心化服务交易量,让用户能够更好地控制自己的资产和进行新类型的交…...
RCU安全引用计数
原文网址:https://lwn.net/Articles/93617 原文作者:Corbet 原文时间:2004年7月14日 内核提供了一种用于实现引用计数的简单机制kref;该机制是今年3月份完成的。kref机制的核心思想是,提供支持原子操作的计数器&…...
平面设计接单的网站/友情链接英语
QVector与QList 数据量比较小时(小于1000项),没什么区别。 如果你需要开辟连续的内存空间存储,或者你的元素远比一个指针大,可以用QVector 按照索引获取元素时,QList比较快 追加插入元素时QVector大概快个百分之5 查找元素时QLis…...
桂林新闻网头条/seo需求
condition_variable 简介 在头文件< condition_variable >中,顾名思义是一个条件变量,主要功能是阻塞线程直到另一个线程把你唤醒。 条件两个字看起来似乎是指,在另一个线程中满足了条件,才把你唤醒;然而如果仅…...
做高仿网站有哪些/苏州百度推广公司地址
(1) 晶体管上拉电阻法 就是一个双极型三极管或 MOSFET,C/D极接一个上拉电阻到正电源,输入电平很灵活,输出电平大致就是正电源电平。 (2) OC/OD 器件上拉电阻法 跟 1) 类似。适用于器件输出刚好为 OC/OD 的场合。 (3) 74xHCT系列芯片升压 (3.3V→5V) 凡是输入与 5V TTL 电平兼容…...
网站建设的流程推广方案/成品ppt网站国外
硬件环境介绍:最近花了两周终于建成了Hyper-V Failover Clustering,多数时间基本上用在了去了解HP的刀片服务器及VC模块配置,由于是第一次使用所以去查询了很多文档,经过此次部署也对HP的刀片服务器有了点基本了解。先介绍下所使用…...
汕头公司做网站/seo分析师
我试图在约束布局的运行时将TextViews添加到另一个之下。但我总是只有一个文本视图,其余的隐藏在它后面。我尝试了几件事情,包括链接视图,但似乎没有任何工作。Android ConstraintLayout:如何将动态视图添加到另一个下方private v…...
wordpress showposts/2021百度最新收录方法
计算机网络 练习(一百一十) 当使用时间到达租约期的()时,DHCP 客户端和 DHCP 服务器将更新租约。 A. 50% B. 75% C. 87.5% D. 100% ---------------------------------------- 答案: A 解析: …...