fabricjs에서 마우스 아래의 객체가 z- 인덱스의 장면 상단으로 올라간 다음 마우스가 해당 객체를 떠난 후에 다시 되돌아갑니다. Z-index에 대한 정보를 제공합니다. 하나는 object.zindex를 설정할 수 없습니다 (어느 것이 좋을까요). 대신 이전 위치의 객체 목록에 삽입 된 자리 표시 자 객체를 사용하고 있으며 이전 객체는 canvas.insertAt를 사용하여 목록에 있던 위치에 다시 배치됩니다. 그러나 이것은 작동하지 않습니다.Fabric.js의 Z- 인덱스 제어
이 상태는 http://jsfiddle.net/rFSEV/을 참조하십시오.
var canvasS = new fabric.Canvas('canvasS', { renderOnAddition: false, hoverCursor: 'pointer', selection: false });
var bars = {}; //storage for bars (bar number indexed by group object)
var selectedBar = null; //selected bar (group object)
var placeholder = new fabric.Text("XXXXX", { fontSize: 12 });
//pass null or a bar
function selectBar(bar) {
if (selectedBar) {
//remove the old topmost bar and put it back in the right zindex
//PROBLEM: It doesn't go back; it stays at the same zindex
selectedBar.remove();
canvasS.insertAt(selectedBar, selectedBar.XZIndex, true);
selectedBar = null;
}
if (bar) {
//put a placeholder object ("XXX" for now) in the position
//where the bar was, and put the bar in the top position
//so it shows topmost
selectedBar = bar;
canvasS.insertAt(placeholder, selectedBar.XZIndex, true);
canvasS.add(bar);
canvasS.renderAll();
}
}
canvasS.on({
'mouse:move': function(e) {
//hook up dynamic zorder
if (!e.target) return;
if (bars[e.target])
selectBar(e.target);
else
selectBar(null);
},
});
var objcount = canvasS.getObjects().length;
//create bars
for (var i = 0; i < 20; ++i) {
var rect = new fabric.Rect({
left: 0,
top: 0,
rx: 3,
ry: 3,
stroke: 'red',
width: 200,
height: 25
});
rect.setGradientFill({
x1: 0,
y1: 0,
x2: 0,
y2: rect.height,
colorStops: {
0: '#080',
1: '#fff'
}
});
var text = new fabric.Text("Bar number " + (i+1), {
fontSize: 12
});
var group = new fabric.Group([ rect, text ], {
left: i + 101,
top: i * 4 + 26
});
group.hasControls = group.hasBorders = false;
//our properties (not part of fabric)
group.XBar = rect;
group.XZIndex = objcount++;
canvasS.add(group);
bars[group] = i;
}
canvasS.renderAll();
bringForward (1 레벨 위로), bringToFront (모든 방법으로 올라감), sendBackwards (1 레벨 아래로) 및 sendToBack (끝까지)의 4 가지 방법으로 Z- 색인을 제어합니다. 그들은 모두 객체에 직접 또는 캔버스에서 호출 될 수 있습니다 (원하는 객체 전달). – kangax
좋은 정보이지만 insertAt가 z- 인덱스에 아무런 영향을 미치지 않는다고 말하는 것입니까? (insertAt의 목적은 무엇입니까?). 또한 이러한 4 가지 방법이 유일한 옵션 인 경우 sendBackwards를 N 번 호출해야합니다. 즉, Z- 인덱스 105에서 55로 이동하려면 루프에서 50 번 호출해야합니다. 시각. 그것은 미친 듯이 복잡합니다. – Ian
'insertAt'도 잘 동작합니다. 정확한 위치에 물체를 정확히 삽입하는 것을 의미합니다. 그러나 캔버스에 새 오브젝트를 추가하는 데 사용됩니다. 기존 객체의 Z- 색인을 변경하려면,이 4 가지 방법을 사용하거나'canvas._objects' 배열을 직접 수정할 수 있습니다. z- 인덱스는 해당 배열에있는 객체의 인덱스와 동일합니다 (0이 먼저 렌더링 된 다음 1, 2가됩니다) – kangax