# Como usar &lt;canvas&gt; HTML para criar framework com conteúdo gráfico

O elemento `<canvas>` em HTML possibilita criar uma área para adicionar conteúdo gráfico ou animações usando JavaScript. Um objeto de contexto 2D é criado e, com os diferentes métodos da API `<canvas>`, você consegue especificar o conteúdo que deseja exibir.

## O que é a tag `<canvas>` em HTML?

A tag `<canvas>` em HTML é um elemento que oferece um espaço de desenho onde você pode criar **conteúdo gráfico ou animações** usando JavaScript. Essa área é definida pelos atributos de altura e largura e pode ser posicionada em qualquer lugar de um documento HTML usando a tag HTML `<canvas>`.

O conteúdo desenhado dentro do `<canvas>` não é tratado como elementos HTML individuais e, por isso, não pode ser estilizado com CSS. No entanto, o próprio `<canvas>` pode ter estilos aplicados via CSS, como bordas, largura, altura e posicionamento. Caso o navegador não ofereça suporte ao `<canvas>`, qualquer conteúdo HTML colocado entre as tags `<canvas>` e &lt;/canvas&gt; será exibido como fallback. No entanto, quase todos os navegadores modernos já oferecem suporte nativo a esse elemento.

## Qual é a sintaxe da tag `<canvas>` em HTML?

O elemento `<canvas>` em HTML não oferece nenhuma ferramenta de design integrada. Ele apenas disponibiliza um framework que permite usar JavaScript para criar conteúdo gráfico. A sintaxe básica do elemento é a seguinte:

```html
<canvas id="ExemploCanvas" width="[em pixels]" height="[em pixels]"></canvas>
```

Nomeie o elemento usando `id` e atribua suas dimensões com `width` e `height`. Opcionalmente, você pode usar outros parâmetros para especificar o design do conteúdo gráfico.

## Como funciona a tag `<canvas>`?

Você pode usar a sintaxe acima para criar uma área simples. No exemplo abaixo, a área terá 500 pixels de largura e 250 pixels de altura. Este é o código:

```html

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

Esse código criará um espaço em branco. Para preencher o elemento `<canvas>` em HTML com **formas, imagens, textos ou gradientes** (ou animar elementos), você terá que usar JavaScript. O conteúdo será renderizado como bitmap, no qual cada pixel é manipulado individualmente. Ele poderá ser exportado para formatos como PNG ou JPEG posteriormente.

Para usar o elemento, aplique o método `getElementById()`. Ele só funcionará se você tiver atribuído um ID único ao espaço de `<canvas>`. Se quiser pintar, desenhar ou interagir com a área definida, você terá que criar um **objeto de contexto 2D**. Dando continuidade ao exemplo acima, o código ficaria assim:

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

Agora, podemos usar o elemento `<canvas>` em HTML como uma tela. Começaremos posicionando um retângulo simples em uma área definida usando a função `fillRect()`. Ele terá a cor azul-petróleo com 200 pixels de largura e 150 pixels de altura. Vamos posicioná-lo a 10 pixels da borda esquerda e 50 pixels da borda superior. Este é o código:

```html

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

## Quais são os usos de `<canvas>` em HTML?

Apesar de termos desenhado apenas um retângulo simples no exemplo acima, você também pode usar o elemento `<canvas>` para criar formas e designs muito mais complexos. Por exemplo, é possível criar **arcos, textos, transparências, gradientes de cor e gráficos** nos formatos *JPEG* e *PNG*, que podem ser recortados, escalados e posicionados. Você também pode usar a função de tempo do JavaScript para implementar animações em uma tag `<canvas>` em HTML.

## Quais dimensões um elemento `<canvas>` pode ter?

As dimensões máximas de um elemento `<canvas>` em HTML variam dependendo do navegador usado e de seu ambiente. Por exemplo, o limite no iOS é 4096 x 4096 pixels, enquanto outros sistemas permitem ultrapassar 10000 x 10000 pixels. A área não se ajusta automaticamente para **preservar as proporções**. Se necessário, é preciso definir regras de estilo no CSS para torná-lo responsivo e adequado para diferentes dispositivos

## Métodos com a API `<canvas>` em HTML

Vimos acima como criar um objeto de contexto 2D. Usando o comando `getContext("2d")`, você consegue preencher a área `<canvas>` como quiser. Abaixo, resumimos os métodos mais importantes que estão disponíveis na API.

### Texto

<table>
  <thead>
    <tr>
      <th>Método</th>
      <th>Descrição</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`font`</td>
      <td>Define a fonte do texto</td>
    </tr>
    <tr>
      <td>`fillText()`</td>
      <td>Insere o texto (completamente preenchido) na área `<canvas>` em HTML</td>
    </tr>
    <tr>
      <td>`strokeText()`</td>
      <td>Insere o texto (apenas contornos)</td>
    </tr>
  </tbody>
</table>

### Imagem

<table>
  <thead>
    <tr>
      <th>Método</th>
      <th>Descrição</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`drawImage()`</td>
      <td>Posiciona uma imagem ou vídeo em um elemento `<canvas>` em HTML</td>
    </tr>
  </tbody>
</table>

### Desenhos

<table>
  <thead>
    <tr>
      <th>Método</th>
      <th>Descrição</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`fillRect()`</td>
      <td>Desenha um retângulo preenchido</td>
    </tr>
    <tr>
      <td>`strokeRect()`</td>
      <td>Desenha um retângulo sem preenchimento</td>
    </tr>
    <tr>
      <td>`clearRect()`</td>
      <td>Limpa os pixels especificados dentro de um retângulo</td>
    </tr>
  </tbody>
</table>

### Caminho

<table>
  <thead>
    <tr>
      <th>Método</th>
      <th>Descrição</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`beginPath()`</td>
      <td>Inicia um novo caminho</td>
    </tr>
    <tr>
      <td>`lineTo()`</td>
      <td>Desenha uma linha para o caminho</td>
    </tr>
    <tr>
      <td>`moveTo()`</td>
      <td>Move o caminho para um ponto específico dentro da área</td>
    </tr>
  </tbody>
</table>

### Design

<table>
  <thead>
    <tr>
      <th>Método</th>
      <th>Descrição</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`addColorStop()`</td>
      <td>Especifica uma cor e uma posição em um objeto gradiente</td>
    </tr>
    <tr>
      <td>`createLinearGradient()`</td>
      <td>Cria um objeto gradiente linear</td>
    </tr>
    <tr>
      <td>`createPattern()`</td>
      <td>Repete o elemento especificado</td>
    </tr>
    <tr>
      <td>`shadowBlur`</td>
      <td>Define ou retorna o nível de desfoque nas sombras</td>
    </tr>
    <tr>
      <td>`shadowColor`</td>
      <td>Define ou retorna a cor usada nas sombras</td>
    </tr>
  </tbody>
</table>

### Funções adicionais

<table>
  <thead>
    <tr>
      <th>Método</th>
      <th>Descrição</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>`restore()`</td>
      <td>Restaura um desenho para o mesmo estado da última vez em que ele foi salvo</td>
    </tr>
    <tr>
      <td>`save()`</td>
      <td>Salva o estado atual do desenho e todos os seus atributos</td>
    </tr>
  </tbody>
</table>

## Exemplo de `<canvas>` em HTML com texto e gradiente de cor

Em nosso último exemplo, combinaremos alguns dos métodos apresentados na seção acima. Primeiro, vamos criar uma área com as dimensões **500 x 250 pixels** usando a tag `<canvas>` em HTML. Em seguida, criaremos um **objeto de contexto 2D**. Por fim, vamos inserir um título com contorno e uma frase com um gradiente de cor.

```html

<html>
<body>
<h1>Exemplo de canvas HTML com texto e gradiente de cor</h1>
<h2>Este exemplo usa os métodos strokeText() e gradiente.</h2>
<canvas id="ExemploCanvas" width="500" height="250" style="border:1px solid grey"></canvas>
<script>
const c = document.getElementById("ExemploCanvas");
const ctx = c.getContext("2d");
ctx.font = "40px Calibri";
ctx.strokeText("Este é o título", 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("Esta é a frase adicional", 20, 90);
</script>
<div class="hash d-none" hidden>hash_1395936a0b4ef5b7f42a6716d8adf28bc21f18e4</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.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/canvas-html/](https://www.ionos.com/pt-br/digitalguide/sites-de-internet/desenvolvimento-web/canvas-html/) for AI/LLM consumption.