HTML Canvas Full Screen

JavascriptHtmlCanvas

Javascript Problem Overview


I'm playing with the following application using the HTML Canvas: http://driz.co.uk/particles/

At the moment it is set to 640x480 pixels, but I would like to make it full screen as it will be shown a projector. However as far as I can tell I cannot set the canvas size to be 100% as the variables only except numbers and not the %. Using CSS just stretches it rather than making it actual full screen.

Any ideas?

EDIT: Tried finding the height and width using jQuery but it breaks the canvas any ideas why?

var $j = jQuery.noConflict();


var canvas;
var ctx;
var canvasDiv;
var outerDiv;

var canvasW = $j('body').width();
var canvasH = $j('body').height();

//var canvasW     = 640;
//var canvasH     = 480;
    
var numMovers   = 550;
var movers      = [];
var friction    = .96;
var radCirc     = Math.PI * 2;

var mouseX, mouseY, mouseVX, mouseVY, prevMouseX = 0, prevMouseY = 0;	
var isMouseDown = true;



function init()
{
	canvas = document.getElementById("mainCanvas");
	
	if( canvas.getContext )
	{
		setup();
		setInterval( run , 33 );
	}
}
   
function setup()
{
	outerDiv = document.getElementById("outer");
	canvasDiv = document.getElementById("canvasContainer");
	ctx = canvas.getContext("2d");
	
	var i = numMovers;
	while( i-- )
	{
		var m = new Mover();
		m.x  = canvasW * .5;
		m.y  = canvasH * .5;
		m.vX = Math.cos(i) * Math.random() * 25;
		m.vY = Math.sin(i) * Math.random() * 25;
		m.size = 2;
		movers[i] = m;
	}
	
	document.onmousedown = onDocMouseDown;
	document.onmouseup   = onDocMouseUp;
	document.onmousemove = onDocMouseMove;
}

function run()
{
	ctx.globalCompositeOperation = "source-over";
	ctx.fillStyle = "rgba(8,8,12,.65)";
	ctx.fillRect( 0 , 0 , canvasW , canvasH );
	ctx.globalCompositeOperation = "lighter";
	
	mouseVX    = mouseX - prevMouseX;
	mouseVY    = mouseY - prevMouseY;
	prevMouseX = mouseX;
	prevMouseY = mouseY;
	
	var toDist   = canvasW / 1.15;
	var stirDist = canvasW / 8;
	var blowDist = canvasW / 2;
	
	var Mrnd   = Math.random;
	var Mabs   = Math.abs;
	var Msqrt  = Math.sqrt;
	var Mcos   = Math.cos;
	var Msin   = Math.sin;
	var Matan2 = Math.atan2;
	var Mmax   = Math.max;
	var Mmin   = Math.min;
	
	var i = numMovers;
	while( i-- )
	{
		var m  = movers[i];
		var x  = m.x;
		var y  = m.y;
		var vX = m.vX;
		var vY = m.vY;
		
		var dX = x - mouseX;
		var dY = y - mouseY; 
		var d = Msqrt( dX * dX + dY * dY );
		var a = Matan2( dY , dX );
		var cosA = Mcos( a );
		var sinA = Msin( a );
		
		if( isMouseDown )
		{
			if( d < blowDist )
			{
				var blowAcc = ( 1 - ( d / blowDist ) ) * 2;
				vX += cosA * blowAcc + .5 - Mrnd();
				vY += sinA * blowAcc + .5 - Mrnd();
			}
		}
		
		if( d < toDist )
		{
			var toAcc = ( 1 - ( d / toDist ) ) * canvasW * .0014;
			vX -= cosA * toAcc;
			vY -= sinA * toAcc;
		}
		
		if( d < stirDist )
		{
			var mAcc = ( 1 - ( d / stirDist ) ) * canvasW * .00022;
			vX += mouseVX * mAcc;
			vY += mouseVY * mAcc;			
		}
		
		
		vX *= friction;
		vY *= friction;
		
		var avgVX = Mabs( vX );
		var avgVY = Mabs( vY );
		var avgV = ( avgVX + avgVY ) * .5;
		
		if( avgVX < .1 ) vX *= Mrnd() * 3;
		if( avgVY < .1 ) vY *= Mrnd() * 3;
		
		var sc = avgV * .45;
		sc = Mmax( Mmin( sc , 3.5 ) , .4 );
		
		
		var nextX = x + vX;
		var nextY = y + vY;
		
		if( nextX > canvasW )
		{
			nextX = canvasW;
			vX *= -1;
		}
		else if( nextX < 0 )
		{
			nextX = 0;
			vX *= -1;
		}
		
		if( nextY > canvasH )
		{
			nextY = canvasH;
			vY *= -1;
		}
		else if( nextY < 0 )
		{
			nextY = 0;
			vY *= -1;
		}
		
		
		m.vX = vX;
		m.vY = vY;
		m.x  = nextX;
		m.y  = nextY;
		
		ctx.fillStyle = m.color;
		ctx.beginPath();
		ctx.arc( nextX , nextY , sc , 0 , radCirc , true );
		ctx.closePath();
		ctx.fill();		
	}
	
	//rect( ctx , mouseX - 3 , mouseY - 3 , 6 , 6 );
}


function onDocMouseMove( e )
{
	var ev = e ? e : window.event;
	mouseX = ev.clientX - outerDiv.offsetLeft - canvasDiv.offsetLeft;
	mouseY = ev.clientY - outerDiv.offsetTop  - canvasDiv.offsetTop;
}

function onDocMouseDown( e )
{
	isMouseDown = true;
	return false;
}

function onDocMouseUp( e )
{
	isMouseDown = true;
	return false;
}



// ==========================================================================================


function Mover()
{
	this.color = "rgb(" + Math.floor( Math.random()*255 ) + "," + Math.floor( Math.random()*255 ) + "," + Math.floor( Math.random()*255 ) + ")";
	this.y     = 0;
	this.x     = 0;
	this.vX    = 0;
	this.vY    = 0;
	this.size  = 0; 
}


// ==========================================================================================


function rect( context , x , y , w , h ) 
{
	context.beginPath();
	context.rect( x , y , w , h );
	context.closePath();
	context.fill();
}


// ==========================================================================================

Javascript Solutions


Solution 1 - Javascript

The javascript has

var canvasW     = 640;
var canvasH     = 480;

in it. Try changing those as well as the css for the canvas.

Or better yet, have the initialize function determine the size of the canvas from the css!

in response to your edits, change your init function:

function init()
{
    canvas = document.getElementById("mainCanvas");
    canvas.width = document.body.clientWidth; //document.width is obsolete
    canvas.height = document.body.clientHeight; //document.height is obsolete
    canvasW = canvas.width;
    canvasH = canvas.height;

    if( canvas.getContext )
    {
    	setup();
    	setInterval( run , 33 );
    }
}

Also remove all the css from the wrappers, that just junks stuff up. You have to edit the js to get rid of them completely though... I was able to get it full screen though.

html, body {
    overflow: hidden;
}

Edit: document.width and document.height are obsolete. Replace with document.body.clientWidth and document.body.clientHeight

Solution 2 - Javascript

You can just insert the following in to your main html page, or a function:

canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

Then to remove the margins on the page

html, body {
    margin: 0 !important;
    padding: 0 !important;
}

That should do the job

Solution 3 - Javascript

The newest Chrome and Firefox support a fullscreen API, but setting to fullscreen is like a window resize. Listen to the onresize-Event of the window-object:

$(window).bind("resize", function(){
    var w = $(window).width();
    var h = $(window).height();

    $("#mycanvas").css("width", w + "px");
    $("#mycanvas").css("height", h + "px");	
});

//using HTML5 for fullscreen (only newest Chrome + FF)
$("#mycanvas")[0].webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); //Chrome
$("#mycanvas")[0].mozRequestFullScreen(); //Firefox

//...

//now i want to cancel fullscreen
document.webkitCancelFullScreen(); //Chrome
document.mozCancelFullScreen(); //Firefox

This doesn't work in every browser. You should check if the functions exist or it will throw an js-error.

for more info on html5-fullscreen check this: http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API

Solution 4 - Javascript

All you need to do is set the width and height attributes to be the size of the canvas, dynamically. So you use CSS to make it stretch over the entire browser window, then you have a little function in javascript which measures the width and height, and assigns them. I'm not terribly familliar with jQuery, so consider this psuedocode:

window.onload = window.onresize = function() {
  theCanvas.width = theCanvas.offsetWidth;
  theCanvas.height = theCanvas.offsetHeight;
}

The width and height attributes of the element determine how many pixels it uses in it's internal rendering buffer. Changing those to new numbers causes the canvas to reinitialise with a differently sized, blank buffer. Browser will only stretch the graphics if the width and height attributes disagree with the actual real world pixel width and height.

Solution 5 - Javascript

Because it was not posted yet and is a simple css fix:

#canvas {
    position:fixed;
    left:0;
    top:0;
    width:100%;
    height:100%;
}

Works great if you want to apply a fullscreen canvas background (for example with Granim.js).

Solution 6 - Javascript

On document load set the

canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

Solution 7 - Javascript

A - How To Calculate Full Screen Width & Height

Here is the functions;

canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;

Check this out

B - How To Make Full Screen Stable With Resize

Here is the resize method for the resize event;

function resizeCanvas() {
	canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
	canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
	
	WIDTH = canvas.width;
	HEIGHT = canvas.height;
	
	clearScreen();
}

C - How To Get Rid Of Scroll Bars

Simply;

<style>
	html, body {
		overflow: hidden;
	}
</style>

D - Demo Code

<html>
	<head>
		<title>Full Screen Canvas Example</title>
		<style>
			html, body {
				overflow: hidden;
			}
		</style>
	</head>
	<body onresize="resizeCanvas()">
		<canvas id="mainCanvas">
		</canvas>
		<script>
			(function () {
				canvas = document.getElementById('mainCanvas');
				ctx = canvas.getContext("2d");
				
				canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
				canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
				WIDTH	= canvas.width;
				HEIGHT	= canvas.height;
				
				clearScreen();
			})();
			
			function resizeCanvas() {
				canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
				canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
				
				WIDTH = canvas.width;
				HEIGHT = canvas.height;
				
				clearScreen();
			}
			
			function clearScreen() {
				var grd = ctx.createLinearGradient(0,0,0,180);
				grd.addColorStop(0,"#6666ff");
				grd.addColorStop(1,"#aaaacc");

				ctx.fillStyle = grd;
				ctx.fillRect(  0, 0, WIDTH, HEIGHT );
			}
		</script>
	</body>
</html>

Solution 8 - Javascript

I hope it will be useful.

// Get the canvas element
var canvas = document.getElementById('canvas');

var isInFullScreen = (document.fullscreenElement && document.fullscreenElement !== null) ||
    (document.webkitFullscreenElement && document.webkitFullscreenElement !== null) ||
    (document.mozFullScreenElement && document.mozFullScreenElement !== null) ||
    (document.msFullscreenElement && document.msFullscreenElement !== null);

// Enter fullscreen
function fullscreen(){
	if(canvas.RequestFullScreen){
		canvas.RequestFullScreen();
	}else if(canvas.webkitRequestFullScreen){
		canvas.webkitRequestFullScreen();
	}else if(canvas.mozRequestFullScreen){
		canvas.mozRequestFullScreen();
	}else if(canvas.msRequestFullscreen){
		canvas.msRequestFullscreen();
	}else{
		alert("This browser doesn't supporter fullscreen");
	}
}

// Exit fullscreen
function exitfullscreen(){
	if (document.exitFullscreen) {
		document.exitFullscreen();
	} else if (document.webkitExitFullscreen) {
		document.webkitExitFullscreen();
	} else if (document.mozCancelFullScreen) {
		document.mozCancelFullScreen();
	} else if (document.msExitFullscreen) {
		document.msExitFullscreen();
	}else{
		alert("Exit fullscreen doesn't work");
	}
}

Solution 9 - Javascript

If you want to show it in a presentation then consider using requestFullscreen() method

let canvas = document.getElementById("canvas_id");
canvas.requestFullscreen();

that should make it fullscreen whatever the current circumstances are.

also check the support table https://caniuse.com/?search=requestFullscreen

Solution 10 - Javascript

function resize() {
	canvas.width = window.innerWidth;
	canvas.height = window.innerHeight;
	render();
}
window.addEventListener('resize', resize, false); resize();
function render() { // draw to screen here
}

https://jsfiddle.net/jy8k6hfd/2/

Solution 11 - Javascript

it's simple, set canvas width and height to screen.width and screen.height. then press F11! think F11 should make full screen in most browsers does in FFox and IE.

Solution 12 - Javascript

AFAIK, HTML5 does not provide an API which supports full screen.

This question has some view points on making html5 video full screen for example using webkitEnterFullscreen in webkit.
Is there a way to make html5 video fullscreen

Solution 13 - Javascript

You could just capture window resize events and set the size of your canvas to be the browser's viewport.

Solution 14 - Javascript

Get the full width and height of the screen and create a new window set to the appropriate width and height, and with everything disabled. Create a canvas inside of that new window, setting the width and height of the canvas to the width - 10px and the height - 20px (to allow for the bar and the edges of the window). Then work your magic on that canvas.

Solution 15 - Javascript

Well, I was looking to make my canvas fullscreen too, This is how i did it. I'll post the entire index.html since I am not a CSS expert yet : (basically just using position:fixed and width and height as 100% and top and left as 0% and i nested this CSS code for every tag. I also have min-height and min-width as 100%. When I tried it with a 1px border the border size was changing as I zoomed in and out but the canvas remained fullscreen.)

<!DOCTYPE html>
<html style="position:fixed;min-height:100%;min-width:100%;height:100%;width:100%;top:0%;left:0%;resize:none;">
<head>
<title>MOUSEOVER</title>
<script "text/javascript" src="main.js"></script>

</head>


<body id="BODY_CONTAINER" style="position:fixed;min-height:100%;min-width:100%;height:100%;width:100%;top:0%;left:0%;resize:none;">



<div id="DIV_GUI_CONTAINER" style="position:fixed;min-height:100%;min-width:100%;height:100%;width:100%;top:0%;left:0%;resize:none;">

<canvas id="myCanvas"  style="position:fixed;min-height:100%;min-width:100%;height:100%;width:100%;top:0%;left:0%;resize:none;">

</canvas>

</div>


</body>


</html>

EDIT: add this to the canvas element:

<canvas id="myCanvas" width="" height="" style="position:fixed;min-height:100%;min-width:100%;height:100%;width:100%;top:0%;left:0%;resize:none;">

</canvas>

add this to the javascript

canvas.width = window.screen.width;

canvas.height = window.screen.height;

I found this made the drawing a lot smoother than my original comment.

Thanks.

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
QuestionCameronView Question on Stackoverflow
Solution 1 - JavascriptNick LarsenView Answer on Stackoverflow
Solution 2 - JavascriptMartynView Answer on Stackoverflow
Solution 3 - JavascriptFredericView Answer on Stackoverflow
Solution 4 - JavascriptBlixxyView Answer on Stackoverflow
Solution 5 - JavascriptchillyistkultView Answer on Stackoverflow
Solution 6 - JavascriptJackView Answer on Stackoverflow
Solution 7 - JavascriptLevent DiviliogluView Answer on Stackoverflow
Solution 8 - Javascriptor linzerView Answer on Stackoverflow
Solution 9 - JavascriptomarView Answer on Stackoverflow
Solution 10 - JavascriptjaggedsoftView Answer on Stackoverflow
Solution 11 - Javascriptuser6063291View Answer on Stackoverflow
Solution 12 - JavascriptzengrView Answer on Stackoverflow
Solution 13 - JavascriptJaime GarciaView Answer on Stackoverflow
Solution 14 - JavascriptSean VieiraView Answer on Stackoverflow
Solution 15 - Javascripts-sView Answer on Stackoverflow