【问题标题】:Fabric JS - send Objects to BackFabric JS - 将对象发送到后面
【发布时间】:2023-04-07 22:23:02
【问题描述】:

当您选择一个对象(在我的示例中为多边形)时,它会自动移动到前面。我正在寻找一种方法来防止在 z 轴上移动或在选择后将其向后发送,也许有人可以帮忙?

这是一个简单示例的链接:http://jsfiddle.net/98cuf9b7/1/

当您选择其中一个多边形时,它会移到前面。我尝试在选择后将其向后发送,但即使调用了“canvas.sendToBack(object)”函数,它仍然保留在最前面。

我的示例中的代码是:

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

var pol = new fabric.Polygon([
  {x: 200, y: 0},
  {x: 250, y: 50},
  {x: 250, y: 100},
  {x: 150, y: 100},
  {x: 150, y: 50} ], {
    left: 250,
    top: 150,
    angle: 0,
    fill: 'green'
  }
);

var pol2 = new fabric.Polygon([
  {x: 200, y: 50},
  {x: 200, y: 100},
  {x: 100, y: 100},
  {x: 100, y: 50} ], {
    left: 300,
    top: 200,
    angle: 0,
    fill: 'blue'
  }
);
canvas.add(pol, pol2);

canvas.on('object:selected', function(event) {
        var object = event.target;
        canvas.sendToBack(object);
        //object.sendToBack();
        console.log("OK");
  });

【问题讨论】:

标签: javascript frontend fabricjs


【解决方案1】:

第一步:你可以使用preserveObjectStacking: true

第 2 步:然后使用 sendtoback,sendtofront....fabricjs 选项,如下所示

Working Example with back and front working

var canvas = new fabric.Canvas('c', {
  preserveObjectStacking: true
});

var pol = new fabric.Polygon([{
  x: 200,
  y: 0
}, {
  x: 250,
  y: 50
}, {
  x: 250,
  y: 100
}, {
  x: 150,
  y: 100
}, {
  x: 150,
  y: 50
}], {
  left: 250,
  top: 150,
  angle: 0,
  fill: 'green'
});

var pol2 = new fabric.Polygon([{
  x: 200,
  y: 50
}, {
  x: 200,
  y: 100
}, {
  x: 100,
  y: 100
}, {
  x: 100,
  y: 50
}], {
  left: 300,
  top: 200,
  angle: 0,
  fill: 'blue'
});
canvas.add(pol, pol2);

var objectToSendBack;

canvas.on("selection:created", function(event){
  objectToSendBack = event.target;
});
canvas.on("selection:updated", function(event){
  objectToSendBack = event.target;
});

var sendSelectedObjectBack = function() {
  canvas.sendToBack(objectToSendBack);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.1.0/fabric.min.js" integrity="sha512-T9uV3LxV54oKVYSwORGeHdJ1Ti0WcQvDjAaTvMS6+qfrI5ZRzwxfXVzr7fqodTjfZ6wtbreT5A+65ykwbp4DOw==" crossorigin="anonymous"></script>


<canvas id="c" width="500" height="300" style="margin-top:-150px;"></canvas>

<button height="60" style="margin-left:200px;" onclick="sendSelectedObjectBack()"> Send Back </button>

【讨论】:

    【解决方案2】:

    好的,这是因为您使用的是 Fabric 版本。在小提琴时,我可以看到你在@ 0.9 .所以它似乎是默认行为,无论只要选择对象,它会改变它,使其在顶/前面的z索引。尝试使用更高版本。在其他版本中,如果一个对象在后面,则即使您选择它,它仍然在后面,则不会出现此问题。 这是一个带有后来version(1.4.0) 的演示。在这里,每当您选择对象时,它将向后移动。如果您注释掉向后发送的代码,如果在前面,它将保留在前面,如果在后面,它将保留在后面。

    var canvas  = new fabric.Canvas('c');
    
    var pol = new fabric.Polygon([
      {x: 200, y: 0},
      {x: 250, y: 50},
      {x: 250, y: 100},
      {x: 150, y: 100},
      {x: 150, y: 50} ], {
        left: 250,
        top: 150,
        angle: 0,
        fill: 'green'
      }
    );
    
    var pol2 = new fabric.Polygon([
      {x: 200, y: 50},
      {x: 200, y: 100},
      {x: 100, y: 100},
      {x: 100, y: 50} ], {
        left: 300,
        top: 200,
        angle: 0,
        fill: 'blue'
      }
    );
    canvas.add(pol, pol2);
    
    canvas.on('object:selected', function(event) {
            var object = event.target;
            canvas.sendToBack(object);
            //object.sendToBack();
            console.log("Selected");
      });
      
    <script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script>
    <canvas id="c" width="500" height="500"></canvas>

    【讨论】:

    • 感谢您的回复 :) 在我自己的项目中,我使用的是新版本,我用新版本创建了一个小提琴,但它不再工作:jsfiddle.net/z7koh0h4/1 我认为这是一个错误,所以我会报告这个。 :) 谢谢
    【解决方案3】:

    var activeObj = canvas.getActiveObject();
    canvas.sendToBack(activeObj);
    canvas.renderAll();

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多