Изменить размер HTML5 холст, чтобы соответствовать окну
как я могу автоматически масштабировать HTML5 <canvas> элемент, чтобы соответствовать страницу?
например, я могу получить <div> для масштабирования, установив height и width свойства до 100%, но <canvas> не будет масштабироваться, не так ли?
14 ответов:
Я считаю, что нашел элегантное решение для этого:
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: 0px; }до сих пор не оказал большого негативного влияния на производительность для меня.
следующее решение работало для меня лучше всего. Поскольку я относительно новичок в кодировании, мне нравится иметь визуальное подтверждение того, что что-то работает так, как я ожидаю. Я нашел его на следующем сайте: 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's 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 сторон, что не было случай для некоторых других ответов выше. Надеюсь, это поможет.
в основном то, что вам нужно сделать, это привязать событие onresize к вашему телу, как только вы поймаете событие, вам просто нужно изменить размер холста с помощью окна.внутренняя ширина и окно.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>
установка ширины и высоты координатного пространства холста на основе размеров клиента браузера требует изменения размера и перерисовки при каждом изменении размера браузера.
менее запутанное решение заключается в том, чтобы поддерживать рисоваемые размеры в переменных Javascript, но устанавливать размеры холста на основе экрана.ширина, экран.размеры высоты. Используйте CSS, чтобы соответствовать:
#containingDiv { overflow: hidden; } #myCanvas { position: absolute; top: 0px; left: 0px; }в окне браузера, как правило, никогда не будет больше, чем сам экран (за исключением случаев, когда разрешение экрана неверно сообщается, как это может быть с несоответствующими двумя мониторами), поэтому фон не будет отображаться, а пропорции пикселей не будут меняться. Пиксели холста будут прямо пропорциональны разрешению экрана, если вы не используете CSS для масштабирования холста.
A чистый CSS подход добавление к решению @jerseyboy выше.
Работает в Firefox (проверено в в29), хром (проверено в v34) и 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 и Сафари, положение событий мыши/касания не будет соответствовать 1:1 с позиции пикселей холста, и вам придется преобразовать координату системный.
Если вы не хотите, чтобы холст автоматически масштабировал ваши данные изображения (это то, о чем говорит Ответ Джеймса Блэка, но это не будет выглядеть красиво), вам нужно изменить его размер самостоятельно и перерисовать изображение. центрирования полотна
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);
Если ваш div полностью заполнил веб-страницу, вы можете заполнить этот div и поэтому иметь холст, который заполняет div.
вы можете найти это интересным, так как вам может понадобиться использовать css для использования процента, но это зависит от того, какой браузер вы используете, и насколько он согласуется со спецификацией: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#the-canvas-element
внутренние размеры холст элемент равный размеру координатное пространство, с номерами интерпретируется в пикселях CSS. Однако, размер элемента может быть произвольным по таблице стилей. Во время рендеринга, изображение масштабируется в соответствии с этим макетом размер.
возможно, вам потребуется получить offsetWidth и высоту div или получить высоту/ширину окна и установить ее в качестве значения пикселя.
если вы заинтересованы в сохранении пропорций и делать это в чистом 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>
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(); });
(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(); }); }());
С помощью 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;">
Я думаю, что это то, что мы должны точно сделать: 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);
Я использую эскиз.js поэтому после запуска команды init для холста я изменяю ширину и высоту с помощью jquery. Он базирует размеры на родительском элементе.
$('#DrawCanvas').эскиз.)(attr ('height',$('#DrawCanvas').родитель.)(высота.))(attr ('width',$('#DrawCanvas').родитель.)(ширина());
Comments