美文网首页fabric
Fabric.js介绍 第八部分

Fabric.js介绍 第八部分

作者: 优秀的收藏转载分享 | 来源:发表于2020-06-09 16:41 被阅读0次

新的clipPath属性

在2.4.0中,我们为所有对象引入了clipPath属性。 ClipPath将替换clipTo: funcion() {},试图获得相同的灵活性但更好的兼容性。

如何使用

创建自己的clipPath作为普通的Fabric对象,并将其指定给要剪辑的对象的clipPath属性。
根据SVG规范中的定义,clipPath没有描边,而是充满黑色,与黑色像素重叠的对象的像素将是可见的,而与黑色像素重叠的对象的像素将是可见的。
让我们从一些基本的例子开始,让我们看看它是什么样的。
在第一个示例中,一个红色的rectable被一个圆圈夹住,只有圆圈内的部分是可见的。虽然不是很有用,但是基本的功能是这样的。
请注意:clipPath位于从物体中心开始的位置,物体的originX和originY不起任何作用,而clipPath的originX和originY则起作用,定位逻辑与fabric.Group相同。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex1');
  var clipPath = new fabric.Circle({
    radius: 40,
    top: -40,
    left: -40
  });
  var rect = new fabric.Rect({
    width: 200,
    height: 100,
    fill: 'red'
  });
  rect.clipPath = clipPath;
  canvas.add(rect);
})()

我们可以剪下一个组合:
查看demo

(function() {
  var canvas = new fabric.Canvas('ex2');
  var clipPath = new fabric.Circle({
    radius: 100,
    top: -100,
    left: -100
  });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

或者我们可以用组合来剪辑。在组合的情况下,记住组合中的每个对象在逻辑上都是,没有非零偶数的剪裁规则:

查看demo

(function() {
  var canvas = new fabric.Canvas('ex3');
  var clipPath = new fabric.Group([
    new fabric.Circle({ radius: 70, top: -70, left: -70 }),
    new fabric.Circle({ radius: 40, left: -95, top: -95 }),
    new fabric.Circle({ radius: 40, left: 15, top: 15 }),
  ], { left: -95, top: -95 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

更多高级用法

嵌套clipPaths

clipTo的一个问题和canvas.clip()的用法是你不能有多个clipPath。
通过这种实现,clippaths可以有自己的clippaths。虽然手动编程不太直观,但它允许将clipPaths交叉到一起。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex4');
  var clipPath = new fabric.Circle({ radius: 70, top: -50, left: -50 });
  var innerClipPath = new fabric.Circle({ radius: 70, top: -90, left: -90 });
  clipPath.clipPath = innerClipPath;
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

组合内对象中的ClipPath应与组本身的clipPath隔离:

查看demo

(function() {
  var canvas = new fabric.Canvas('ex5');
  var clipPath = new fabric.Circle({ radius: 100, top: -100, left: -100 });
  var small = new fabric.Circle({ radius: 50, top: -50, left: -50 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red', clipPath: small }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

文字剪裁

用文本进行剪裁也是不可能的,开发人员通常不得不依靠模式来实现这一点:

查看demo

(function() {
  var canvas = new fabric.Canvas('ex6');
  var clipPath = new fabric.Text(
    'Hi I\'m the \nnew ClipPath!\nI hope we\'ll\nbe friends',
    { top: -100, left: -100 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

剪裁canvas

我们可以对静态画布应用clipPath,就像对对象一样。在这种情况下,clipPath受到缩放和平移的影响,与物体相反。clipPath被放置在左上角。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex7');
  var clipPath = new fabric.Circle({ radius: 100, top: 0, left: 50 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  canvas.clipPath = clipPath;
  canvas.add(group);
})()

作为旧的clipTo函数,clipPath也是剪切控件,除非你使用canvas.controlsAboveOverlay设置为true

查看demo

(function() {
  var canvas = new fabric.Canvas('ex8');
  canvas.controlsAboveOverlay = true;
  var clipPath = new fabric.Circle({ radius: 100, top: 0, left: 50 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  canvas.clipPath = clipPath;
  canvas.add(group);
})()

动画clipPaths

剪贴簿可以像任何其他物体一样进行动画。Canvas clipPath动画非常有效,当动画对象的动画时,每次都会使对象缓存失效。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex9');
  canvas.controlsAboveOverlay = true;
  var clipPath = new fabric.Rect({ width: 100, height: 100, top: 0, left: 0 });
  function animateLeft() {
    clipPath.animate({
      left: 200,
    }, {
      duration: 900,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateRight,
    });
  }
  function animateRight() {
    clipPath.animate({
      left: 0,
    }, {
      duration: 1200,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateLeft,
    });
  }
  function animateDown() {
    clipPath.animate({
      top: 100,
    }, {
      duration: 500,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateUp,
    });
  }
  function animateUp() {
    clipPath.animate({
      top: 0,
    }, {
      duration: 400,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateDown,
    });
  }
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ], {
    scaleX: 1.5
  });
  animateLeft();
  animateDown();
  canvas.clipPath = clipPath;
  canvas.add(group);
})()

相关文章

  • Fabric.js介绍 第八部分

    新的clipPath属性 在2.4.0中,我们为所有对象引入了clipPath属性。 ClipPath将替换cli...

  • Fabric.js 橡皮擦的用法(包含恢复功能)

    本文简介 点赞 + 关注 + 收藏 = 学会了 本文介绍 Fabric.js 的橡皮擦功能。 Fabric.js ...

  • fabric.js 介绍IText

    fabric.js是一个canvas的框架,可以快速的渲染文字,图片,线条,长方形,正方式,滤镜,动画等功能,下面...

  • 利用vue+fabric.js获取图片坐标,并实现图片拖拽、旋转

    什么是Fabric.js? Fabric.js是一个可以简化Canvas程序编写的库。 Fabric.js为Can...

  • Fabric.js介绍 第四部分

    我们已经在前几个系列涵盖了很多话题,从基础对象操作到动画,事件,滤镜,组合和子类。但还有几件非常有趣和有用的事情要...

  • Fabric.js介绍 第三部分

    我们已经介绍了本系列的第一部分和第二部分的大部分基础知识。我们继续前进到更高级的技巧! 组合(Group) 我们首...

  • Fabric.js介绍 第五部分

    我们已经涵盖了上一系列的许多话题;从基础对象操作到动画,事件,滤镜,组合和子类。但还有几件非常有趣和有用的事情要讨...

  • Fabric.js介绍 第六部分

    了解转换如何在fabricJS上工作是尽可能顺利地编写应用程序的关键方面。 与转换相关的方法和属性 如果您计划理解...

  • Fabric.js介绍 第七部分

    本教程是为stackoveflow问题创建的,其中用户需要在fabricJS中使用位图而不是字体来执行文本对象。 ...

  • Fabric.js介绍 第二部分

    在本系列的第一部分,我们只开始熟悉Fabric.js。我们研究了Fabric在其对象模型和对象层次结构中使用Fab...

网友评论

    本文标题:Fabric.js介绍 第八部分

    本文链接:https://www.haomeiwen.com/subject/fcqetktx.html