Отвечу более общий вопрос о том, как иметь холст динамически адаптироваться в размере от изменение размера окна. Принятый ответ надлежащим образом обрабатывает случай, когда ширина и высота должны быть равны 100%, что и требовалось, но которые также изменят соотношение сторон холста. Многие пользователи захотят изменить размер холста при изменении размера окна, но сохраняя соотношение сторон нетронутым. Это не точный вопрос, но он «подходит», просто ставя вопрос в несколько более общий контекст.
Окно будет иметь соотношение сторон (ширина/высота), а также объект холста. Как вы хотите, чтобы эти два соотношения сторон были связаны друг с другом, вам нужно будет четко прояснить, нет ответа «один размер подходит всем» на этот вопрос - я рассмотрю некоторые распространенные случаи того, что вы можете хотеть.
Самое важное, о чем вам нужно знать: объект html canvas имеет атрибут width и атрибут height; а затем, css одного и того же объекта также имеет ширину и атрибут высоты. Эти две ширины и высоты различны, и они полезны для разных вещей.
Изменение атрибутов ширины и высоты - это один из способов, с помощью которого вы всегда можете изменить размер своего холста, но тогда вам придется перекрасить все, что потребует времени и не всегда необходимо, поскольку некоторый размер вы можете выполнить с помощью атрибутов css, и в этом случае вы не будете перерисовывать холст.
я вижу 4 случая того, что вы могли бы произойти на изменения размеров окна (все, начиная с полного экрана холст)
1: Вы хотите, чтобы ширина оставаться 100%, и вы хотите, соотношение сторон, чтобы остаться как это было. В этом случае вам не нужно перерисовывать холст; вам даже не нужен обработчик изменения размера окна. Все, что вам нужно, это
$(ctx.canvas).css("width", "100%");
где ctx - ваш контекст в холсте. fiddle: resizeByWidth
2: вы хотите, чтобы ширина и высота оставались на 100%, и вы хотите, чтобы результирующее изменение соотношения сторон имело эффект растянутого изображения. Теперь вам все равно не нужно перерисовывать холст, но вам нужен обработчик изменения размера окна. В обработчике вы
$(ctx.canvas).css("height", window.innerHeight);
скрипку: messWithAspectratio
3: вы хотите ширину и высоту и остаться на 100%, но ответ на изменение соотношения сторон является то, что отличается от растягивания изображения. Затем вам нужно перерисовать и сделать это так, как это указано в принятом ответе.
скрипку: redraw
4: Вы хотите, ширину и высоту, чтобы быть 100% при загрузке страницы, но остаются неизменными (никакой реакции на изменения размеров окна
скрипку:. fixed
Все Fiddles имеют идентичный код, за исключением строки 63, где установлен режим. Вы также можете скопировать код скрипта для запуска на вашем локальном компьютере, и в этом случае вы можете выбрать режим с помощью аргумента запроса, как? mode = redraw
Смотрите также: https://stackoverflow.com/questions/4037212 – hippietrail 2017-08-23 23:36:51