Центрирование холста - PullRequest
52 голосов
/ 20 июля 2009

Как мне разметить страницу с помощью HTML5 canvas, чтобы canvas

  1. Занимает 80% ширины

  2. Имеет соответствующую высоту и ширину пикселя, которые эффективно определяют соотношение (и пропорционально поддерживаются, когда холст растягивается до 80%)

  3. Центрируется по вертикали и по горизонтали

Вы можете предположить, что canvas - единственное на странице, но не стесняйтесь инкапсулировать его в div с при необходимости.

Ответы [ 11 ]

36 голосов
/ 18 января 2012

Это будет центрировать холст по горизонтали:

#canvas-container {
   width: 100%;
   text-align:center;
}

canvas {
   display: inline;
}

HTML:

<div id="canvas-container">
   <canvas>Your browser doesn't support canvas</canvas>
</div>
17 голосов
/ 29 января 2015

Глядя на текущие ответы, я чувствую, что отсутствует одно простое и понятное исправление. На всякий случай, если кто-то проходит мимо и ищет правильное решение. Я довольно успешен с некоторыми простыми CSS и javascript.

Центр холста по центру экрана или родительского элемента. Без упаковки.

HTML:

<canvas id="canvas" width="400" height="300">No canvas support</canvas>

CSS:

#canvas {
    position: absolute;
    top:0;
    bottom: 0;
    left: 0;
    right: 0;
    margin:auto;
}

Javascript:

window.onload = window.onresize = function() {
    var canvas = document.getElementById('canvas');
    canvas.width = window.innerWidth * 0.8;
    canvas.height = window.innerHeight * 0.8;
}

Работает как шарм - проверено: Firefox, Chrome

скрипка: http://jsfiddle.net/djwave28/j6cffppa/3/

8 голосов
/ 18 июня 2016

Самый простой способ

поместите холст в теги абзаца следующим образом:

<p align="center">
  <canvas id="myCanvas" style="background:#220000" width="700" height="500" align="right"></canvas>
</p>
7 голосов
/ 29 октября 2009

Проверено только на Firefox:

<script>
window.onload = window.onresize = function() {
    var C = 0.8;        // canvas width to viewport width ratio
    var W_TO_H = 2/1;   // canvas width to canvas height ratio
    var el = document.getElementById("a");

    // For IE compatibility http://www.google.com/search?q=get+viewport+size+js
    var viewportWidth = window.innerWidth;
    var viewportHeight = window.innerHeight;

    var canvasWidth = viewportWidth * C;
    var canvasHeight = canvasWidth / W_TO_H;
    el.style.position = "fixed";
    el.setAttribute("width", canvasWidth);
    el.setAttribute("height", canvasHeight);
    el.style.top = (viewportHeight - canvasHeight) / 2;
    el.style.left = (viewportWidth - canvasWidth) / 2;

    window.ctx = el.getContext("2d");
    ctx.clearRect(0,0,canvasWidth,canvasHeight);
    ctx.fillStyle = 'yellow';
    ctx.moveTo(0, canvasHeight/2);
    ctx.lineTo(canvasWidth/2, 0);
    ctx.lineTo(canvasWidth, canvasHeight/2);
    ctx.lineTo(canvasWidth/2, canvasHeight);
    ctx.lineTo(0, canvasHeight/2);
    ctx.fill()
}
</script>

<body>
<canvas id="a" style="background: black">
</canvas>
</body>
4 голосов
/ 29 июня 2011

для центрирования холста в окне + "px" должны быть добавлены к el.style.top и el.style.left.

el.style.top = (viewportHeight - canvasHeight) / 2 +"px";
el.style.left = (viewportWidth - canvasWidth) / 2 +"px";
1 голос
/ 07 сентября 2015

Simple:

<body>
    <div>
        <div style="width: 800px; height:500px; margin: 50px auto;">
            <canvas width="800" height="500" style="background:#CCC">
             Your browser does not support HTML5 Canvas.
            </canvas>
        </div>
    </div>
</body>
1 голос
/ 26 декабря 2011

Изменение размера холста с помощью CSS не очень хорошая идея. Это должно быть сделано с использованием Javascript. Смотрите ниже функцию, которая делает это

function setCanvas(){

   var canvasNode = document.getElementById('xCanvas');

   var pw = canvasNode.parentNode.clientWidth;
   var ph = canvasNode.parentNode.clientHeight;

   canvasNode.height = pw * 0.8 * (canvasNode.height/canvasNode.width);  
   canvasNode.width = pw * 0.8;
   canvasNode.style.top = (ph-canvasNode.height)/2 + "px";
   canvasNode.style.left = (pw-canvasNode.width)/2 + "px";


}

демо здесь: http://jsfiddle.net/9Rmwt/11/show/

.

0 голосов
/ 26 ноября 2012

Те же коды от Николая выше, но проверены на IE9 и Chrome (и удалены дополнительные рендеринга):

window.onload = window.onresize = function() {
   var canvas = document.getElementById('canvas');
   var viewportWidth = window.innerWidth;
   var viewportHeight = window.innerHeight;
   var canvasWidth = viewportWidth * 0.8;
   var canvasHeight = canvasWidth / 2;

   canvas.style.position = "absolute";
   canvas.setAttribute("width", canvasWidth);
   canvas.setAttribute("height", canvasHeight);
   canvas.style.top = (viewportHeight - canvasHeight) / 2 + "px";
   canvas.style.left = (viewportWidth - canvasWidth) / 2 + "px";
}

HTML:

<body>
  <canvas id="canvas" style="background: #ffffff">
     Canvas is not supported.
  </canvas>
</body>

Верхнее и левое смещение работает только при добавлении px.

0 голосов
/ 23 октября 2011

Что касается предложения CSS:

#myCanvas { 
 width: 100%;
 height: 100%;
}

По стандарту CSS не определяет размер системы координат холста, он масштабирует содержимое. В Chrome упомянутый CSS будет масштабировать холст вверх или вниз, чтобы соответствовать макету браузера. В типичном случае, когда система координат меньше размеров браузера в пикселях, это эффективно снижает разрешение вашего чертежа. Скорее всего, это также приводит к непропорциональному рисованию.

0 голосов
/ 29 августа 2010

Упаковка с div должна работать. Я тестировал его в Firefox, Chrome на Fedora 13 ( демо ).

#content {
   width: 95%;
   height: 95%;
   margin: auto;
}

#myCanvas {
   width: 100%;
   height: 100%;
   border: 1px solid black;
}

А холст должен быть заключен в тег

<div id="content">
    <canvas id="myCanvas">Your browser doesn't support canvas tag</canvas>
</div>

Дайте мне знать, если это работает. Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...