Fabric.js 修改画布交互方式作用详解

目录
  • 本文简介
  • 动手试试
  • 和 hasControls 、hasBorders 的区别
  • 和 StaticCanvas 的区别
  • 总结

本文简介

fabric.js 为我们提供了很多厉害的方法。今天要搞明白的一个东西是 canvas.interactive

官方文档对 canvas.interactive 的解释是:

Indicates that canvas is interactive. This property should not be changed.

canvas.interactive 默认值是 true ,官方建议我们不要修改该值,但我偏不。

动手试试

先来看看将 interactive 设为 false 之后有什么效果。

创建一个画布,并在上面添加一个矩形。

<canvas id="canvasBox" width="400" height="400" style="border: 1px solid #ccc;"></canvas>
<script>
  let canvas = new fabric.Canvas('canvasBox', {
    interactive: false // 隐藏交互模式
  })
  let rect = new fabric.Rect({
    top: 60,
    left: 60,
    width: 60,
    height: 60,
    fill: '#08d9d6'
  })
  canvas.add(rect)
</script>

从上面的效果可以看到,选中元素后并没有出现默认的控制点,但还是可以操作元素的缩放和旋转的(旋转的那个操作,我是猜了大概的操作点在那个位置)。

难怪官方劝大家不要修改 interactive ,确实有他的道理。

和 hasControls 、hasBorders 的区别

hasControlshasBorders 需要在图形元素上设置。

hasControls 设置成 false 就会取消元素选中时的控制角。

hasBorders 设置成 false 就会取消元素被选中时的控制边。

<canvas id="canvasBox" width="400" height="400" style="border: 1px solid #ccc;"></canvas>
<script>
  let canvas = new fabric.Canvas('canvasBox')
  let rect = new fabric.Rect({
    top: 60,
    left: 60,
    width: 60,
    height: 60,
    fill: '#08d9d6',
    hasControls: false, // 取消控制角
    hasBorders: false // 取消控制边
  })
  canvas.add(rect)
</script>

从上图的效果可以看出,将 hasControlshasBorders 设置成 false 后,元素可以移动,但不能缩放和旋转。

和 StaticCanvas 的区别

如果不希望画布可交互,可以使用 StaticCanvas 创建一个静态的画布。

只要将 new fabric.Canvas 改成 new fabric.StaticCanvas 就行了。

<canvas id="canvasBox" width="400" height="400" style="border: 1px solid #ccc;"></canvas>
<script>
  let canvas = new fabric.StaticCanvas('canvasBox')
  let rect = new fabric.Rect({
    top: 60,
    left: 60,
    width: 60,
    height: 60,
    fill: '#08d9d6'
  })
  canvas.add(rect)
</script>

瞧,使用了 StaticCanvas 创建的画布,里面的元素选不中也拉不动。

而只是将 interactive 设置成 false 的话,是可以进行操作的。

总结

  • interactive 设置为 false:可操作(移动、旋转、缩放等),但看不见控制角和控制边。
  • 将元素的 hasControlshasBorders 设置成 false :可移动,但不能旋转和缩放,同时看不见控制角和控制边。
  • 使用 StaticCanvas 创建画布:元素无法被选中,也无法移动、选中、缩放等操作。

综上所述,在日常开发中,canvas.interactive 真的好像没啥用耶(我还没想到有什么应用场景)。

代码仓库

Fabric.js 修改画布交互方式

以上就是Fabric.js 修改画布交互方式作用详解的详细内容,更多关于Fabric.js 修改画布交互的资料请关注我们其它相关文章!

(0)

相关推荐

  • JS前端轻量fabric.js系列物体基类

    目录 前言 FabricObject 基类的实现 抽离共同属性 抽离共同方法 Rect 类的实现 本章小结 前言 在上个章节中我们已经创建了画布,接下来就可以进行物体的绘制了,那具体要怎么画呢?根据文章标题可以猜到应该是要抽象出一个物体基类,归纳出一些它们的共性,那它们能有啥共性呢,毕竟每个物体好像都是各画各的.对于这个问题大家可以先简单思考几秒钟再往下看

  • canvas操作插件fabric.js使用方法详解

    fabric.js是一个很好用的 canvas 操作插件,下面整理了一些平时项目中用到的知识点: //1: 获得画布上的所有对象: var items = canvas.getObjects(); //2: 设置画布上的某个对象为活动对象. canvas.setActiveObject(items[i]); //3:获得画布上的活动对象 canvas.getActiveObject() //4:取消画布中的所有对象的选中状态. canvas.discardActiveObject(); //5:

  • JS前端以轻量fabric.js实现示例理解canvas

    目录 缘起 fabric.js 初体验 fabric.js 的大体结构 canvas 能干嘛? 小结 缘起 最近想系统看下 canvas 这个东西,所以找了一个库看看,本来打算写一两篇文章沉淀一下,发现东西有点多

  • JS前端轻量fabric.js系列之画布初始化

    目录 前言 画布的前置知识 画布初始化 变换练习 小结 前言 从这个章节开始我们就步入正题了,那一开始要做啥子呢,回忆下上个章节中 fabric.js 的使用过程,先是创建画布,再添加物体,然后开始动画和交互.显然画布是一切物体的开端,所以首先要搞定的就是它,也就是 const canvas = new fabric.Canvas('canvas') 这一步要做的事情. 画布的前置知识 在说 fabric.js 如何初始化画布之前,先巩固下画布的相关知识点.创建画布要做的事情通常比较简单,就是单

  • fabric.js实现diy明信片功能

    本文实例为大家分享了fabricjs实现diy明信片功能的具体代码,供大家参考,具体内容如下 前言 要求需要添加,拷贝,删除,双指放大缩小. 提示:以下是本篇文章正文内容,下面案例可供参考 一.fabric.js是一个很好用的 canvas 操作插件 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. 二.代码示例 代码如下(示例): <!DOCTYPE html> <html lang="en"> <head>

  • Fabric.js 修改画布交互方式作用详解

    目录 本文简介 动手试试 和 hasControls .hasBorders 的区别 和 StaticCanvas 的区别 总结 本文简介 fabric.js 为我们提供了很多厉害的方法.今天要搞明白的一个东西是 canvas.interactive . 官方文档对 canvas.interactive 的解释是: Indicates that canvas is interactive. This property should not be changed. canvas.interacti

  • Fabric.js 实现变换视窗示例详解

    目录 引言 viewportTransform 缩放 斜切 平移 setViewportTransform(vpt) 引言 fabric.js 可以通过 viewportTransform 属性配置画布的视窗属性. 听上去很高级的样子,但其实这是原生 canvas 就已经存在的东西,fabric.js 的 viewportTransform 也就直接复用了原生 canvas 的 transform() . fabric.js 官方文档上也是这么说的 viewportTransform :Arra

  • JS中的防抖与节流及作用详解

    概念 函数防抖(debounce)是指在一定时间内,在动作被连续频繁触发的情况下,动作只会被执行一次,也就是说当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间,所以短时间内的连续动作永远只会触发一次,比如说用手指一直按住一个弹簧,它将不会弹起直到你松手为止. 函数节流是指一定时间内执行的操作只执行一次,也就是说即预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期,一个比较形象的例子是如果将水龙头拧紧直到水是以水滴的形式流出

  • Vue.js中对css的操作(修改)具体方式详解

    使用v-bind:class或者v-bind:style或者直接通过操作dom来对其样式进行更改: 1.v-bind:class || v-bind:style 其中v-bind是指令,: 后面的class 和style是参数,而class之后的指在vue的官方文档里被称为'指令预期值'(这个不必深究,反正个人觉得初学知道他叫啥名有啥用就好了)同v-bind的大多数指令(部分特殊指令如V-for除外)一样,除了可以绑定字符串类型的变量外,还支持一个单一的js表达式,也就是说v-bind:clas

  • vue-vuex中使用commit提交mutation来修改state的方法详解

    在vuex中,关于修改state的方式,需要commit提交mutation.官方文档中有这么一句话: 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation. 为了搞清楚其原因,查阅了很多资料,发现其它人在做vuex的源码解析的时候,并没有将这点说的很明白. 所以只好自己去查看vuex的源码,并且自己做demo进行验证. 但是试验后,发现直接修改state时,store中的state能够改变,并且是响应式的,并没有报错.跟commit提交mutation的方式没啥区别. 后

  • MutationObserver在页面水印实现起到的作用详解

    目录 背景 实现水印 恶意修改 MutationObserver 背景 大家平时在开发中或者在面试中,难免都会遇到一个问题——给页面加水印,其实这并不难,但是也是有一些注意点的,所以说看似简单的功能,要尽力做到: 1.严谨性 2.安全性 实现水印 其实实现水印并不难,只需要利用自定义指令 + canvas + background-image即可,实现起来也非常方便: import type { Directive, App } from 'vue' interface Value { font

  • vue.js+boostrap项目实践(案例详解)

    一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变得更美观和更容易,同时vue.js又是可以绑定model和view(这个相当于MVC中的,M和V之间的关系),使得对数据变换的操作变得更加的简易,简化了很多的逻辑代码. 二.学习这篇文章需要具备的知识 1.需要有vue.js的知识 2.需要有一定的HTML.CSS.JavaScript的基础知识 3

  • JS中多种方式创建对象详解

    1.内置对象创建 var girl=new Object(); girl.name='hxl'; console.log(typeof girl); 2.工厂模式,寄生构造函数模式 function Person(name){ var p=new Object();//内部进行实例化 p.name=name; p.say=function(){ console.log('my name is '+ p.name); } return p;//注:一定要返回 } var girl=Person('

  • JavaScript知识点总结(十一)之js中的Object类详解

    JavaScript中的Object对象,是JS中所有对象的基类,也就是说JS中的所有对象都是由Object对象衍生的.Object对象主要用于将任意数据封装成对象形式. 一.Object类介绍 Object类是所有JavaScript类的基类(父类),提供了一种创建自定义对象的简单方式,不再需要程序员定义构造函数. 二.Object类主要属性 1.constructor:对象的构造函数. 2.prototype:获得类的prototype对象,static性质. 三.Object类主要方法 1

  • Node.js+Express配置入门教程详解

    Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度非常快,性能非常好.Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好.Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型

随机推荐