Изменение размера холста HTML5 в соответствии с окном
Как я могу автоматически масштабировать элемент HTML5 <canvas>
для соответствия странице?
Например, я могу получить масштаб <div>
, установив свойства height
и width
на 100%, но <canvas>
не будет масштабироваться, не так ли?
Ответы
Ответ 1
Я считаю, что нашел элегантное решение для этого:
JavaScript
/* important! for alignment, you should make things
* relative to the canvas' current width/height.
*/
function draw() {
var ctx = (a canvas context);
ctx.canvas.width = window.innerWidth;
ctx.canvas.height = window.innerHeight;
//...drawing code...
}
CSS
html, body {
width: 100%;
height: 100%;
margin: 0;
}
До сих пор не оказал большого негативного влияния на производительность.
Ответ 2
Следующее решение работало для меня лучше всего. Поскольку я относительно новичок в кодировании, мне нравится иметь визуальное подтверждение того, что что-то работает так, как я ожидаю. Я нашел его на следующем сайте:
http://htmlcheats.com/html/resize-the-html5-canvas-dyamically/
Здесь код:
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Resize HTML5 canvas dynamically | www.htmlcheats.com</title>
<style>
html, body {
width: 100%;
height: 100%;
margin: 0px;
border: 0;
overflow: hidden; /* Disable scrollbars */
display: block; /* No floating content on sides */
}
</style>
</head>
<body>
<canvas id='c' style='position:absolute; left:0px; top:0px;'>
</canvas>
<script>
(function() {
var
// Obtain a reference to the canvas element using its id.
htmlCanvas = document.getElementById('c'),
// Obtain a graphics context on the canvas element for drawing.
context = htmlCanvas.getContext('2d');
// Start listening to resize events and draw canvas.
initialize();
function initialize() {
// Register an event listener to call the resizeCanvas() function
// each time the window is resized.
window.addEventListener('resize', resizeCanvas, false);
// Draw canvas border for the first time.
resizeCanvas();
}
// Display custom canvas. In this case it a blue, 5 pixel
// border that resizes along with the browser window.
function redraw() {
context.strokeStyle = 'blue';
context.lineWidth = '5';
context.strokeRect(0, 0, window.innerWidth, window.innerHeight);
}
// Runs each time the DOM window resize event fires.
// Resets the canvas dimensions to match window,
// then draws the new borders accordingly.
function resizeCanvas() {
htmlCanvas.width = window.innerWidth;
htmlCanvas.height = window.innerHeight;
redraw();
}
})();
</script>
</body>
</html>
Синяя рамка показывает краю холста для изменения размера и всегда находится вдоль края окна, видимого на всех 4 сторонах, что не относится к некоторым другим приведенным выше ответам. Надеюсь, что это поможет.
Ответ 3
В основном, вам нужно связать событие onresize с вашим телом, как только вы поймаете событие, вам просто нужно изменить размер холста, используя window.innerWidth и window.innerHeight.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Canvas Resize</title>
<script type="text/javascript">
function resize_canvas(){
canvas = document.getElementById("canvas");
if (canvas.width < window.innerWidth)
{
canvas.width = window.innerWidth;
}
if (canvas.height < window.innerHeight)
{
canvas.height = window.innerHeight;
}
}
</script>
</head>
<body onresize="resize_canvas()">
<canvas id="canvas">Your browser doesn't support canvas</canvas>
</body>
</html>
Ответ 4
Установка ширины и высоты пространства координат холста на основе размеров клиента браузера требует изменения размера и перерисовки при изменении размера браузера.
Менее сложное решение состоит в том, чтобы поддерживать допустимые размеры в переменных Javascript, но устанавливайте размеры холста на основе параметров screen.width, screen.height. Используйте CSS для соответствия:
#containingDiv {
overflow: hidden;
}
#myCanvas {
position: absolute;
top: 0px;
left: 0px;
}
Окно браузера обычно никогда не будет больше самого экрана (кроме случаев, когда разрешение экрана неверно описано, так как оно может быть с несогласованными двумя мониторами), поэтому фон не будет отображаться, а пропорции пикселей выиграют ' т. Прозрачные пиксели будут прямо пропорциональны разрешению экрана, если вы не используете CSS для масштабирования холста.
Ответ 5
A чистый CSS подход к решению @jerseyboy выше.
Работает в Firefox (протестировано в версии v29), Chrome (протестировано в версии 34) и Internet Explorer (протестировано в версии 11).
<!DOCTYPE html>
<html>
<head>
<style>
html,
body {
width: 100%;
height: 100%;
margin: 0;
}
canvas {
background-color: #ccc;
display: block;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500"></canvas>
<script>
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
ctx.fillRect(25,25,100,100);
ctx.clearRect(45,45,60,60);
ctx.strokeRect(50,50,50,50);
}
</script>
</body>
</html>
Ссылка на пример: http://temporaer.net/open/so/140502_canvas-fit-to-window.html
Но будьте осторожны, поскольку @jerseyboy заявляет в своем комментарии:
Сбрасывание холста с помощью CSS затруднительно. По крайней мере, в Chrome и Положение Safari, мыши/касания не будет соответствовать 1:1 с позиции пикселов холста, и вам придется преобразовать координаты системы.
Ответ 6
Если вы не хотите, чтобы холст автоматически масштабировал ваши данные изображения (о чем говорит Джеймс Блэк, но он не будет выглядеть красиво), вы должны сами изменить его размер и перерисовать изображение. Центрирование холста
Ответ 7
function resize() {
var canvas = document.getElementById('game');
var canvasRatio = canvas.height / canvas.width;
var windowRatio = window.innerHeight / window.innerWidth;
var width;
var height;
if (windowRatio < canvasRatio) {
height = window.innerHeight;
width = height / canvasRatio;
} else {
width = window.innerWidth;
height = width * canvasRatio;
}
canvas.style.width = width + 'px';
canvas.style.height = height + 'px';
};
window.addEventListener('resize', resize, false);
Ответ 8
Если ваш div полностью заполнил веб-страницу, вы можете заполнить этот div и создать холст, заполняющий div.
Это может показаться вам интересным, так как вам может понадобиться использовать css для использования процента, но, это зависит от того, какой браузер вы используете, и насколько он согласен со спецификацией:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#the-canvas-element
Внутренние размеры холста элемент равен размеру координатное пространство, с числами интерпретируется в пикселях CSS. Однако, элемент может быть произвольно задан по таблице стилей. При рендеринге, изображение масштабируется, чтобы соответствовать этому расположению размер.
Вам может потребоваться получить offsetWidth и высоту div, или получить высоту/ширину окна и установить это как значение пикселя.
Ответ 9
CSS
body { margin: 0; }
canvas { display: block; }
JavaScript
window.addEventListener("load", function()
{
var canvas = document.createElement('canvas'); document.body.appendChild(canvas);
var context = canvas.getContext('2d');
function draw()
{
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.moveTo(0, 0); context.lineTo(canvas.width, canvas.height);
context.moveTo(canvas.width, 0); context.lineTo(0, canvas.height);
context.stroke();
}
function resize()
{
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
draw();
}
window.addEventListener("resize", resize);
resize();
});
Ответ 10
Если вы заинтересованы в сохранении пропорций и в чистом CSS (с учетом соотношения сторон), вы можете сделать что-то вроде ниже. Ключ padding-bottom
в элементе ::content
, который определяет размер элемента container
. Это размер по отношению к его родительской ширине, который по умолчанию равен 100%
. Соотношение, указанное здесь, должно совпадать с отношением размеров к элементу canvas
.
// Javascript
var canvas = document.querySelector('canvas'),
context = canvas.getContext('2d');
context.fillStyle = '#ff0000';
context.fillRect(500, 200, 200, 200);
context.fillStyle = '#000000';
context.font = '30px serif';
context.fillText('This is some text that should not be distorted, just scaled', 10, 40);
/*CSS*/
.container {
position: relative;
background-color: green;
}
.container::after {
content: ' ';
display: block;
padding: 0 0 50%;
}
.wrapper {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
}
canvas {
width: 100%;
height: 100%;
}
<!-- HTML -->
<div class=container>
<div class=wrapper>
<canvas width=1200 height=600></canvas>
</div>
</div>
Ответ 11
(function() {
// get viewport size
getViewportSize = function() {
return {
height: window.innerHeight,
width: window.innerWidth
};
};
// update canvas size
updateSizes = function() {
var viewportSize = getViewportSize();
$('#myCanvas').width(viewportSize.width).height(viewportSize.height);
$('#myCanvas').attr('width', viewportSize.width).attr('height', viewportSize.height);
};
// run on load
updateSizes();
// handle window resizing
$(window).on('resize', function() {
updateSizes();
});
}());
Ответ 12
Используя jQuery, вы можете отслеживать изменение размеров окна и изменять ширину холста, используя также jQuery.
Что-то вроде того
$( window ).resize(function() {
$("#myCanvas").width($( window ).width())
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;">
Ответ 13
Я думаю, что это то, что мы должны делать точно: http://www.html5rocks.com/en/tutorials/casestudies/gopherwoord-studios-resizing-html5-games/
function resizeGame() {
var gameArea = document.getElementById('gameArea');
var widthToHeight = 4 / 3;
var newWidth = window.innerWidth;
var newHeight = window.innerHeight;
var newWidthToHeight = newWidth / newHeight;
if (newWidthToHeight > widthToHeight) {
newWidth = newHeight * widthToHeight;
gameArea.style.height = newHeight + 'px';
gameArea.style.width = newWidth + 'px';
} else {
newHeight = newWidth / widthToHeight;
gameArea.style.width = newWidth + 'px';
gameArea.style.height = newHeight + 'px';
}
gameArea.style.marginTop = (-newHeight / 2) + 'px';
gameArea.style.marginLeft = (-newWidth / 2) + 'px';
var gameCanvas = document.getElementById('gameCanvas');
gameCanvas.width = newWidth;
gameCanvas.height = newHeight;
}
window.addEventListener('resize', resizeGame, false);
window.addEventListener('orientationchange', resizeGame, false);
Ответ 14
Во-первых, вы не можете использовать атрибуты width и height, чтобы изменить размер (по крайней мере, с моей точки зрения), потому что это нарушит его. Вы можете сделать это: HTML:
<canvas id = 'myCanvas'></canvas>
JS:
var canvas = document.getElementById('myCanvas');
var W = window.innerWidth;
var H = window.innerHeight;
canvas.width = W;
canvas.height = H;
(Пожалуйста, прости меня за любые опечатки, я склонен делать это много)
Ответ 15
Я использую sketch.js, поэтому после запуска команды init для холста я изменяю ширину и высоту с помощью jquery. Он основывает размеры на родительском элементе.
$( '# DrawCanvas'). Эскиз(). Attr ( 'высота', $( '# DrawCanvas'). Родителя(). Высота()). Attr ( 'ширина', $( '# DrawCanvas'.).parent() ширина());