# HTML: creare aree di disegno per JavaScript con il tag canvas

L’elemento HTML `<canvas>` ti permette di creare un’area che può essere riempita con grafici o animazioni tramite JavaScript. A questo scopo viene realizzato un oggetto di disegno 2D. Ricorrendo a diversi metodi per l’API del tag `<canvas>` si definisce poi il contenuto desiderato.

## Cos’è il tag `<canvas>` HTML?

`<canvas>` HTML è un elemento che mette a disposizione un’area di disegno in cui puoi **creare grafici o animazioni** con JavaScript. L’area disponibile viene definita indicando l’altezza e la larghezza. Grazie al pratico [tag HTML](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/tag-html/), questa area può essere inserita in qualsiasi parte di un documento [HTML](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/cose-lhtml/).

Il contenuto di questa “tela” (la traduzione in italiano di “canvas”) non è un vero e proprio componente di un sito web, motivo per cui non è possibile usare [CSS](https://www.ionos.it/digitalguide/siti-web/web-design/come-imparare-il-css-una-guida-semplice/) o altri elementi HTML. Se il tag `<canvas>` HTML non è supportato da un browser, il contenuto sarà quindi visualizzato come fallback. I browser moderni prevedono comunque il supporto nativo di questo elemento.

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

Di per sé l’elemento `<canvas>` HTML non mette a disposizione strumenti di disegno, ma crea soltanto la cornice in cui puoi generare elementi grafici con JavaScript. La sintassi di base dell’elemento è la seguente:

```html
<canvas id="CanvasEsempio" width="[valore in pixel]" height="[valore in pixel]"></canvas>
```

Con `id` denomini l’elemento, con `width` e `height` gli assegni le dimensioni desiderate. Opzionalmente puoi usare altri parametri per specificare meglio la struttura della grafica.

## Il funzionamento di `<canvas>` spiegato con un esempio semplice

Servendoti della sintassi sopra puoi creare un’area di disegno semplice. Nell’esempio di seguito, quest’area deve avere una lunghezza di 500 pixel e un’altezza di 250 pixel. Il codice si presenta così:

```html

<html>
<body>
<h1>Esempio di canvas HTML</h1>
<canvas id="CanvasEsempio" width="500" height="250" style="border: 1px solid grey"></canvas>
<div class="hash d-none" hidden>hash_81be55d8271aa5e222f45764e162a541d6c730e2</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>
```

In questo modo però ottieni soltanto un’area libera. Solo con JavaScript puoi riempire l’elemento `<canvas>` HTML generato con **forme, immagini, testi o gradienti** e, se necessario, animare questi oggetti. I contenuti sono inseriti sotto forma di pixel in una bitmap, che successivamente può poi essere convertita in una grafica PNG.

Puoi usare l’elemento con `getElementById()`. Questo metodo funziona soltanto se all’area `<canvas>` hai assegnato un ID univoco. Se desideri disegnare nell’area definita, o interagire in altro modo al suo interno, devi creare un **oggetto di disegno 2D**. Per l’esempio sopra, puoi farlo usando il codice seguente:

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

A questo punto, tutto è pronto per usare l’elemento `<canvas>` HTML come tela da disegno. Con la funzione `fillRect()` possiamo ora collocare nell’area definita un rettangolo semplice, che deve essere mantenuto di color petrolio (in inglese: “teal”) e avere una larghezza di 200 pixel e un’altezza di 150 pixel. Collochiamolo a una distanza di 10 pixel dal bordo sinistro e di 50 pixel dal bordo superiore. Il codice si presenta come segue:

```html

<html>
<body>
<h1>Esempio di canvas HTML</h1>
<canvas id="CanvasEsempio" width="500" height="250" style="border:1px solid grey"></canvas>
<script>
const CanvasEsempio = document.getElementById("CanvasEsempio");
const ctx = CanvasEsempio.getContext("2d");
ctx.fillStyle = "teal";
ctx.fillRect(10, 50, 200, 150);
</script>
<div class="hash d-none" hidden>hash_81be55d8271aa5e222f45764e162a541d6c730e2</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>
```

## Per cosa si può usare `<canvas>` HTML?

Nell’esempio sopra abbiamo inserito un rettangolo semplice, ma con l’elemento `<canvas>` puoi realizzare anche forme molto più complesse. Ad esempio, **archi, testi, trasparenze, gradienti di colore e grafici** nei formati GIF, JPEG e PNG. Queste forme possono essere tagliate, scalate e posizionate a piacere. Mediante la funzione temporale di JavaScript è anche possibile realizzare animazioni all’interno di un tag `<canvas>` HTML.

## Quali dimensioni può avere un elemento `<canvas>`?

Le dimensioni massime possibili per un `<canvas>` HTML variano a seconda del browser e dell’ambiente. Ad esempio per iOS il limite è 4096 x 4096 pixel, mentre altri sistemi consentono anche dimensioni superiori a 10.000 x 10.000 pixel. Tuttavia, siccome l’area **dipende sempre dal rapporto d’aspetto**, gli elementi sono responsive e quindi adatti per dispositivi diversi.

## I metodi per le API di HTML `<canvas>` in breve

Abbiamo già descritto come si crea un oggetto del contesto 2D. Con uno di questi oggetti integrato tramite `getContext("2d")` puoi riempire l’area `<canvas>` in qualsiasi momento. Di seguito riepiloghiamo i metodi più importanti all’interno delle API.

### Testo

<table>
  <thead>
    <tr>
      <th>Metodo</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`font`</td>
      <td>Definisce il tipo di carattere per i contenuti di testo</td>
    </tr>
    <tr>
      <td>`fillText()`</td>
      <td>Inserisce testo (completamente pieno) in `<canvas>` HTML</td>
    </tr>
    <tr>
      <td>`strokeText()`</td>
      <td>Inserisce testo (solo contorni)</td>
    </tr>
  </tbody>
</table>

### Immagine

<table>
  <thead>
    <tr>
      <th>Metodo</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`drawImage()`</td>
      <td>Inserisce un’immagine o un video all’interno di un elemento `<canvas>` HTML</td>
    </tr>
  </tbody>
</table>

### Disegno

<table>
  <thead>
    <tr>
      <th>Metodo</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`fillRect()`</td>
      <td>Disegna un rettangolo pieno</td>
    </tr>
    <tr>
      <td>`strokeRect()`</td>
      <td>Disegna un rettangolo vuoto</td>
    </tr>
    <tr>
      <td>`clearRect()`</td>
      <td>Cancella determinati pixel all’interno di un rettangolo</td>
    </tr>
  </tbody>
</table>

### Percorsi

<table>
  <thead>
    <tr>
      <th>Metodo</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`beginPath()`</td>
      <td>Inizia un nuovo percorso</td>
    </tr>
    <tr>
      <td>`lineTo()`</td>
      <td>Disegna una linea verso il percorso</td>
    </tr>
    <tr>
      <td>`moveTo()`</td>
      <td>Sposta il percorso in un punto all’interno della tela</td>
    </tr>
  </tbody>
</table>

### Progettazione

<table>
  <thead>
    <tr>
      <th>Metodo</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`addColorStop()`</td>
      <td>Definisce i colori e le posizioni di un gradiente</td>
    </tr>
    <tr>
      <td>`createLinearGradient()`</td>
      <td>Crea un gradiente lineare</td>
    </tr>
    <tr>
      <td>`createPattern()`</td>
      <td>Ripete un elemento</td>
    </tr>
    <tr>
      <td>`shadowBlur`</td>
      <td>Definisce la sfocatura di un’ombra</td>
    </tr>
    <tr>
      <td>`shadowColor`</td>
      <td>Determina il colore di un’ombra</td>
    </tr>
  </tbody>
</table>

### Altre funzioni

<table>
  <thead>
    <tr>
      <th>Metodo</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`restore()`</td>
      <td>Ripristina uno stato precedente</td>
    </tr>
    <tr>
      <td>`save()`</td>
      <td>Salva lo stato corrente e tutti i suoi attributi</td>
    </tr>
  </tbody>
</table>

## Esempio di `<canvas>` HTML con testo e gradiente di colore

Nel nostro ultimo esempio, usiamo alcuni di questi metodi. Per mezzo del tag `<canvas>` HTML realizziamo prima una cornice da **500 x 250 pixel**. Poi creiamo un **oggetto 2D**. Infine, inseriamo un titolo e un’altra frase con un gradiente di colore. Il codice da usare è il seguente:

```html

<html>
<body>
<h1>Esempio di canvas HTML con testo e un gradiente di colore</h1>
<h2>Usiamo i metodi strokeText() e gradient</h2>
<canvas id="CanvasEsempio" width="500" height="250" style="border:1px solid grey"></canvas>
<script>
const c = document.getElementById("CanvasEsempio");
const ctx = c.getContext("2d");
ctx.font = "40px Calibri";
ctx.strokeText("Qui c’è un titolo", 20, 50);
ctx.font = "30px Calibri";
var gradient = ctx.createLinearGradient(0, 0, c.width, 0);
gradient.addColorStop("0", "teal");
gradient.addColorStop("0.5", "blue");
gradient.addColorStop("1.0", "green");
ctx.strokeStyle = gradient;
ctx.strokeText("Qui c’è un’altra frase", 20, 90);
</script>
<div class="hash d-none" hidden>hash_81be55d8271aa5e222f45764e162a541d6c730e2</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.it/digitalguide/siti-web/programmazione-del-sito-web/canvas-html/](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/canvas-html/) for AI/LLM consumption.