Comment marquer une page avec une canvas
HTML5 telle que la canvas
Prend 80% de la largeur
A une hauteur et une largeur de pixel correspondantes qui définissent effectivement le rapport (et sont maintenues proportionnellement lorsque la toile est étirée à 80%)
Est centré verticalement et horizontalement
Vous pouvez supposer que canvas
est la seule chose de la page, mais n'hésitez pas à l'encapsuler dans div
s si nécessaire.
Cela va centrer la toile horizontalement:
#canvas-container {
width: 100%;
text-align:center;
}
canvas {
display: inline;
}
HTML:
<div id="canvas-container">
<canvas>Your browser doesn't support canvas</canvas>
</div>
En regardant les réponses actuelles, j’ai le sentiment qu’il manque une solution simple et efficace. Juste au cas où quelqu'un passerait à la recherche de la bonne solution ... Je réussis plutôt bien avec du CSS simple et du javascript.
Centre toile au milieu de l'écran ou de l'élément parent. Pas d'emballage.
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;
}
Fonctionne comme un charme - testé: firefox, chrome
Testé uniquement sur 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>
mettez le canevas en balises de paragraphe comme ceci:
<p align="center">
<canvas id="myCanvas" style="background:#220000" width="700" height="500" align="right"></canvas>
</p>
afin de centrer le canevas dans la fenêtre, vous devez ajouter "px" à el.style.top
et el.style.left
el.style.top = (viewportHeight - canvasHeight) / 2 +"px";
el.style.left = (viewportWidth - canvasWidth) / 2 +"px";
Redimensionner la toile à l’aide de CSS n’est pas une bonne idée. Cela devrait être fait en utilisant Javascript. Voir la fonction ci-dessous qui le fait
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";
}
démo ici: http://jsfiddle.net/9Rmwt/11/show/
.
Étant donné que la toile n'est rien sans JavaScript, utilisez l'outil JavaScript pour le dimensionnement et le positionnement (vous savez: onresize
, position:absolute
, etc.)
Envelopper avec div devrait fonctionner. Je l'ai testé dans Firefox, Chrome sur Fedora 13 ( demo ).
#content {
width: 95%;
height: 95%;
margin: auto;
}
#myCanvas {
width: 100%;
height: 100%;
border: 1px solid black;
}
Et la toile doit être incluse dans la balise
<div id="content">
<canvas id="myCanvas">Your browser doesn't support canvas tag</canvas>
</div>
Laissez-moi savoir si cela fonctionne. À votre santé.
En ce qui concerne la suggestion CSS:
#myCanvas {
width: 100%;
height: 100%;
}
En standard, CSS ne redimensionne pas le système de coordonnées de la toile, il redimensionne le contenu. Dans Chrome, le CSS mentionné adaptera la trame à la hausse ou à la baisse pour s’adapter à la présentation du navigateur. Dans le cas typique où le système de coordonnées est plus petit que les dimensions du navigateur en pixels, cela réduit efficacement la résolution de votre dessin. Il en résulte très probablement un tirage non proportionnel.
Mêmes codes de Nickolay ci-dessus, mais testés sur IE9 et Chrome (et suppression du rendu supplémentaire):
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>
Le décalage en haut et à gauche ne fonctionne que lorsque j'ajoute px
.
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>