# Créer des zones de dessin pour JavaScript avec le tag HTML canvas

Avec la balise (*tag*) HTML `<canvas>`, vous créez une zone rectangulaire pouvant être remplie de graphiques ou d’animations via JavaScript. Pour cela, un contexte 2D est créé. Vous définissez ensuite le contenu souhaité à l’aide de différentes méthodes pour l’API de la balise `<canvas>`.

## HTML canvas : qu’est-ce que c’est ?

HTML `<canvas>` est un élément qui met à disposition une zone de dessin dans laquelle vous pouvez **créer des graphiques ou des animations** avec JavaScript. La taille de cette zone est définie par des attributs de hauteur et de largeur. Elle peut être intégrée n’importe où sur un document [HTML](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/quest-ce-que-le-html/) à l’aide du [tag HTML](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/balises-htlm/).

Le contenu de cette « toile » (traduction française de *canvas*) ne fait pas partie à proprement parler de la structure d’une page Web, ce qui empêche l’application de styles [CSS](https://www.ionos.fr/digitalguide/sites-internet/web-design/apprendre-le-css-avec-simplicite/) ou l’intégration d’autres éléments HTML. Si le tag HTML `<canvas>` n’est pas supporté par un navigateur, le contenu de repli (*fallback*) est affiché à la place. Les navigateurs modernes supportent toutefois cet élément par défaut.

## Tag HTML `<canvas>` : la syntaxe

L’élément HTML `<canvas>` ne fournit pas d’outils de conception en lui-même, mais crée le cadre dans lequel vous pouvez dessiner des graphiques avec JavaScript. La syntaxe de base de l’élément est la suivante :

```html
<canvas id="ExempleCanvas" width="[valeur en pixels]" height="[valeur en pixels]"></canvas>
```

Vous nommez l’élément avec l’attribut `id` et lui attribuez les dimensions souhaitées avec `width` (largeur) et `height` (hauteur). En option, vous pouvez utiliser d’autres paramètres pour préciser la conception du graphique.

## Le fonctionnement de `<canvas>` expliqué par un exemple simple

En utilisant la syntaxe ci-dessus, vous pouvez facilement créer une zone de dessin à tout moment. Dans notre exemple, cette zone aura une largeur de 500 pixels et une hauteur de 250 pixels. Voici le code correspondant :

```html

<html>
<body>
<h1>Exemple de canvas HTML</h1>
<canvas id="ExempleCanvas" width="500" height="250" style="border: 1px solid grey"></canvas>
<div class="hash d-none" hidden>hash_d0f8cce0f426d56b81c76cd832ca1098bea9e321</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```

Cependant, cette méthode ne vous donnera rien de plus qu’une simple surface vierge. Seul JavaScript vous permet de remplir l’élément `<canvas>` généré avec **des formes, des images, des textes ou des dégradés**, et d’animer ces objets si nécessaire. Le contenu est déposé sous forme de pixels dans un bitmap, qui peut ensuite être converti en un fichier graphique *PNG*.

Pour utiliser cet élément, vous devez recourir à la méthode `getElementById()`. Cela ne fonctionne que si vous avez attribué un ID unique à la surface &lt;canvas&gt;. Si vous souhaitez peindre, dessiner ou interagir d’une autre manière dans la zone définie, vous devez créer un **contexte 2D**. Cela fonctionne dans notre exemple avec le code suivant :

```html
const ExempleCanvas = document.getElementById("ExempleCanvas");
const ctx = ExempleCanvas.getContext("2d");
```

Maintenant, tous les préparatifs sont faits pour utiliser HTML `<canvas>` ! Avec la fonction `fillRect()`, nous souhaitons dessiner un simple rectangle dans la zone définie. Celui-ci doit être de couleur bleu pétrole (*teal* en anglais) et mesurer 200 pixels de large et 150 pixels de haut. Nous le plaçons à 10 pixels du bord gauche et à 50 pixels du bord supérieur. L’ensemble du code se présente comme suit :

```html

<html>
<body>
<h1>Exemple de canvas HTML</h1>
<canvas id="ExempleCanvas" width="500" height="250" style="border: 1px solid grey;"></canvas>
<script>
const ExempleCanvas = document.getElementById("ExempleCanvas");
const ctx = ExempleCanvas.getContext("2d");
ctx.fillStyle = "teal";
ctx.fillRect(10, 50, 200, 150);
</script>
<div class="hash d-none" hidden>hash_d0f8cce0f426d56b81c76cd832ca1098bea9e321</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```

## À quoi sert la balise HTML `<canvas>` ?

Alors que dans notre exemple précédent, nous avons simplement tracé un rectangle, l’élément `<canvas>` permet également de réaliser des formes beaucoup plus complexes. Il est possible de créer et intégrer des **arcs de cercle, des zones de texte, des transparences, des dégradés de couleurs et des graphiques** aux formats *GIF*, *JPEG* et *PNG*. Vous pouvez les recadrer, les redimensionner et les positionner à votre guise. De plus, la fonction temporelle de JavaScript permet de créer des animations à l’intérieur d’un tag HTML &lt;canvas&gt;.

## Quelles sont les dimensions autorisées pour un élément `<canvas>` ?

Les dimensions maximales d’un élément HTML &lt;canvas&gt; varient selon le navigateur et l’environnement. Par exemple, sur iOS, la limite est généralement de 4096 x 4096 pixels, tandis que d’autres systèmes peuvent autoriser des dimensions supérieures à 10 000 x 10 000 pixels. Toutefois, la surface &lt;canvas&gt; n’est pas automatiquement réactive en fonction du rapport hauteur/largeur. Vous devez gérer les dimensions et l’échelle via CSS ou JavaScript pour garantir une bonne adaptation aux différents appareils. En développement Web, c’est ce qu’on appelle le *responsive design*.

## Aperçu des méthodes pour l’API de HTML `<canvas>`

Nous avons déjà abordé la création d’un contexte 2D. Avec un tel contexte obtenu via `getContext("2d")`, vous pouvez dessiner sur la surface `<canvas>` à tout moment. Voici un résumé des méthodes les plus importantes de l’API.

### Texte

<table>
  <thead>
    <tr>
      <th>Méthode</th>
      <th>Description</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`font`</td>
      <td>Définit la police de caractères</td>
      <td></td>
    </tr>
    <tr>
      <td>`fillText()`</td>
      <td>Insère un texte entier dans la zone</td>
      <td></td>
    </tr>
    <tr>
      <td>`strokeText()`</td>
      <td>Dessine le contour d’un texte, sans remplir l’intérieur</td>
      <td></td>
    </tr>
  </tbody>
</table>

### Image

<table>
  <thead>
    <tr>
      <th>Méthode</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`drawImage()`</td>
      <td>Dépose une image ou une vidéo dans l’élément HTML `<canvas>`</td>
    </tr>
  </tbody>
</table>

### Dessin

<table>
  <thead>
    <tr>
      <th>Méthode</th>
      <th>Description</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`fillRect()`</td>
      <td>Dessine un rectangle plein</td>
      <td></td>
    </tr>
    <tr>
      <td>`strokeRect()`</td>
      <td>Dessine un rectangle vide</td>
      <td></td>
    </tr>
    <tr>
      <td>`clearRect()`</td>
      <td>Efface les pixels à l’intérieur d’un rectangle</td>
      <td></td>
    </tr>
  </tbody>
</table>

### Chemins

<table>
  <thead>
    <tr>
      <th>Méthode</th>
      <th>Description</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`beginPath()`</td>
      <td>Commence un nouveau chemin</td>
      <td></td>
    </tr>
    <tr>
      <td>`lineTo()`</td>
      <td>Trace une ligne jusqu’au chemin</td>
      <td></td>
    </tr>
    <tr>
      <td>`moveTo()`</td>
      <td>Déplace le chemin vers un point précis</td>
      <td></td>
    </tr>
  </tbody>
</table>

### Création

<table>
  <thead>
    <tr>
      <th>Méthode</th>
      <th>Description</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`addColorStop()`</td>
      <td>Définit les couleurs et les positions pour un dégradé</td>
      <td></td>
    </tr>
    <tr>
      <td>`createLinearGradient()`</td>
      <td>Crée un dégradé linéaire</td>
      <td></td>
    </tr>
    <tr>
      <td>`createPattern()`</td>
      <td>Crée un motif à partir d’une image ou d’un autre élément</td>
      <td></td>
    </tr>
    <tr>
      <td>`shadowBlur`</td>
      <td>Définit le flou pour une ombre</td>
      <td></td>
    </tr>
    <tr>
      <td>`shadowColor`</td>
      <td>Détermine la couleur d’une ombre</td>
      <td></td>
    </tr>
  </tbody>
</table>

### Autres fonctions

<table>
  <thead>
    <tr>
      <th>Méthode</th>
      <th>Description</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`restore()`</td>
      <td>Restaure un état antérieur</td>
      <td></td>
    </tr>
    <tr>
      <td>`save()`</td>
      <td>Sauvegarde l’état actuel et ses attributs</td>
      <td></td>
    </tr>
  </tbody>
</table>

## HTML `<canvas>` : exemple avec texte et dégradé de couleurs

Nous allons utiliser quelques-unes des méthodes décrites précédemment pour cet exemple. Pour cela, nous créons d’abord un rectangle de **500 x 250 pixels** via la balise HTML `<canvas>`. Nous établissons ensuite un **contexte 2D**. Enfin, nous y insérons un titre et une autre phrase qui reçoit un dégradé de couleurs. Le code correspondant se présente comme suit :

```html

<html>
<body>
<h1>Exemple de HTML Canvas avec du texte et un dégradé</h1>
<h2>Nous utilisons les méthodes strokeText() et createLinearGradient()</h2>
<canvas id="ExempleCanvas" width="500" height="250" style="border:1px solid grey"></canvas>
<script>
const canvas = document.getElementById("ExempleCanvas");
const ctx = canvas.getContext("2d");
// Dessiner le texte avec le contour
ctx.font = "40px Calibri";
ctx.strokeText("Il y a un titre ici", 20, 50);
// Créer un dégradé
const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
gradient.addColorStop(0, "teal");
gradient.addColorStop(0.5, "blue");
gradient.addColorStop(1, "green");
// Appliquer le dégradé au texte
ctx.font = "30px Calibri";
ctx.strokeStyle = gradient;
ctx.strokeText("Il y a une autre phrase ici", 20, 90);
</script>
<div class="hash d-none" hidden>hash_d0f8cce0f426d56b81c76cd832ca1098bea9e321</div><script data-shy-copy-guard>(function(){var C=[0x00AD,0x200B,0x200C,0x200D,0x2060,0xFEFF];var s=function(t){for(var i=0;i<C.length;i++){t=t.split(String.fromCharCode(C[i])).join("");}return t;};document.addEventListener("copy",function(e){var sel=document.getSelection();if(!sel||sel.isCollapsed||!e.clipboardData){return;}e.clipboardData.setData("text/plain",s(sel.toString()));try{var d=document.createElement("div");d.appendChild(sel.getRangeAt(0).cloneContents());e.clipboardData.setData("text/html",s(d.innerHTML));}catch(x){}e.preventDefault();});})();</script></body>
</html>
```


This is a markdown version of: [https://www.ionos.fr/digitalguide/sites-internet/developpement-web/html-canvas/](https://www.ionos.fr/digitalguide/sites-internet/developpement-web/html-canvas/) for AI/LLM consumption.