@ZmeuSnake

Как правильно задавать размеры canvas?

У нас есть:
1. html страница со скриптом, который на белом фоне рисует в центре канваса черный квадрат.
<html>
<body>
    <center>
        <canvas id="canvas1"></canvas>
    </center>

    <script>
        var canvas = document.getElementById("canvas1");
        ctx = canvas.getContext('2d');
        var centerX = canvas.width / 2;
        var centerY = canvas.height / 2;
        var width = 60;
        var height = 60;
        ctx.lineWidth = 1;
        ctx.fillStyle = "White";
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        ctx.fillStyle = "Black";
        ctx.fillRect(centerX - width / 2, centerY - height / 2, width, height);
    </script>

</body>
</html>


Есть стиль для канваса:
canvas {
    width: 80%;
    height: 65%;
    border: solid 1px black;
}


Если убрать width и height, то всё хорошо, рисуется канвас, на нем черный квадрат.
Но мне нужен большой канвас, и тут изображение получается растянутым и размытым: как будто сначала происходит отрисовка, а потом уже применяется стиль, и канвас растягивается на 80 и 65 процентов относительно размеров страницы и растягивает картинку.

Как мне сначала задать размер канваса, а потом уже начать рисовать на нем?

Страница без стилей:
02259db90bec41938403b5c7bfbb9b8d.jpg
И со стилем(по краям квадрата видно размытие, изображение растянуто):
44f9bbefb7a642d1b002febfb8a3d7a4.jpg
  • Вопрос задан
  • 9622 просмотра
Решения вопроса 2
Вы не инициируете размер холста, и он устанавливается по умолчанию.

нужно добавить вот это в ваш код
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;


Полная версия кода https://jsfiddle.net/aw5dzy0j/
Ответ написан
Комментировать
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Насколько я помню, устанавливать размеры канваса через CSS не рекомендуется — вот как раз из-за таких эффектов. Надо устанавливать ширину через атрибуты, как-то так: codepen.io/hogart/pen/ZOQRMO
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы