Как избежать автоматической растяжки HTML-холста
У меня есть следующий фрагмент HTML:
<style type="text/css">
#c{width:200px;height:500px}
</style>
<canvas id="c"></canvas>
<script type="text/javascript">
var i = new Image();
i.onload = function () {
var ctx = document.getElementById('c').getContext('2d');
ctx.drawImage(i, 0, 0);
}
i.width = i.height = 20; // actual size of square.png
i.src = 'square.png';
</script>
Проблема заключается в том, что нарисованное изображение автоматически растягивается (изменяется) пропорционально размеру холста. Я попытался использовать все доступные параметры (drawImage(i, 0, 0, 20, 20, 0, 0, 20, 20)
), и это не помогло.
Что заставляет мой рисунок растягиваться и как я могу предотвратить это?
Спасибо,
Том
5 ответов:
Вам нужны атрибуты
width
иheight
в элементе canvas. Они задают координатное пространство для холста. По-видимому, по умолчанию это холст с соотношением сторон 2:1, который ваш CSS искажает в квадрат.
Стоит отметить, что атрибуты ширины и высоты canvas Не, как атрибуты ширины и высоты старой школы . Они не являются заменой CSS. Они определяют, сколько пикселей должен иметь пиксельный буфер в самом холсте, и если вы не применяете размер к нему с помощью css, css будет подразумевать, что это размер из этой формы этого пиксельного буфера. Установка размера элемента в css не устанавливает размер пиксельного буфера - он изменяет его размер. С точки зрения CSS, это совершенно то же самое, что и .
Хорошо, немного проще (и легче), чем JQuery .. Сама JAVASCRIP конечно !
Если вам нужно динамически изменить размеры холста, просто используйте:
document.getElementById('yourcanvasid').setAttribute('width', aWidth); document.getElementById('yourcanvasid').setAttribute('height', aHeight);
Если вы используете JQuery, вы не должны устанавливать CSS (как упоминалось выше в комментариях). Вам нужно установить атрибут так:
$("canvas").attr('width', aWidth); $("canvas").attr('height', aHeight);
Отлично работает.
Мне было проще просто поместить цикл while, ожидающий таймаута, в мой цикл анимации, например:
function animate() { c.clearRect(0, 0, window.innerWidth, window.innerHeight); ryuji.draw(); ryuji.update(); let now = Date.now(); then = now + (1000 / fps); while (Date.now() < then) { } requestAnimationFrame(animate); }