CSS를 사용할 때 캔버스가 늘어나지 만 "너비"/ "높이"속성에서는 보통


195

나는 2 개의 캔버스를 가지고 있는데, 하나는 HTML 속성 width을 사용 height하고 크기를 조정하기 위해 다른 하나는 CSS를 사용합니다.

<canvas id="compteur1" width="300" height="300" onmousedown="compteurClick(this.id);"></canvas>
<canvas id="compteur2" style="width: 300px; height: 300px;" onmousedown="compteurClick(this.id);"></canvas>

Compteur1은 정상적으로 표시되지만 compteur2는 표시되지 않습니다. 컨텐츠는 300x300 캔버스에서 JavaScript를 사용하여 그려집니다.

왜 디스플레이 차이가 있습니까?

대체 텍스트

답변:


216

것으로 보인다 widthheightCSS의 속성을 그냥 표시됩니다있는 상자의 크기를 결정하는 반면, 좌표 시스템의 속성은 폭 또는 캔버스의 높이를 결정합니다.

이것은 http://www.whatwg.org/html#attr-canvas-width (JS 필요) 또는 http://www.whatwg.org/c#attr-canvas-width (컴퓨터를 먹을 것입니다 )에 설명되어 있습니다 . :

canvas요소는 요소의 비트 맵의 크기를 제어하는 두 가지 속성이 있습니다 widthheight. 지정된 경우 이러한 속성에는 음이 아닌 유효한 정수 값이 있어야합니다 . 음수가 아닌 정수를 구문 분석 하는 규칙을 사용하여 숫자 값을 가져와야합니다. 속성이 누락되었거나 해당 값을 구문 분석 할 때 오류가 발생하면 기본값을 대신 사용해야합니다. width300 속성 기본값과 height150 속성 기본값으로 설정합니다.


11
사실 .. 나는 항상 html 버전에서 "width"와 "height"와 같은 직접적인 속성이 더 이상 사용되지
않는다고 생각했다

4
오, 분명히 그것은 실제로 whatwg.org/specs/web-apps/current-work/multipage/… (섹션 #attr-canvas-width) 에서 잘 설명되어 있습니다. 문제는 width이전 에 잘못된 것을 클릭하고 #dom-canvas-width대신 섹션으로 갔다는 것입니다. 그것에 대해 w3.org/Bugs/Public/show_bug.cgi?id=9469 를 제출 했습니다.
SamB

3
모양은 비슷하지만 근본적으로 다른 API (css 너비, 높이)가 있습니다. 와.
벤 애스턴

1
내부 좌표계를 다르게하고 싶을 때 시간을 구분하는 것이 중요합니다. (즉, 망막 디스플레이 또는 8 비트 스타일 게임용)
Samy Bencherif

1
이것은 정말로 혼란 스러웠다. CSS에서 너비와 높이를 설정하려고합니다. 폭과 높이에 대한이 두 가지 다른 해석에 대해 알아 내기 위해 이틀간의 머리카락을 당겼습니다. 그냥 와우 ...
NME 뉴 미디어 엔터테인먼트

39

을 설정하려면 widthheight당신이 필요로하는, 당신은 사용할 수 있습니다

canvasObject.setAttribute('width', '475');

6
+1 el.setAttribute('width', parseInt($el.css('width')))트릭을 수행했습니다
Shanimal

9
캔버스가 상대적 크기를 갖도록하려면 어떻게해야합니까? 즉, width: 100%;CSS 속성 을 모방하는 방법은 무엇입니까?
Maxbester

1
좋은 대답이지만 canvasObject.setAttribute ( 'height', '123')도 추가하는 것을 잊지 마십시오!
Tom Wells

.setAttribute ()를 사용할 필요는 없다고 생각합니다. 항상 .width 및 .height 속성을 사용했습니다.
Zorgatone

4
getComputedStyle :을 사용하는 일반 JavaScript (jQuery 없음) 버전 canvas.setAttribute('width', window.getComputedStyle(canvas, null).getPropertyValue("width"));. 높이에 대해 반복하십시오.
벤 J

25

위해 <canvas>요소의 CSS의 규칙 widthheight페이지로 그려집니다 캔버스 요소의 실제 크기를 설정합니다. 한편, HTML은의 속성 widthheight좌표 시스템이나 캔버스 API가 사용할 '그리드'의 크기를 설정합니다.

예를 들어 다음을 고려하십시오 ( jsfiddle ).

var ctx = document.getElementById('canvas1').getContext('2d');
ctx.fillStyle = "red";
ctx.fillRect(10, 10, 30, 30);

var ctx2 = document.getElementById('canvas2').getContext('2d');
ctx2.fillStyle = "red";
ctx2.fillRect(10, 10, 30, 30);
canvas {
  border: 1px solid black;
}
<canvas id="canvas1" style="width: 50px; height: 100px;" height="50" width="100"></canvas>
<canvas id="canvas2" style="width: 100px; height: 100px;" height="50" width="100"></canvas>

둘 다 캔버스 요소의 내부 좌표와 관련하여 동일한 것을 그렸습니다. 그러나 두 번째 캔버스에서는 전체적으로 캔버스가 CSS 규칙에 의해 더 큰 영역에 걸쳐 늘어나 기 때문에 빨간색 사각형의 너비가 두 배가됩니다.

참고 : width및 / 또는 CSS 규칙 height이 지정되지 않은 경우 브라우저는 HTML 속성을 사용하여이 값의 1 단위가 페이지에서 1 픽셀이되도록 요소의 크기를 조정합니다. 이 속성이 지정되지 않은 경우, 그들은 기본값으로 사용됩니다 width300height150.


16

CSS에서 너비와 높이를 설정하면 캔버스가 늘어납니다. 캔버스의 크기를 동적으로 조작하려면 다음과 같이 JavaScript를 사용해야합니다.

canvas = document.getElementById('canv');
canvas.setAttribute('width', '438');
canvas.setAttribute('height', '462');

1
큰! 이 답변에 감사드립니다. 나는 넣어했다 canvas.setAttribute전에 canvas.getContext('2d')이미지의 스트레칭 피하기 위해.
hhh April

6

브라우저는 CSS 너비와 높이를 사용하지만 캔버스 요소는 캔버스 너비와 높이에 따라 크기가 조정됩니다. 자바 스크립트에서 CSS 너비와 높이를 읽고 캔버스 너비와 높이를 설정하십시오.

var myCanvas = $('#TheMainCanvas');
myCanvas[0].width = myCanvas.width();
myCanvas[0].height = myCanvas.height();

2

Shannimal 보정

var el = $('#mycanvas');
el.attr('width', parseInt(el.css('width')))
el.attr('height', parseInt(el.css('height')))

0

CSS는 캔버스 요소의 너비와 높이를 설정하여 좌표 공간에 영향을 미치므로 모든 것이 비뚤어지게됩니다.

다음은 Vanilla JavaScript로 너비와 높이를 설정하는 방법입니다.

canvas.width = numberForWidth

canvas.height = numberForHeight

-1

CSS 미디어 쿼리와 같은 동적 동작을 원한다면 캔버스 너비 및 높이 속성을 사용하지 마십시오. CSS 규칙을 사용한 다음 캔버스 렌더링 컨텍스트를 가져 오기 전에 CSS 너비 및 높이 스타일을 너비 및 높이 속성에 지정하십시오.

var elem = document.getElementById("mycanvas");

elem.width = elem.style.width;
elem.height = elem.style.height;

var ctx1 = elem.getContext("2d");
...

CSS에서만 크기가 지정된 경우 캔버스는 기본 좌표 크기 (300 x 150)를 갖습니다. 그러나이 제안은 저에게 효과적이지 않지만 아래 해결책이 효과적입니다.
Per Lindberg

@PerLindberg-이 요소는 캔버스 요소에 CSS 너비와 높이를 픽셀 단위로 정의한 경우 작동합니다.
Manolo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.