2013-01-11 36 views
5

Tôi đã đặt câu hỏi trước: How can I control z-index of canvas objects? và chúng tôi đã đạt đến giải pháp có thể không phải là giải pháp tốt cho các tình huống phức tạp.Làm cách nào để mô phỏng z-index trong canvas

Tôi thấy rằng canvas không có hệ thống chỉ mục z, mà là một bản vẽ được đặt hàng đơn giản. Bây giờ có một câu hỏi mới: làm thế nào tôi có thể mô phỏng hệ thống z-index để làm cho vấn đề này được cố định trong các tình huống phức tạp?

Câu trả lời hay có thể giải quyết được một vấn đề lớn.

+1

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

+0

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

Trả lời

9

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.

+0

Cảm ơn, nhưng bạn có thấy câu hỏi đó không? Tôi biết rằng nó có thể bây giờ, nhưng theo cách làm cho mã bẩn. Tôi đang tìm kiếm một cách sạch sẽ. – JalalJaberi

+0

@JalalJaberi Có rõ ràng hơn với ví dụ này không? Tôi đưa ra một chỉ số z cho tất cả các ô vuông của tôi. –

+1

@JalalJaberi: điều này là sạch sẽ như bạn sẽ nhận được nó khi sử dụng canvas. Bạn sẽ phải sắp xếp các yếu tố bạn sẽ vẽ. Điều này đòi hỏi không ít hơn mã dystroy trả lời. – Cerbrus

1

Như dystroy đã nói, z-index là, đơn giản nhất của nó, chỉ là một chỉ số để cho bạn biết thứ tự vẽ trên canvas, để chúng chồng lên nhau.

Nếu bạn muốn làm nhiều hơn điều này, hãy nói để nhân rộng các hoạt động hiện tại của trình duyệt, thì bạn sẽ có nhiều việc phải làm. Thứ tự mà các đối tượng được rút ra trong một trình duyệt là một tính toán phức tạp mà được thúc đẩy bởi:

  1. Cây DOM
  2. Elements' position thuộc tính
  3. Elements' z-index thuộc tính

các kinh điển nguồn tới đây là Elaborate description of Stacking Contexts, một phần của đặc tả CSS.

+0

Cảm ơn, nếu có thể với DOM tôi rất vui khi được làm quen với. Thật tuyệt. – JalalJaberi

+0

Xin lỗi, tôi không có ý nói rằng bạn có thể kiểm soát đầu ra canvas của mình theo bất kỳ cách nào với DOM - Tôi có nghĩa là việc sử dụng chỉ mục z của trình duyệt cho các phần tử html thông thường phức tạp hơn bạn nghĩ. Tuy nhiên, nếu bạn muốn sao chép xếp chồng giống như HTML trong canvas, đó là tài liệu tham khảo tốt nhất của bạn. –

+0

OK. Tôi sẽ cố gắng làm một công việc như vậy. – JalalJaberi

Các vấn đề liên quan