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


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. 캔버스 의 width및 height속성은 그릴 데이터의 픽셀 수 (예 : 이미지의 실제 픽셀) 를 지정하며 캔버스 의 표시 크기 와는 별개입니다 . 이러한 속성은 정수로 설정해야합니다.

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

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

캔버스가 실제로 부모 요소만큼 크도록하려면 캔버스 의 width및 height속성을 사용하십시오 . 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.