캔버스를 부모만큼 넓고 높이 만들기


80

진행률 표시 줄을 시뮬레이션하기 위해 직사각형 캔버스를 만들고 싶지만 캔버스의 너비와 높이를 100 %로 설정하면 실제로 부모만큼 높고 넓지 않은 것 같습니다.

http://jsfiddle.net/PQS3A/ 아래의 예를 참조하십시오.

정사각형이 아닌 캔버스를 만드는 것도 가능합니까? 캔버스의 높이와 너비는 모바일 장치를 포함하여 더 크거나 작은 화면에서 볼 때 동적으로 변경되어야하기 때문에 하드 코딩하고 싶지 않습니다.

답변:


138

다음은 문제를 해결하는 작업 예제입니다.

http://jsfiddle.net/PQS3A/7/

예제에 몇 가지 문제가 있습니다.

  1. A <div>에는 height또는 width속성 이 없습니다 . CSS를 통해 설정해야합니다.
  2. div의 크기가 올바르게 조정 되었더라도 default를 사용했습니다 position:static. 이는 자식의 위치 지정 부모가 아님을 의미합니다. 캔버스 크기를 div와 동일하게하려면 div를 position:relative(또는 absolute또는 fixed) 로 설정해야합니다 .
  3. 캔버스 의 widthheight속성은 그릴 데이터의 픽셀 수 (예 : 이미지의 실제 픽셀) 를 지정하며 캔버스 의 표시 크기 와는 별개입니다 . 이러한 속성은 정수로 설정해야합니다.

위에 링크 된 예제는 CSS를 사용하여 div 크기를 설정하고 배치 된 상위로 만듭니다. 캔버스를 배치 된 부모 와 동일한 디스플레이 크기로 설정하는 JS 함수 (아래 참조)를 만든 다음 표시 되는 것과 동일한 픽셀 수를 갖도록 내부 widthheight속성 을 조정합니다 .

var canvas = document.querySelector('canvas');
fitToContainer(canvas);

function fitToContainer(canvas){
  // Make it visually fill the positioned parent
  canvas.style.width ='100%';
  canvas.style.height='100%';
  // ...then set the internal size to match
  canvas.width  = canvas.offsetWidth;
  canvas.height = canvas.offsetHeight;
}

1
오 와우, 나는 기본적으로 div 태그가 자식 요소를 포함하도록 늘어날 것이라고 생각하기 때문에 상대 또는 절대 위치로 변경하지 않았으므로 그렇지 않습니까? 아이가 정적 인 위치라면 그 경계를 넘어 성장하게할까요? 나는 위치가 말 그대로 위치와 관련이 있다고 생각했고 내가 원하는 것은 아카이브를 부모만큼 넓고 높게 만드는 것입니다. 그래서 위치는 또한 너비와 높이에 대해 참조 할 하위 요소 (div 태그 내)를 지시한다고 생각합니까 ??
user1118019

@ user1118019 방금 작성한 내용을 완전히 이해하지 못했지만 여기에 몇 가지 중요한 세부 정보가 있습니다. display:blockCSS가 width지정 되었거나 지정 되지 않은 요소는 컨테이너만큼 넓게 확장됩니다. CSS가 height지정되지 않은 컨테이너 요소 는 콘텐츠만큼만 길어집니다. 백분율 높이가있는 콘텐츠 height:0는 부모가 얼마나 높이가 필요한지 파악하는 것과 같습니다 . 절대 위치 또는 백분율 치수를 사용할 때마다 "상위 오프셋"을 기준으로 계산됩니다. 기본적으로 본문은 유일한 오프셋 부모입니다.
Phrogz

@ user1118019 요소 position:static(모든 요소의 기본값 및 동작)는 새 위치 지정 시스템을 시작하지 않지만 시작합니다 position:relative(다른 방법으로 요소 표시를 변경하지 않음). 예를 들어이 데모를 참조하십시오 . #a1포함 된을 무시하고 본문을 기준으로 위치 및 크기가 어떻게 조정 되는지 확인합니다 <div>. #b1대신 컨테이너에 상대적으로 배치되고 크기가 지정되는 방식 에 주목 하십시오 #b { position:relative}.
Phrogz

감사합니다 Phrogz ... 지금 확인했습니다. 시간을내어 설명해 주셔서 감사합니다. 정말 감사합니다
user1118019

1
"div의 크기가 올바르게 조정 되었더라도 기본 위치 : 정적을 사용했습니다. 이는 자식의 위치 지정 부모가 아님을 의미합니다."smh ... 왜, CSS입니까? 나는 당신에게만 잘했습니다.
CCJ

15

캔버스가 실제로 부모 요소만큼 크도록하려면 캔버스 의 widthheight속성을 사용하십시오 . JQuery를 사용하여 설정할 수 있습니다 .

$(document).ready(function() {
  var canvas = document.getElementById("theCanvas");
  canvas.width = $("#parent").width();
  canvas.height = $("#parent").height();
});

JQuery를 모르는 경우 다음 Javascript를 사용하십시오.

var canvas = document.getElementById("theCanvas");
var parent = document.getElementById("parent");
canvas.width = parent.offsetWidth;
canvas.height = parent.offsetHeight;

css높이 및 너비 속성 을 사용하는 경우 style="width:100%; height:100%;"캔버스를 늘리는 것입니다. 이렇게하면 캔버스에 그리는 모든 것이 늘어난 것처럼 보입니다.

JQuery 솔루션 용 JSFiddle .

자바 스크립트 솔루션을위한 JSFiddle .


2
질문자가 jquery를 언급하지 않았으므로 아마도 그것에 대해 알지 못합니다. 순수한 자바 스크립트 메소드가 필요할 수 있습니다.
jing3142

@ jing3142 좋은 전화입니다. JQuery 솔루션과 비 JQuery 솔루션으로 업데이트했습니다.
Brant Olsen

1
비 jQuery 솔루션은 style=""부모에 명시 적 속성을 배치 하거나 JS를 사용하여 스타일을 설정 하지 않으면 실패 합니다. 당신은 사용해야 getComputedStyle()내가 내 대답에 그랬던 것처럼, 또는, offsetWidth/ offsetHeight.
Phrogz

대답 해주셔서 감사합니다. 가능하다면 당신의 대답과 첫 번째 대답을 모두 받아 들일 것입니다. 그러나 어쨌든 나는 너의 대답도 엄지 손가락으로 치켜 든다. 다시 설명 해주셔서 감사합니다.
user1118019

-1

태그의 속성 대신 CSS 속성을 사용합니다.

<div style="background-color:blue;width:140px;height:20px">
    <canvas style="background-color: red;width:100%;height:100%">
    </canvas>
</div>​

작동하는 것 같습니다


22
캔버스의 크기를 조정하는 대신 캔버스를 늘리면 캔버스의 모든 그림이 이상하게 보입니다.
Brant Olsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.