2012-07-24 21 views
9

Possiamo posizionare una tela all'interno della tela esistente? Se possibile, aiutaci a farlo in html5.Tela all'interno di html5

+0

Si prega di fornire maggiori dettagli su ciò che in realtà si sta cercando di realizzare. – Phrogz

risposta

12

Ci sono due modi possibili per interpretare la tua domanda. Uno è che si intende effettivamente nido canvas elementi stessi, come questo:

<canvas id="outer"> 
    <canvas id="inner"></canvas> 
</canvas> 

Questo è legale (secondo validator.nu), ma inutile. Il contenuto all'interno dell'elemento canvas è per il fallback. L'unico modo in cui viene utilizzato il contenuto all'interno dell'elemento canvas è se il browser non supporta canvas, nel qual caso l'elemento interno canvas non verrà comunque visualizzato.

L'altro modo di interpretare la domanda è possibile visualizzare l'immagine visualizzata su una tela all'interno di un'altra. Questo è abbastanza semplice, un elemento canvas può essere utilizzato come primo parametro su context.drawImage(). Se si dispone di due canvas elementi:

<canvas id="c1" width="200" height="200"></canvas> 
<canvas id="c2" width="200" height="200"></canvas> 

Poi this script (using jQuery) trarrà sul primo canvas e quindi aggiungere che quattro volte come immagine al secondo canvas:

var c1 = $('#c1'); 
var ctx1 = c1[0].getContext('2d'); 

ctx1.fillRect(50,50,100,100); 

var c2 = $('#c2'); 
var ctx2 = c2[0].getContext('2d'); 

ctx2.drawImage(c1[0],0,0,100,100); 
ctx2.drawImage(c1[0],100,0,100,100); 
ctx2.drawImage(c1[0],0,100,100,100); 
ctx2.drawImage(c1[0],100,100,100,100); 

Ma ancora una volta, perché dovresti? È possibile replicare l'immagine del secondo canvas sopra just using one:

var c1 = $('#c1'); 
var ctx1 = c1[0].getContext('2d'); 

ctx1.fillRect(25,25,50,50); 
ctx1.fillRect(125,25,50,50); 
ctx1.fillRect(25,125,50,50); 
ctx1.fillRect(125,125,50,50); 

Quindi, in sintesi: sì, è possibile, ma non è davvero necessario in uso semplice.

+2

Ci sono un sacco di ragioni (ovviamente non banali) per l'utilizzo di una seconda tela. Ad esempio, il disegno di un grafico in movimento è più semplice, copiando il grafico su un altro sfondo non in linea, cancellando l'area di disegno principale e quindi copiando l'offset posteriore della tela fuori schermo a sinistra di un pixel e disegnando i nuovi dati nella colonna mancante. (Ciò è necessario solo se lo sfondo del grafico è trasparente.) – Phrogz

+0

@Phrogz Sì, anche varie cose di elaborazione delle immagini. Ma io sostengo il mio "non è davvero necessario in un semplice uso", non penso che nessuna di queste cose sia rilevante per questa domanda o questa risposta. – robertc

+3

Forse no, ma un nuovo arrivato potrebbe prendere il tuo testo per indicare che è eccessivo, quando è spesso il modo più ordinato e più ottimale per realizzare qualcosa. Se hai un canovaccio con elementi statici (ad esempio, un gioco), ci sono enormi vantaggi in termini di prestazioni di questa tecnica: devi solo disegnare i bitmap/vettori su una tela una volta, quindi semplicemente disegnare questa su quella principale durante l'aggiornamento. +1 per una buona risposta però. – MickMalone1983

0

Sarebbe assolutamente inutile annidare una tela all'interno di un'altra tela. La pagina vede solo ciò che si trova all'interno del tag canvas se il browser non supporta lo canvas. Quindi, basta fare quello che robertc detto:
<canvas id="background">fallbacks/polyfills go in here...</canvas> <canvas id="foreground">.. or here, but not other canvases.</canvas>

Problemi correlati