2014-09-20 7 views
1

У меня есть холст с SVG-контуром. Я хочу сделать что-то вроде этого: http://jsfiddle.net/tbqrn/Многократное обрезка Fabric.js на основе svg

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(); 
}); 

, но с одним отличием: изображение после выхода из одной области должны немедленно появиться в другом. Как я могу это сделать?

+0

Так что вам нужно, чтобы удалить разрыв между ними? –

+0

Не совсем. Я хочу, чтобы пробел оставался видимым для пользователя, но изображение не должно осознавать пробел. Это трудно объяснить…. – ats

+0

Думаю, я понимаю. Это то, что тебе надо? http://i.imgur.com/SzpMLWB.png –

ответ

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/

+0

Спасибо! Ваш ответ очень полезен, но вы абсолютно уверены, что нет способа сделать это, используя только один холст? Иногда у меня есть 2 пути, иногда 4, и было бы намного проще с одним холстом. – ats

+0

Я не могу придумать способ, который будет хорошо играть с встроенными функциями редактирования fabricjs. –

+0

А как насчет некоторых библиотек Javascript? – ats