Холст растягивается при использовании CSS, но нормальный с свойствами "ширина" / "высота"

У меня есть 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. Содержимое рисуется с использованием JavaScript на холсте 300x300.

Почему существует разница в показаниях?

alt text

Ответ 1

Кажется, что атрибуты width и height определяют ширину или высоту системы координат холста, тогда как свойства CSS определяют размер окна, в котором он будет отображаться.

Это объясняется в http://www.whatwg.org/html#attr-canvas-width (требуется JS) или http://www.whatwg.org/c#attr-canvas-width (вероятно, будет есть ваш компьютер):

Элемент canvas имеет два атрибута для управления размером растрового изображения элемента: width и height. Эти атрибуты, если они указаны, должны иметь значения, которые являются действительными неотрицательными целыми числами. Правила для анализа неотрицательных целых чисел должны использоваться для получения их числовых значений. Если атрибут отсутствует или разбор его значения возвращает ошибку, вместо этого следует использовать значение по умолчанию. Атрибуту width по умолчанию соответствует 300, а атрибуту height по умолчанию соответствует 150.

Ответ 2

Чтобы установить width и height, вам нужно использовать

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

Ответ 3

Для элементов <canvas> правила CSS для width и height устанавливают фактический размер элемента canvas, который будет нарисован на странице. С другой стороны, атрибуты HTML width и height устанавливают размер системы координат или сетки, которые будет использовать API-интерфейс canvas.

Например, рассмотрим это (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>

Ответ 4

Холст будет растянут, если вы установите ширину и высоту в CSS. Если вы хотите динамически манипулировать размером холста, вы должны использовать JavaScript следующим образом:

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

Ответ 5

Браузер использует ширину и высоту css, но элемент холста масштабируется на основе ширины и высоты холста. В javascript читайте ширину и высоту css и задайте ширину и высоту холста.

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

Ответ 6

Коррекция ланномания

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

Ответ 7

Если вы хотите динамическое поведение, основанное на, например, CSS-медиа-запросы, не используйте атрибуты ширины и высоты холста. Используйте правила CSS, а затем, прежде чем получить контекст рендеринга canvas, присвойте атрибутам width и height стилям ширины и высоты CSS:

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

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

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