Không phải là canvas không có chỉ mục z, đó là canvas không giữ đối tượng được vẽ trái với trang HTML. Nó chỉ vẽ trên ma trận pixel.
Về cơ bản có hai loại mô hình vẽ:
- những đối tượng (thường là vector): đối tượng được lưu giữ và bởi các công cụ quản lý. Chúng thường có thể được gỡ bỏ hoặc thay đổi. Chúng có các chỉ số z-index
- bitmap: không có đối tượng. Bạn chỉ cần thay đổi ma trận pixel
Mô hình Canvas là một bitmap. Để có đối tượng được vẽ trên các đối tượng khác, bạn phải vẽ chúng sau. Điều này có nghĩa là bạn phải quản lý những gì bạn vẽ.
Mô hình canvas rất nhanh, nhưng nếu bạn muốn hệ thống bản vẽ quản lý đối tượng của mình, có thể bạn cần SVG để thay thế.
Nếu bạn muốn sử dụng canvas, tốt nhất là giữ những gì bạn vẽ làm đối tượng. Dưới đây là một ví dụ tôi chỉ cần thực hiện: Tôi giữ một danh sách vuông và mỗi thứ hai tôi ngẫu nhiên ZIndex của họ và vẽ lại họ:
var c = document.getElementById('c').getContext('2d');
function Square(x, y, s, color) {
this.x = x; this.y = y; this.s = s; this.color = color;
this.zindex=0;
}
Square.prototype.draw = function(c) {
c.fillStyle = this.color;
c.fillRect(this.x, this.y, this.s, this.s);
}
var squares = [
new Square(10, 10, 50, 'blue'), new Square(40, 10, 40, 'red'), new Square(30, 50, 30, 'green'),
new Square(60, 30, 40, '#111'), new Square(0, 30, 20, '#444'), new Square(70, 00, 40, '#999')
];
function draw() {
c.fillStyle = "white";
c.fillRect(0, 0, 1000, 500);
for (var i=0; i<squares.length; i++) squares[i].draw(c);
}
setInterval(function(){
// give all squares a random z-index
squares.forEach(function(v){v.zindex=Math.random()});
// sort the list accordingly to zindex
squares.sort(function(a,b){return a.zindex-b.zindex});
draw();
}, 1000);
Demonstration
Ý tưởng là các mảng vuông được sắp xếp phù hợp để ZIndex . Điều này có thể dễ dàng mở rộng đến các loại đối tượng khác.
Bạn cũng có thể sử dụng thư viện như kineticJS (Nó có hỗ trợ cho z-index trong số những người khác) ở đây hãy xem http://www.html5canvastutorials.com/kineticjs/html5-canvas-shape-layering-with-kineticjs/ – ppsreejith
Có, tôi sử dụng kineticJS trong một số trường hợp.Tôi đang cố gắng tìm ra cách tôi có thể tự làm. – JalalJaberi