I would like to be able to center single lines of text within rectangular areas I can calculate. The one thing I have expected to do in 2D geometry on a canvas is to center
You can do this by using measureText
var canvas = document.getElementById("canvas"),
ctx = canvas.getContext("2d")
canvas.width = 400;
canvas.height = 200;
ctx.fillStyle = "#003300";
ctx.font = '20px san-serif';
var textString = "Hello look at me!!!",
textWidth = ctx.measureText(textString ).width;
ctx.fillText(textString , (canvas.width/2) - (textWidth / 2), 100);
Live Demo
More elaborate demo
You can use ctx.textAlign = "center"; to align item to center
var canva = document.getElementById("canvas");
ctx.textAlign = "center"; // To Align Center
ctx.font = "40px Arial"; // To change font size and type
ctx.fillStyle = '#313439'; // To give font
ctx.fillText("Text Center", 150 ,80);
If you don't necesserilly need a width of the text but just want to center text you can do
canvas_context.textBaseline = 'middle';
canvas_context.textAlign = "center";
Which should put a text centered both vertically and horizontally.
developer.mozilla.org states in the textAlign
description
that the alignment is based on the x value of the context's fillText()
method. That is, the property does not center the text in the canvas horizontally; it centers the text around the given x coordinate. Similar applies for the textBaseLine
.
So in order to center the text in both directions, we need to set those two properties and position the text in the middle of the canvas.
ctx.textBaseline = 'middle';
ctx.textAlign = 'center';
ctx.fillText('Game over', canvas_width/2, canvas_height/2);
What you do is render your text off-screen using a negative text-indent, then grab the size.
text-indent: -9999px
See: hiding text using "text-indent"