How to center canvas in html5

HtmlCanvasCssResize

Html Problem Overview


I've been searching for a solution for a while now, but haven't found anything. Maybe it's just my search terms. Well, I'm trying to make the canvas center according to the size of the browser window. The canvas is 800x600. And if the window gets below 800x600, it should resize as well(but that's not very important at the moment)

Html Solutions


Solution 1 - Html

Give the canvas the following css style properties:

canvas {
	padding-left: 0;
	padding-right: 0;
	margin-left: auto;
	margin-right: auto;
	display: block;
	width: 800px;
}

Edit

Since this answer is quite popular, let me add a little bit more details.

The above properties will horizontally center the canvas, div or whatever other node you have relative to it's parent. There is no need to change the top or bottom margins and paddings. You specify a width and let the browser fill the remaining space with the auto margins.

However, if you want to type less, you could use whatever css shorthand properties you wish, such as

canvas {
    padding: 0;
    margin: auto;
    display: block;
    width: 800px;
}

Centering the canvas vertically requires a different approach however. You need to use absolute positioning, and specify both the width and the height. Then set the left, right, top and bottom properties to 0 and let the browser fill the remaining space with the auto margins.

canvas {
	padding: 0;
    margin: auto;
	display: block;
	width: 800px;
    height: 600px;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

The canvas will center itself based on the first parent element that has position set to relative or absolute, or the body if none is found.

Another approach would be to use display: flex, that is available in IE11

Also, make sure you use a recent doctype such as xhtml or html 5.

Solution 2 - Html

You can give your canvas the ff CSS properties:

#myCanvas
{
    display: block;
    margin: 0 auto;
}

Solution 3 - Html

To center the canvas element horizontally, you must specify it as a block level and leave its left and right margin properties to the browser:

canvas{
	margin-right: auto;
	margin-left: auto;
	display: block;
}

If you wanted to center it vertically, the canvas element needs to be absolutely positioned:

canvas{
	position: absolute;
	top: 50%;
	transform: translate(0, -50%);				
}

If you wanted to center it horizontally and vertically, do:

canvas{
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);				
}

For more info visit: https://www.w3.org/Style/Examples/007/center.en.html

Solution 4 - Html

Just center the div in HTML:

  #test {
     width: 100px;
     height:100px;
     margin: 0px auto;
     border: 1px solid red;
   }


<div id="test">
   <canvas width="100" height="100"></canvas>
</div>

Just change the height and width to whatever and you've got a centered div

http://jsfiddle.net/BVghc/2/

Solution 5 - Html

You can also use Flexbox, however the canvas element must be inside a div, just applying it to the canvas element will not work.

HTML:

<div class="canvas-container">
    <canvas width="150" height="200"></canvas>
</div>

CSS:

.canvas-container {
    display: flex;
    align-items: center;
    justify-content: center;
}

Solution 6 - Html

The above answers only work if your canvas is the same width as the container.

This works regardless:

#container {
  width: 100px;
  height:100px;
  border: 1px solid red;
  
  
  margin: 0px auto;
  text-align: center;
}

#canvas {
  border: 1px solid blue;
  width: 50px;
  height: 100px;
  
}

<div id="container">
  <canvas id="canvas" width="100" height="100"></canvas>
</div>

Solution 7 - Html

Use this code:

<!DOCTYPE html>
<html>
<head>
<style>
.text-center{
	text-align:center;
    margin-left:auto;
    margin-right:auto;
}
</style>
</head>
<body>

<div class="text-center">
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;">
Your browser does not support the HTML5 canvas tag.
</canvas>
</div>

</body>
</html>

Solution 8 - Html

Add text-align: center; to the parent tag of <canvas>. That's it.

Example:

<div style="text-align: center">
    <canvas width="300" height="300">
        <!--your canvas code -->
    </canvas>
</div>

Solution 9 - Html

I have had the same problem, as I have pictures with many different widths which I load only with height info. Setting a width allows the browser to stretch and squeeze the picture. I solve the problem by having the text line just before the image_tag line centred (also getting rid of float: left;). I would have liked the text to be left aligned, but this is a minor inconvienence, that I can tolerate.

Solution 10 - Html

Using grid?

const canvas = document.querySelector('canvas'); 
const ctx = canvas.getContext('2d'); 
ctx.fillStyle = "#FF0000";
ctx.fillRect(0, 0, canvas.width, canvas.height);

body, html {
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
    background-color: black;
}

body {
    display: grid;
    grid-template-rows: auto;
    justify-items: center;
    align-items: center;
}

canvas {
  height: 80vh; 
  width: 80vw; 
  display: block;
}

<html>
  <body>
        <canvas></canvas>
  </body>
</html>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjorgenView Question on Stackoverflow
Solution 1 - HtmlMarco LuglioView Answer on Stackoverflow
Solution 2 - HtmljinmichaelrView Answer on Stackoverflow
Solution 3 - HtmlKonkretView Answer on Stackoverflow
Solution 4 - HtmlJoeCianfloneView Answer on Stackoverflow
Solution 5 - HtmlEpic SpeedyView Answer on Stackoverflow
Solution 6 - HtmlSystemicPluralView Answer on Stackoverflow
Solution 7 - HtmlKeyur PatelView Answer on Stackoverflow
Solution 8 - HtmlRaj YadavView Answer on Stackoverflow
Solution 9 - HtmlMDMView Answer on Stackoverflow
Solution 10 - HtmlAlex NolascoView Answer on Stackoverflow