Я отвечу на более общий вопрос о том, как сделать так, чтобы холст динамически изменял размер при изменении размера окна. Принятый ответ соответствующим образом обрабатывает случай, когда ширина и высота, как предполагается, равны 100%, что и было запрошено, но это также изменит соотношение сторон холста. Многие пользователи захотят изменить размер холста при изменении размера окна, но при этом не изменяя пропорции. Это не точный вопрос, но он «вписывается», просто помещая вопрос в чуть более общий контекст.
Окно будет иметь некоторое соотношение сторон (ширина / высота), как и объект Canvas. То, как вы хотите, чтобы эти два аспектных соотношения соотносились друг с другом, - это одна вещь, о которой вы должны уяснить: нет ответа «один размер подходит всем» - я рассмотрю несколько общих случаев того, что вы можете хочу.
Самая важная вещь, о которой вы должны знать: объект HTML-холста имеет атрибут width и height; и затем CSS того же объекта также имеет атрибуты width и height. Эти две ширины и высоты разные, они полезны для разных вещей.
Изменение атрибутов ширины и высоты - это один из методов, с помощью которого вы всегда можете изменить размер холста, но тогда вам придется перекрашивать все, что займет время и не всегда необходимо, потому что некоторое изменение размера Вы можете выполнить с помощью атрибутов CSS, в этом случае вы не перерисовываете холст.
Я вижу 4 случая, когда вы можете изменить размер окна (все начинается с полноэкранного холста)
1: вы хотите, чтобы ширина оставалась 100%, и вы хотите, чтобы соотношение сторон оставалось прежним. В этом случае вам не нужно перерисовывать холст; вам даже не нужен обработчик изменения размера окна. Все, что вам нужно, это
$(ctx.canvas).css("width", "100%");
где ctx - ваш контекст холста.
скрипка: resizeByWidth
2: вы хотите, чтобы ширина и высота оставались на 100%, и вы хотите, чтобы результирующее изменение соотношения сторон имело эффект растянутого изображения. Теперь вам не нужно перерисовывать холст, но вам нужен обработчик изменения размера окна. В обработчике вы делаете
$(ctx.canvas).css("height", window.innerHeight);
скрипка: messWithAspectratio
3: ширина и высота должны оставаться равными 100%, но ответ на изменение соотношения сторон отличается от растяжения изображения. Затем вам нужно перерисовать и сделать это так, как указано в принятом ответе.
скрипка: перерисовка
4: вы хотите, чтобы ширина и высота составляли 100% при загрузке страницы, но после этого оставались постоянными (никакой реакции на изменение размера окна.
скрипка: фиксированная
Все скрипты имеют одинаковый код, за исключением строки 63, в которой установлен режим. Вы также можете скопировать код скрипты для запуска на локальном компьютере, и в этом случае вы можете выбрать режим с помощью аргумента строки запроса, например? Mode = redraw