Неправильный размер контекста холста

#javascript #css #html #canvas

#javascript #css #HTML #холст

Вопрос:

У меня есть два блока холста, один из которых имеет встроенные атрибуты, а другой — CSS.

HTML:

 <canvas id="canv_in" width="400" height="400"> </canvas>
<canvas id="canv_ss"> </canvas>
  

CSS:

 canvas {
     background-color : rgba(200, 200, 200, 0.5);
}

#canv_ss {
    width : 400px;
    height: 400px;        
}
  

Оба холста имеют одинаковые размеры, но когда я пытаюсь нарисовать один и тот же прямоугольник в обоих из них, я получаю другой результат. Вот js:

 var canvasElems = document.getElementsByTagName("canvas");
var canvasContext;

for(i = 0; i < canvasElems.length;   i) {
    canvasContext = canvasElems[i].getContext("2d");
    canvasContext.fillStyle = "rgba(0, 0, 225, 1.0)";
    canvasContext.fillRect(120, 10, 150, 150);
}
  

Вот результат:

Холст странный

Итак, мой вопрос: как нам изменить размер прямоугольника по назначению, сохранив стили моих элементов в CSS? Разве это невозможно? Почему прямоугольник справа ведет себя странно?

Комментарии:

1. Второй имеет размеры по умолчанию. Затем он масштабируется / растягивается (неравномерно) до 400×400. Вы можете установить количество пикселей на холсте либо (a) с помощью атрибутов width / height в html, либо с помощью атрибутов width / height в JS. Для чего это стоит — в вашем первом не применяются встроенные стили — это атрибуты холста, а не атрибуты его стиля.

2. Интересно, поэтому мне всегда следует избегать изменения размера canvas в css?

3. Зависит от ваших потребностей. Я часто изменяю его в css (например, width: 100%), затем запрашиваю у элемента его размер на экране в JS, а затем устанавливаю его размеры в пикселях в соответствии с пространством, которое он занимает на экране. Для каждого способа определенно есть применение (атрибуты объекта против атрибутов css).

Ответ №1:

Атрибут width по умолчанию 300px имеет значение, а height 150px — значение . Добавление таблицы стилей к элементу просто масштабирует поле до этого размера и не расширяет пространство координат.

Размер элемента canvas может быть произвольным с помощью таблицы стилей, его растровое изображение затем подчиняется свойству CSS ‘object-fit’.

Внутренние размеры элемента canvas, когда он представляет внедренный контент, равны размерам растрового изображения элемента.

HTML Атрибуты ( width и height ) устанавливают размеры холста, которые определяют, как объекты измеряются на холсте.

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

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

Всякий width height раз, когда атрибуты и содержимого устанавливаются, удаляются, изменяются или избыточно устанавливаются в значение, которое у них уже есть, если включен режим контекста холста direct-2d , агент пользователя должен установить размеры растрового изображения в числовые значения атрибутов содержимого width и height .

Атрибуты width и height IDL должны отражать соответствующие атрибуты содержимого с одинаковыми именами и одинаковыми значениями по умолчанию.

Заключение

Существует разница между размерами холста и размером отображения холста.

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

Если вы определяете только размер отображения, размеры получат значение по умолчанию 300, умноженное на 150.

Здесь вы найдете более подробную информацию.