skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

jeudi 5 janvier 2012

Canvas 2D HTML5 en 10 étapes faciles

Publié par Infinite Loop, à 18 h 38 3 commentaires

Dans ce billet, je vous présenterai les notions élémentaires nécessaires pour débuter avec le canvas HTML5. À la fin de ce tutoriel, vous devriez être en mesure de réaliser des oeuvres graphiques complètement inutiles (la seule limite est votre imagination). Si ce n'est pas le cas, vous trouverez un exemple de mon cru à la fin accompagné de son code source.

Vous aurez besoin :

  • un fureteur qui supporte le HTML5 (si vous insistez pour utiliser une version antérieure à Internet Explorer 9, je vous monterai plus loin comment le rendre compatible)
  • du JavaScript
  • jQuery (optionnel mais comme j'en utilise dans mes exemples...)

1. Créez un document HTML5 puis incluez-y une balise canvas

<canvas id="myCanvas" width="800" height="600">
Le canvas HTML5 ne fonctionne pas avec ton browser déficient :-(
</canvas>
2. Référence au contexte

Comme on dessinera en deux dimensions, on invoquera le contexte 2D du canvas (tout en s'assurant que le fureteur le supporte).
var canvas = $('#myCanvas');

if(canvas && canvas.get(0).getContext){
var context = canvas.get(0).getContext('2d');

// ...
)
3. Tracer une ligne

On commence par une ligne droite horizontale en déterminant les points de départ et d'arrivée. On ajustera les coordonnées x et y du point d'arrivée si on veut obtenir une ligne verticale ou diagonale (le point 0, 0 représente le coin supérieur gauche de la zone du canvas).
context.beginPath();
context.moveTo(50, 25); // x, y
context.lineTo(250, 25); // x, y
context.closePath()
context.stroke();
4. Dessiner un carré

On utilisera fillRect, parce qu'après tout, un carré est un rectangle avec des côtés égaux.
context.fillRect(50, 75, 50, 50); // x, y, width, height
5. Dessiner un rectangle
context.fillRect(50, 175, 100, 50); // x, y, width, height
6. Définir seulement le contour

Attention, le contour est extérieur à la forme donc le rectangle semble légèrement plus grand.
context.strokeRect(200, 175, 100, 50);
7. Dessiner un cercle parfaitement rond

Ce qui peut être mêlant ici, c'est que la coordonnée x, y représente le centre du cercle. Il faut l'aligner en conséquence.
context.beginPath();
// centre(x, y), rayon, angle de départ, angle final, anticlockwise context.arc(100, 325, 50, 0, Math.PI*2, false);
context.closePath()
context.fill();
8. Changer de couleur

Vous n'aimez pas la couleur noire par défaut ? Modifiez la propriété du contexte avant de dessiner. La couleur sera retenue pour tous les futurs traits.
context.fillStyle = '#0000FF';
context.fillRect(50, 400, 100, 50); // x, y, width, height
9. Ajouter du texte

Parce qu'on est fier, on signe son oeuvre.
context.font = "18px Arial";
context.fillStyle = '#7E2217';
context.fillText("http://code18.blogspot.com", 200, 450);
Tadaaaaam ! Voici le résulat :


Euh, j'avais pas dit 10 étapes faciles ? Voici donc la dixième.

10. Donner un sursis au condamné

En cas d'incompatibilité avec une version d'Internet Explorer périmée, on peut inclure en entête le script magique ExplorerCanvas de Google Code et souhaiter que tout se passe pour le mieux (les deux exemples de ce billet sont supportés à 100%).
<!--[if IE]><script src="ExplorerCanvas/excanvas.js"></script><![endif]-->
Allez, on peut faire mieux. Comme par exemple reproduire les barres de calibrage d'un écran de télévision (couleurs obtenues à partir de cette image).
// merci de ne pas me faire remarquer que
// je n'ai pas pris soin d'optimiser le code :-)

$(document).ready(
function(){
var canvas = $('#myCanvas');

if(canvas && canvas.get(0).getContext){

var context = canvas.get(0).getContext('2d');

var top = ['F4F4F6', 'FFF461', '7EF3F6', '00FD41', 'FF74FF', 'FF204E', '5260FD'];
var middle = ['8696FF', '3C281D', 'FF8CFF', '161616', '77F0F5', '131011', 'EDECF1'];
var bottom = ['5F8CDD', 'FDFDFD', '7237D5', '101214', '0D0E11'];

var screenWidth = 800;
var screenHeight = 600;

var h = 0;
var colWidth = 0;
var colWidthTop = parseInt(screenWidth/top.length);
var colWidthMiddle = parseInt(screenWidth/middle.length);
var colWidthBottom = parseInt(screenWidth/bottom.length);

offset = 0;
colWidth = colWidthTop;
$(top).each(
function(){
context.fillStyle = '#' + this;
context.fillRect(offset, 0, colWidth, screenHeight); // x, y, width, height
offset += colWidth;
}
);

offset = 0;
colWidth = colWidthMiddle;
h = screenHeight*0.25;
$(middle).each(
function(){
context.fillStyle = '#' + this;
context.fillRect(offset, screenHeight - h, colWidth, screenHeight - h); // x, y, width, height
offset += colWidth;
}
);

offset = 0;
colWidth = colWidthBottom;
h = screenHeight*0.20;
$(bottom).each(
function(){
context.fillStyle = '#' + this;
context.fillRect(offset, screenHeight - h, colWidth, screenHeight - h); // x, y, width, height
offset += colWidth;
}
);
}
}
);
Wow, c'est dont ben beau! Je pense que je devrais en faire un agrandissement pour l'encadrer dans mon salon.



Je vous l'avais dit, ça ne sert pas à grand chose mais c'est joli.


Tags: HTML, JavaScript

3 réponses à "Canvas 2D HTML5 en 10 étapes faciles"

  1. Pascal P. a dit...
    6 janvier 2012 à 08 h 23

    La prochaine étape est de faire l'animation de la "neige" télévisée avec Canvas!

    Anonyme a dit...
    6 janvier 2012 à 08 h 50

    Pourquoi intégrer tout le framework jQuery pour sélectionner un élément via son id et utiliser du js pur par la suite ?

    document.getElementById('myCanvas') suffirait ;)

    Ah si, il y a aussi un $().each() qui pourrait être remplace par un for(x in y)...

    Je suis fan de jQuery mais pour 2 malheureuses fonctions, l'insérer en entier me semble un peu... abusif, non ?

    Infinite Loop a dit...
    6 janvier 2012 à 08 h 57

    Intégrer jQuery n'est jamais abusif quand on regarde plus loin qu'un simple exemple :-)


Publier un commentaire

Message plus récent Messages plus anciens Accueil
S'abonner à : Publier des commentaires (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (167)
    • Club Vidéo (24)
    • Coffre à outils (56)
    • CSS (8)
    • Curiosités (117)
    • Design Pattern (2)
    • Drupal (8)
    • Easter Eggs (22)
    • Extensions Firefox (20)
    • GIMP (7)
    • Histoire (21)
    • HTML (32)
    • Humour (57)
    • Intégration (34)
    • iPod (12)
    • JavaScript (110)
    • Jeu de combat (6)
    • Le coin du geek (128)
    • Liens (12)
    • Linux (56)
    • Livres (78)
    • Lois et principes (46)
    • Marché des saveurs (26)
    • Mathématique (18)
    • Mobile (5)
    • Montréal (32)
    • Musique (112)
    • Pancartes et écriteaux (16)
    • Perl (8)
    • Pérou (1)
    • PHP (130)
    • PostgreSQL (44)
    • Programmation (105)
    • Saviez-vous que (55)
    • Sécurité (22)
    • SEO (5)
    • SQL Server (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Voyages (1)
    • Zend Framework (26)

    Divers

    Archives

    • ►  2015 (6)
      • ►  août 2015 (1)
      • ►  juillet 2015 (1)
      • ►  février 2015 (3)
      • ►  janvier 2015 (1)
    • ►  2014 (8)
      • ►  décembre 2014 (1)
      • ►  novembre 2014 (1)
      • ►  octobre 2014 (1)
      • ►  août 2014 (2)
      • ►  juillet 2014 (2)
      • ►  janvier 2014 (1)
    • ►  2013 (53)
      • ►  décembre 2013 (2)
      • ►  novembre 2013 (1)
      • ►  octobre 2013 (3)
      • ►  septembre 2013 (2)
      • ►  août 2013 (5)
      • ►  juillet 2013 (3)
      • ►  juin 2013 (5)
      • ►  mai 2013 (3)
      • ►  avril 2013 (7)
      • ►  mars 2013 (7)
      • ►  février 2013 (11)
      • ►  janvier 2013 (4)
    • ▼  2012 (105)
      • ►  décembre 2012 (8)
      • ►  novembre 2012 (5)
      • ►  octobre 2012 (4)
      • ►  septembre 2012 (1)
      • ►  août 2012 (8)
      • ►  juillet 2012 (7)
      • ►  juin 2012 (7)
      • ►  mai 2012 (10)
      • ►  avril 2012 (13)
      • ►  mars 2012 (15)
      • ►  février 2012 (15)
      • ▼  janvier 2012 (12)
        • Dans quel pays se cache André ?
        • Emblème de Montréal en canvas HTML5
        • Dessiner un coeur avec le canvas HTML5 et passer p...
        • Citation no. 144 sur les hommes politiques
        • Dessiner une spirale dans un canvas HTML5
        • Ahuntsic, d'hier à aujourd'hui
        • C'est urgent parce que ça ne l'est pas
        • Que contient le CV de Dieu ?
        • Logo de Radio-Canada en canvas HTML5
        • Canvas 2D HTML5 en 10 étapes faciles
        • Coup de coeur musical
        • Citation no. 143 sur le chien et le chat
    • ►  2011 (146)
      • ►  décembre 2011 (14)
      • ►  novembre 2011 (11)
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (430)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (39)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Abonnés

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft