【问题标题】:Z-Index control objects in FabricJS using jQuery UI sortableFabricJS 中的 Z-Index 控件对象使用 jQuery UI 可排序
【发布时间】:2017-05-09 03:42:24
【问题描述】:

您好,我想要像在 photoshop 上使用 FabricJS 那样进行图层排序控制

我有这个解决方案,但是当你在画布上有超过 3 个对象时它就不能正常工作:

$("#containerLayers").sortable({
  change: function(event, ui){
    $( "#containerLayers li" ).each(function(index,list){
        if(objectArray[$(list).attr('id')]){
            canvas.moveTo(objectArray[$(list).attr('id')],index);
        }
    });
    canvas.renderAll();
  }
});

这是代码的其他部分: https://jsfiddle.net/peLcju2h/16/

还有比这更好的解决方案吗?

【问题讨论】:

    标签: javascript jquery jquery-ui canvas fabricjs


    【解决方案1】:

    使用 FabricJS 进行层排序的最佳解决方案是:

    $("#containerLayers").sortable({
        update: function(event, ui){
    
            var items = $(this).children();
    
            items.each(function(i,item){
                canvas.sendToBack(objectArray[item.id]);
            });
            canvas.renderAll();
        }
    });
    

    不要使用canvas.moveTo(),而是使用canvas.sendToBack(),它将完美运行

    这是链接,您可以看到订购效果很好 https://jsfiddle.net/peLcju2h/24/

    【讨论】:

      【解决方案2】:

      首先,您需要在代码中进行一些重要的重构,主要是因为它的很多片段都是重复的。

      我已经做了,最终的工作代码在这里:https://jsfiddle.net/peLcju2h/18/


      让我们看看一些注意事项:

      • 所有 Canvas 对象的创建都具有相同的代码,因此请将其包装到一个函数中;
      • 您通过 push() 函数将 objs 添加到您的数组中,这并没有错,但它扰乱了您的 UI 可排序处理。那是因为每次更改 li 的位置时,只会更新画布和 HTML,而不会更新数组本身。

        您可以为此使用reordering function,但一旦元素位置没有预定义的顺序或更改逻辑,它就不适合这里的目标。

        相反,我决定使用辅助数组,每次对项目进行排序时都会填充该数组。

      • 通过[]操作符将项目推入数组,使用对象id作为键;

      • 最后,请注意我放了a promise 以保证新的objectArray 只有在画布工作完成后才会呈现。

      注意: JSFiddle 仅适用于 HTTPS 外部链接,因此请确保您 即使您正在这样做,也可以在以后的尝试中正确导入它们 通过 CSS @import.

      【讨论】:

      • 超过 3 个元素时也会出现同样的问题。
      • @EdinPuzic 在描述“问题”时必须更加具体。有一个完整的实现可以做很多事情,对我来说,工作正常。请在以后的问题中注意这一点,因为人们(有时)会花很多时间来提供帮助。
      猜你喜欢
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2013-10-08
      • 2012-07-17
      相关资源
      最近更新 更多