【问题标题】:Fabric.js multiple clipping based on svgFabric.js 基于 svg 的多重裁剪
【发布时间】:2014-11-15 01:33:57
【问题描述】:

我有带有 svg 路径的画布。我想做这样的事情: http://jsfiddle.net/tbqrn/

var canvas = new fabric.Canvas('c');

var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.rect(10,10,150,150);
ctx.rect(180,10,200,200);
ctx.closePath();
ctx.stroke();
ctx.clip();

fabric.Image.fromURL(img01URL, function(oImg) {
oImg.scale(.25);
oImg.left = 50;
oImg.top = 100;
canvas.add(oImg);
canvas.renderAll();
});

fabric.Image.fromURL(img02URL, function(oImg) {
oImg.scale(.25);
oImg.left = 300;
oImg.top = 100;
canvas.add(oImg);
canvas.renderAll();
});

但有一个区别:离开一个区域后的图像应该立即出现在另一个区域。 我该怎么做?

【问题讨论】:

  • 那么你需要消除它们之间的差距吗?
  • 不完全是。我希望间隙对用户保持可见,但图像不应该知道间隙。很难解释……
  • 我想我明白了。这是你需要的吗? i.imgur.com/SzpMLWB.png
  • 是的,这正是我需要的。

标签: javascript html canvas svg fabricjs


【解决方案1】:

这对于单个画布是不可行的。我能想到的唯一方法是: 有两个带有两个不同图像的画布,并在它们之间“同步”图像的位置。您实际上必须使用两张图片。

HTML:

<canvas id="c1" width="200" height="400"></canvas>
<canvas id="c2" width="200" height="400"></canvas>

CSS:

#c1, #c2 {
    border: 1px solid #ccc;
}

#c2 {
   margin-left: 20px; 
}

.canvas-container {
    float: left;
}

JS:

var offsetLeft = 220; // #c1 width + #c2 margin-left

var canvas1 = new fabric.Canvas('c1');
var canvas2 = new fabric.Canvas('c2');

var c1Img, c2Img;

fabric.Image.fromURL(img01URL, function(oImg) {
    c1Img = oImg;

    c1Img.scale(.25);
    c1Img.left = 0;
    c1Img.top = 0;
    c1Img.hasControls = false;
    c1Img.hasRotatingPoint = false;
    canvas1.add(c1Img);
    canvas1.renderAll();
});

fabric.Image.fromURL(img01URL, function(oImg) {
    c2Img = oImg;

    c2Img.scale(.25);
    c2Img.left = -offsetLeft;
    c2Img.top = 0;
    c2Img.hasControls = false;
    c2Img.hasRotatingPoint = false;
    canvas2.add(c2Img);
    canvas2.renderAll();
});


canvas1.on('object:moving', function(e) { 
    c2Img.set({left: e.target.left -offsetLeft, top: e.target.top});
    c2Img.setCoords();
    canvas2.renderAll();
                                       });

canvas2.on('object:moving', function(e) { 
    c1Img.set({left: e.target.left + offsetLeft, top: e.target.top});
    c1Img.setCoords();
    canvas1.renderAll();
                                       });

在这里测试:http://jsfiddle.net/se9sw1d8/2/

【讨论】:

  • 谢谢!您的回答非常有用,但是您是否绝对确定仅使用一张画布就无法做到这一点?有时我有 2 条路径,有时 4 条路径,使用一张画布会容易得多。
  • 我想不出一种可以很好地与fabricjs的内置编辑功能配合使用的方法。
  • 一些不同的 Javascript 库怎么样?
猜你喜欢
  • 2013-10-07
  • 2016-05-05
  • 1970-01-01
  • 2022-11-23
  • 2017-11-22
  • 2014-04-11
  • 2016-05-03
  • 2019-02-07
  • 2013-07-12
相关资源
最近更新 更多