Dans ce chapitre je vais vous montrer comment définir un ou plusieurs éléments canvas dans une page web et comment
dessiner dans ces différents canevas.
La balise Canvas crée une zone de dessin (un "canevas" ou "toile") avec un système de coordonnées cartésiennes.
Cliquez dans la 'toile' ci-dessus pour qu'elle se remplisse.
Canvas est un élément HTML donc on peut lui appliquer des propriétés CSS telles que background, border-radius, box-shadow
pour le styliser.
Le code à l'intérieur du conteneur SCRIPT comprend quatre parties : une pour chaque canevas.
Des carrés remplis de rouge à demi opaque.
Si ce script est interne à la page il doit être bien sûr, contenu dans la balise SCRIPT !
L'API Canvas n'autorise que le dessin 2D d'où la méthode getContext('2d') qui retourne un objet graphique de type 2d.
On définit ensuite la couleur de remplissage avec la propriété fillStyle.
Notez que la couleur est exprimée ici avec la notation RGBA (voir tutoriel CSS3) c'est à dire avec quatre paramètres.
Le dernier paramètre correspond au degré de transparence.
J'appelle deux fois la méthode rect(x ,y ,largeur ,hauteur) puis fill() pour dessiner et remplir un rectangle.
Neuf carrés avec un large contour rouge quasi transparent.
Notez la boucle répétée 9 fois.
Dans ce deuxième canevas on veut colorier uniquement le contour ("stroke") des formes.
Puis une boucle est exécutée 9 fois. Lors de chaque passage dans la boucle il y a un changement
d'origine avec la méthode translate(offset x, offset y) ; ensuite on dessine et bordure le rectangle
avec les méthodes rect() & stroke(). J'aurais pu simplifier en utilisant une seule méthode : strokeRect().
J'utilise des variables globales. Ce qui m'oblige à utiliser des noms différents pour distinguer les deux toiles et les deux
contextes : canevas1, contexte1, canevas2, contexte2.
Un rectangle aux coins arrondis et un rond.
Lisez très attentivement ce script car il y a beaucoup de nouveautés.
Cette fois je crée une fonction nommée "remplir()" dans laquelle j'initialise quatre variable
canevas, contexte, X, Y . Donc ces variables sont locales.
Les paramètres des méthodes peuvent être des constantes entières ou des variables.
Je vous conseille fortement de créer une fonction par canevas. Ainsi vous pourrez utiliser dans chacune
les mêmes termes pour désigner la zone de dessin, contexte, les dimensions du canevas et ce sans risque d'ambiguïté
puisque ces variables seront locales.
Je dessine un rectangle aux coins arrondis et un rond avec la méthode roundRect(x,y,w,h,[radius]).
Certaines infos s'affichent dans la console du navigateur : console.log()
Une 'toile' d'abord vide puis deux rectangles avec des coins plus ou moins arrondis.
Pour appeler cette fonction anonyme (donc remplir le canevas) il faut cliquer dans le canevas.
Attention à la casse dans l'écriture des propriétés et méthodes. Respectez la règle JavaScript concernant la casse :
la première lettre de chaque mot en majuscule mais seulement à partir du deuxième mot ; c'est la notation camelCase.
Pour exprimer les couleurs on peut utiliser un nom (anglais bien sûr) ou un code hexadécimal ou le code RGB ou mieux encore
encore RGBA (pour gérer en même temps la transparence) et donc vous dispenser d'utliser globalAlpha.
Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Canvas : dessiner des rectangles
Créer une ou plusieurs "toiles" dans la page web c'est le travail de HTML5.
Dessiner dans les différents canevas c'est la mission de JavaScript incluant des propriétés et méthodes de la librairie Canvas.
Se repérer dans un canevas ?
Attention l'origine du système est le coin supérieur gauche !
Une balise canvas doit donc comporter les attributs width & height pour définir ce repère cartésien ; si vous oubliez
ces attributs le repère cartésien fera alors 300px par 150px
Pour dessiner un rectangle dans une 'toile' il faut paramétrer une méthode de l'API avec 4 arguments :
Les quatre canevas ("toiles") de cette page
Premier canevas
Deuxième canevas
Troisième canevas
Quatrième canevas
Le code correspondant
Notez que chaque élément canvas a l'attribut id ; c'est très important pour associer une routine JS à chaque élément.
Le code JavaScript de la page
Code JS pour remplir le premier canevas
var canevas1 = document.querySelector('#canevas1');
var contexte1 = canevas1.getContext('2d');
contexte1.fillStyle = "rgba(255,0,0,0.5)" ; // rouge à demi opaque
contexte1.rect(20,20,100,100);
contexte1.fill();
contexte1.rect(40,40,100,100);
contexte1.fill();
contexte1.fillRect(80,80,100,100);
contexte1.fillRect(100,100,100,100);
contexte1.fillRect(120,120,100,100);
contexte1.fillRect(140,140,100,100);
contexte1.fillRect(160,160,100,100);
contexte1.fillRect(180,180,100,100);
Avant de commencer à dessiner il faut :
Pour les sept autres carrés je remplace les méthodes rect() & fill() par un raccourci : la méthode fillRect().
Ici neuf carrés qui ont tous les mêmes dimensions (100 par 100) mais le coin haut gauche du carré toujours plus éloigné de l'origine.
Il y a donc empilement et décalage des différentes formes.
Code JS pour remplir le deuxième canevas
...
var canevas2 = document.querySelector('#canevas2');
var contexte2 = canevas2.getContext('2d');
contexte2.strokeStyle = "red" ;
contexte2.globalAlpha = 0.2 ;
contexte2.lineWidth = '5';
for (i=1; i<=9; i++)
{
contexte2.translate(20,20) ;
// déplacement origine pour rectangle suivant
contexte2.strokeRect(0,0,100,100) ;
} // fin for
À chaque passage dans la boucle, il y a une translation du point d'origine du repère cartésien.
Vous voyez qu'il faut de bonnes notions de JavaScript pour aborder sereinement l'API Canvas.
Les carrés sont bordurés avec un rouge quasi transparent. Je n'ai pas utilisé la notation RGBA de la couleur mais je combine
la couleur rouge avec une transparence de 0.2 (contexte2.globalAlpha =0.2)
Remarque concernant le code JS ci-dessus
Cette façon de programmer est volontairement très maladroite ; je vous montre ce qu'il ne faut éviter.
Code JS pour remplir le troisième canevas
function remplir()
{
var canevas = document.getElementById('canevas3');
var contexte = canevas.getContext('2d');
var X = canevas.width; // retourne 400
var Y = canevas.height; // retourne 400
console.log(X + " " + typeof(X));
console.log(Y + " " + typeof(X));
contexte.fillStyle ="olive";
contexte.roundRect(10,10,X/2,X/3,[20]);
contexte.fill();
contexte.roundRect(X/2,Y/2,100,100,[50]);
contexte.fill();
}
remplir() ; //appel automatique de la fonction
Étudions certaines instructions :
Dans le script certains arguments sont exprimés par rapport à X ou Y.
Par ailleurs vous pourrez contrôler l'appel de ladite fonction comme je le montre dans le quatrième canevas.
La méthode roundRect()
Si le rectangle est carré et si le radius est égal à la moitié du côté, cette méthode affiche alors un rond.
Affichez la console du navigateur
Affichez la console du navigateur pour lire ces infos fort utiles.
Le code JS pour remplir le quatrième canevas
// appel de la fonction anonyme sur clic dans le canevas
document.getElementById('canevas4').onclick = function()
{
var canevas = document.getElementById('canevas4');
var ctx = canevas.getContext('2d');
var X = canevas.width;
var Y = canevas.height;
ctx.strokeStyle = "magenta";
ctx.strokeWidth =2;
ctx.roundRect(100,100, X/2, Y/4, [10, 20,30,40]);
ctx.stroke();
ctx.roundRect(200,200,X/2,Y/4, [40, 30,20,10]);
ctx.stroke();
}
L'objet de type contexte se nomme ici "ctx" (usage très répandu).
Je vous montre que le cinquième argument de la méthode roundRect() peut être une suite de 4 entiers pour définir
quatre coins différents.
À propos de la syntaxe Canvas
Méthodes et propriétés de l'objet de type contexte
Les propriétés n'ont pas de parenthèses alors que les méthodes (qui sont des fonctions !) ont une paire de parenthèses :
Les arguments passés dans les méthodes de la librairie Canvas peuvent être des expressions (par exemple : X/2, X/4, X*3/4, ...)
La notation des couleurs