2012-07-24 4 views

답변

12

질문을 해석하는 데 가능한 두 가지 방법이 있습니다. 하나는 의미이다이 같은 사실 둥지 canvas 요소 자체에 :

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

이 (validator.nu에 따라) 법적으로 허용되지만 무의미. canvas 요소의 콘텐츠는 대체 콘텐츠 용입니다. canvas 요소의 콘텐츠가 사용되는 유일한 방법은 브라우저가 canvas을 지원하지 않는 경우입니다.이 경우 내부 canvas 요소는 표시되지 않습니다.

질문을 해석 할 수있는 다른 방법은 한 캔버스에 표시된 이미지를 다른 캔버스에 표시하는 것입니다. 이것은 매우 간단하며, context.drawImage()의 첫 번째 매개 변수로 canvas 요소를 사용할 수 있습니다. 두 canvas 요소가있는 경우 :

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

그런 다음 this script (using jQuery) 첫 번째 canvas에 그릴 것입니다 다음 두 번째 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); 

그러나 다시, 왜 것? 당신은 just using one 위의 두 번째 canvas의 이미지를 복제 할 수 있습니다 :

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); 

그래서 요약 : 예, 그것은 가능하지만 간단 사용에 정말 필요가 없습니다.

+2

두 번째 캔버스를 사용하는 이유는 (사소한 것은 아니지만) 많이 있습니다. 예를 들어, 움직이는 그래프 그리기는 그래프를 다른 오프 스크린 캔버스로 복사하고, 주 캔버스를 지운 다음, 오프 스크린 캔버스를 한 픽셀 씩 왼쪽으로 뒤로 이동시키고 누락 된 열에 새 데이터를 그려서 수행하는 것이 가장 쉽습니다. (이것은 그래프의 배경이 투명 할 때만 필요합니다.) – Phrogz

+0

@Phrogz 예, 다양한 이미지 처리 작업도 가능합니다. 그러나 나는 "단순한 사용에서는 꼭 필요한 것은 아니다"라고 말하면서이 질문이나 대답과 관련이 없다고 생각합니다. – robertc

+3

아마도 그렇지는 않지만 새로 온 사람은 과도하다는 것을 의미하기 위해 표현을 취할 수 있습니다. 종종 뭔가를 성취하기 위해보다 깔끔하고 최적의 방법 일 때가 있습니다. 정적 요소 (예 : 게임)가있는 캔버스가 변경되면이 기술에 큰 성능 이점이 있습니다. 비트 맵/벡터를 캔버스에 한 번만 그려야하며 업데이트 할 때 비트 맵/벡터를 기본 캔버스에 간단하게 그립니다. 좋은 대답을 위해서 +1. – MickMalone1983

0

다른 캔버스 안에 캔버스를 중첩하는 것은 절대적으로 의미가 없습니다. 브라우저가 canvas을 지원하지 않으면 페이지에는 canvas 태그 안에있는 내용 만 표시됩니다. 따라서, 로버트가 말한대로하십시오 :
<canvas id="background">fallbacks/polyfills go in here...</canvas> <canvas id="foreground">.. or here, but not other canvases.</canvas>