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"