【问题标题】:How to set zindex in konva.js?如何在 konva.js 中设置 zindex?
【发布时间】:2018-10-11 06:56:24
【问题描述】:

我对 konva.js 中的 Zindex 有疑问。在我将所有内容添加到图层之后 我正在尝试分别为每个元素的节点分配一个属性。但它不起作用。例如

for(let i = 0; i<=this.layer['children']; i++){
    this.layer['children'][i].setZIndex(someInt);
}

如何为层中的所有元素设置 zindex?

【问题讨论】:

  • 不相关。我认为您可以在属性中设置任何数字。但事实证明最大数量是元素的数量。

标签: konvajs


【解决方案1】:

zIndex in Konva 只是父元素的子元素数组中元素的索引。所以你不能给它设置任何数字,它不能大于children.length - 1

【讨论】:

  • 澄清一下,在一些开发语言(如 VB6)中,您可以将 z-index 设置为任何正数或负数,所以我明白为什么 OP 可能会这样想。您对 Konvajs 所说的是,如果我在一个图层上有四个形状,我可以放置的最小值为 setZindex() 中的值是 0 ,而最大值是 3 ?还是 1 和 4 ?
  • @VanquiishedWombat 从 0 到 3
  • 技术上其他数字也可以工作(我的意思是没有错误)。但会产生意想不到的结果。
【解决方案2】:

工作 sn-p 说明 Kovajs.Shape 对象的 getZIndex()、setZIndex()、moveUp() 和 moveDown() 方法。另见example at Konvajs site

按钮允许使用以 1 为增量在 z-index 列表中上下移动绿色圆圈,然后还可以尝试向上移动 +10 和向下移动 -100。生成的 z-index 显示在圆圈下方的文本中。

// Create the stage
var stage = new Konva.Stage({
    container: 'container',
    width: $('#container').width(),
    height: $('#container').height()
});

// create the layer
var layer = new Konva.Layer();

var data = [ {x: 60, color: 'red'}, {x: 90, color: 'limegreen'}, {x: 120, color: 'gold'}]
var circles = [];

for (var i = 0; i < data.length; i = i + 1){
  // create some circles
  var circle = new Konva.Circle({
      x: data[i].x,
      y: 60,
      radius: 50,
      fill: data[i].color,
      stroke: 'black',
      strokeWidth: 2
  });
  layer.add(circle);
  circles.push(circle);
}

stage.add(layer);

var green = circles[1]; 
function sayIndex(){
$('#info').html("Green zIndex=" + circles[1].getZIndex());
}

$('#greenup').on('click', function(){
  green.moveUp();
  sayIndex();
  layer.draw();
})

$('#greendn').on('click', function(){
  green.moveDown();
  sayIndex();
  layer.draw();
})


$('#greenup10').on('click', function(){
  var ind = circles[1].getZIndex();
  green.setZIndex(ind + 10);
  sayIndex();
  layer.draw();
})

$('#greendn100').on('click', function(){
  var ind = circles[1].getZIndex();
  green.setZIndex(ind - 100);
  sayIndex();
  layer.draw();
})
#container
{
width: 200px;
height: 150px;
border: 1px solid #666;
float: left;
}
#buttons
{
width: 200px;
height: 150px;
border: 1px solid #666;
float: left;
}
#info
{
position: absolute;
left: 20px;
top: 135px;
}
p
{
margin: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script src="https://cdn.rawgit.com/konvajs/konva/1.6.5/konva.min.js"></script>
<div id="container"></div>
<div id="buttons">

<p><button id='greenup'>Move Green + 1</button></p>
<p><button id='greendn'>Move Green -1</button></p>
<p><button id='greenup10'>Move Green +10</button></p>
<p><button id='greendn100'>Move Green -100</button></p>

<span id='info'></span>

</div>

【讨论】:

    【解决方案3】:

    <!DOCTYPE html>
    <html>
    <head>
      <script src="https://unpkg.com/konva@2.4.2/konva.min.js"></script>
      <meta charset="utf-8">
      <title>Konva Shape Layering Demo</title>
      <style>
        body {
          margin: 0;
          padding: 0;
          overflow: hidden;
          background-color: #F0F0F0;
        }
        #buttons {
            position: absolute;
            left: 10px;
            top: 0px;
        }
        button {
            margin-top: 10px;
            display: block;
        }
      </style>
    </head>
    <body>
      <div id="container"></div>
      <div id="buttons">
          <button id="toTop">
    yellow z-index -2
         </button>
          <button id="toBottom">
          yellow -9
          </button>
          <button id="up">
              yellow z-index 1
          </button>
          <button id="down">
              yellow z-index -5
          </button>
          <button id="zIndex">
              Set yellow box zIndex to 3
          </button>
      </div>
      <script>
        var width = window.innerWidth;
        var height = window.innerHeight;
        
        var stage = new Konva.Stage({
          container: 'container',
          width: width,
          height: height
        });
    
        var layer = new Konva.Layer();
        var offsetX = 0;
        var offsetY = 0;
        var colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple'];
        var yellowBox = null;
    
        for(var n = 0; n < 6; n++) {
            // anonymous function to induce scope
            (function() {
                var i = n;
                var box = new Konva.Rect({
                    x: i * 30 + 210,
                    y: i * 18 + 40,
                    width: 100,
                    height: 50,
                    fill: colors[i],
                    stroke: 'black',
                    strokeWidth: 4,
                    draggable: true,
                    name: colors[i]
                });
    
                box.on('mouseover', function() {
                    document.body.style.cursor = 'pointer';
                });
                box.on('mouseout', function() {
                    document.body.style.cursor = 'default';
                });
                if(colors[i] === 'yellow') {
                    yellowBox = box;
                }
                layer.add(box);
            })();
        }
    
        stage.add(layer);
    
        // add button event bindings
        document.getElementById('toTop').addEventListener('click', function() {
            yellowBox.setZIndex(-2);
            layer.draw();
        }, false);
    
        document.getElementById('toBottom').addEventListener('click', function() {
            yellowBox.setZIndex(-9);
            layer.draw();
        }, false);
    
        document.getElementById('up').addEventListener('click', function() {
            yellowBox.setZIndex(1);
            layer.draw();
        }, false);
    
        document.getElementById('down').addEventListener('click', function() {
            yellowBox.setZIndex(-5);
            layer.draw();
        }, false);
    
        document.getElementById('zIndex').addEventListener('click', function() {
            yellowBox.setZIndex(3);
            layer.draw();
        }, false);
      </script>
    
    </body>
    </html>
    Last

    有趣的 ZIndex 代码, setZIndex 就是您所需要的;它将使 Konva.JS 中的 z-index 无效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2018-12-30
      • 2013-12-04
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多