2017-04-19 20 views
0

2つの長方形があります。小さな矩形が大きな矩形の外側に移動するとき、私は境界の外側の小さな矩形の領域が見えなくなるようにします。Fabric JSオブジェクトが境界から見えないようにする

小さな四角形の半分が内側で外側が半分の場合。その後、その半分だけが見えます。このexampleはこのように動作します。

どうすればこの問題を解決できますか?

My JSFiddle

(function() { 
    var canvas = this.__canvas = new fabric.Canvas('canvas'); 
    fabric.Object.prototype.transparentCorners = false; 

    // create a rectangle with a fill and a different color stroke 
    var rect = new fabric.Rect({ 
    left: 50, 
    top: 50, 
    width: 150, 
    height: 250, 
    fill: 'transparent', 
    stroke: 'rgba(34,177,76,1)', 
    strokeWidth: 1 
    }); 

    var rect2 = new fabric.Rect({ 
    left: 50, 
    top: 50, 
    width: 50, 
    height: 50, 
    fill: 'rgba(34,50,100,1)', 
    stroke: 'rgba(34,177,76,1)', 
    strokeWidth: 1 
    }); 
    canvas.add(rect); 
    canvas.add(rect2); 
})(); 

ここでの例は、この方法で動作します:

+0

と呼ばれる追加のライブラリを、以下の方法で達成することができること@ moaoisいいえ、私は1.7.9を実際に使っています。私はjsfiddleを更新します – HOY

答えて

1

lodash

(function() { 
 
    var canvas = this.__canvas = new fabric.Canvas('canvas'); 
 
    fabric.Object.prototype.transparentCorners = false; 
 
    // create a rectangle with a fill and a different color stroke 
 
    var rect = new fabric.Rect({ 
 
     left: 50, 
 
     top: 50, 
 
     width: 150, 
 
     height: 250, 
 
     fill: 'transparent', 
 
     stroke: 'rgba(34,177,76,1)', 
 
     strokeWidth: 1 
 
    }); 
 
    var rect2 = new fabric.Rect({ 
 
     left: 50, 
 
     top: 50, 
 
     width: 50, 
 
     height: 50, 
 
     fill: 'rgba(34,50,100,1)', 
 
     stroke: 'rgba(34,177,76,1)', 
 
     strokeWidth: 1, 
 
     clipName: 'rect2', 
 
     clipTo: function(ctx) { 
 
      return _.bind(clip, rect2)(ctx) 
 
     } 
 
    }); 
 

 
    function d2R(deg) { 
 
     return deg * (Math.PI/180); 
 
    } 
 

 
    function clip_name(name) { 
 
     return _(canvas.getObjects()).where({ 
 
      clipFor: name 
 
     }).first() 
 
    } 
 

 
    function clip(ctx) { 
 
     this.setCoords(); 
 
     var clipObj = clip_name(this.clipName); 
 
     var scaleXTo1 = (1/this.scaleX); 
 
     var scaleYTo1 = (1/this.scaleY); 
 
     ctx.save(); 
 
     var ctxLeft = -(this.width/2) + clipObj.strokeWidth; 
 
     var ctxTop = -(this.height/2) + clipObj.strokeWidth; 
 
     var ctxWidth = clipObj.width - clipObj.strokeWidth; 
 
     var ctxHeight = clipObj.height - clipObj.strokeWidth; 
 
     ctx.translate(ctxLeft, ctxTop); 
 
     ctx.scale(scaleXTo1, scaleYTo1); 
 
     ctx.rotate(d2R(this.angle * -1)); 
 
     ctx.beginPath(); 
 
     ctx.rect(clipObj.left - this.oCoords.tl.x, clipObj.top - this.oCoords.tl.y, clipObj.width, clipObj.height); 
 
     ctx.closePath(); 
 
     ctx.restore(); 
 
    } 
 
    rect.set({ 
 
     clipFor: 'rect2' 
 
    }); 
 
    canvas.add(rect); 
 
    canvas.add(rect2); 
 
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.9/fabric.min.js"></script> 
 
<canvas id="canvas" width="800" height="600"></canvas>

+0

こんにちはモアシス、ありがとう、この解決策も見つけましたが、私の大きな四角形を透明に変換すると、動作しませんでした。私が達成しようとしているのは、私はt-shirtdesignerアプリケーションを持っています。デザインが境界の外に出ることができないように、Tシャツの中央に長方形を設定する必要があります。 – HOY

+0

@HOY hm ..更新の回答を確認 –

+0

内部のオブジェクトの幅や高さを変更すると、残念ながら失敗します。 – HOY

関連する問題