SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
12.01.2025

Como Ajustar o Canvas ao Tamanho do Elemento Pai: Uma Solução em JS

Resumo Rápido

Para garantir que as dimensões do elemento canvas se alinhem com o seu contêiner pai, defina essas dimensões no CSS como 100%. Lembre-se de sincronizar as dimensões CSS com os atributos width e height do elemento usando JavaScript. Isso garante uma renderização de alta qualidade.

<div style="width: 500px; height: 300px;">
  <canvas id="meuCanvas" style="width:100%; height:100%;"></canvas>
</div>
const canvas = document.getElementById('meuCanvas');

function redimensionarCanvas() {
  canvas.width = canvas.offsetWidth;
  canvas.height = canvas.offsetHeight;
}

redimensionarCanvas();
window.addEventListener('resize', redimensionarCanvas);

O CSS controla a aparência do elemento, enquanto o JavaScript define a resolução apropriada para a área de trabalho do canvas.

Adaptando-se a Tamanhos de Tela e Dispositivos

O canvas deve ser exibido corretamente em telas de diferentes tamanhos. É recomendado usar unidades vw e vh para criar um canvas responsivo que se ajuste automaticamente de acordo com o tamanho da janela do navegador.

canvas {
  width: 100vw;   /* Ocupa toda a largura da janela do navegador */
  height: 50vh;   /* E metade de sua altura */
}

Para manter proporções corretas em diversos dispositivos, utilize media queries para ajustar os tamanhos do canvas.

@media only screen and (max-width: 600px) {
  canvas {
    width: 100%;  /* Em telas menores, ocupa toda a largura disponível */
    height: auto; /* Adotamos uma abordagem flexível para a altura */
  }
}

Funcionalidade em Telas de Alta Resolução

Com o aumento da popularidade das telas de alta densidade de pixels, utilize window.devicePixelRatio para escalar de forma precisa e garantir ilustrações nítidas em tais telas.

let fatorEscala = window.devicePixelRatio;

canvas.width = Math.floor(canvas.offsetWidth * fatorEscala);
canvas.height = Math.floor(canvas.offsetHeight * fatorEscala);

let contexto = canvas.getContext('2d');
contexto.scale(fatorEscala, fatorEscala); /* Considerado para alta resolução */

Dessa forma, o canvas mantém a clareza e nitidez em qualquer display.

Dominando a Gestão de Redimensionamento Dinâmico

Para evitar problemas de desempenho durante o redimensionamento dinâmico, aplique uma função de debounce ao evento resize.

window.addEventListener('resize', debounce(redimensionarCanvas, 250)); /* Reagindo sem pressa */

A função debounce garante que a função de redimensionamento seja acionada no máximo uma vez a cada 250 milissegundos.

Visualização

Você pode fazer uma analogia entre um canvas que preenche perfeitamente o espaço do pai e água que preenche um recipiente:

Elemento Pai (📦): Define os limites.
Canvas (💧): Preenche perfeitamente o espaço designado.

Para um encaixe perfeito, é simples:

<canvas style="width:100%; height:100%;"></canvas>

CSS adicional:

canvas {
  display: block;     /* Evita margens indesejadas */
  width: 100%;       /* Preenche completamente a largura do contêiner */
  height: 100%;      /* Da mesma forma, preenche a altura */
}

Em resumo, o canvas 🖼️ é definido para o tamanho do pai 📦, assim como a água 💧 preenche um recipiente.

Soluções para Problemas Comuns

Gerenciamento de Tamanhos no CSS

Um ponto chave na definição de tamanhos no CSS é que o elemento pai deve ter dimensões explícitas. Se esta condição não for atendida, os tamanhos percentuais do canvas se tornam indefinidos.

Corrigindo o Desfoque Comum em Telas de Alta DPI

Imagens borradas no canvas com alta densidade de pixels podem ser corrigidas utilizando a razão de pixels do dispositivo e configurando corretamente o tamanho do buffer de desenho.

Prevenindo Mudanças no Layout

Alterar os tamanhos do canvas pode impactar inesperadamente o layout da página. Para resolver isso, considere colocar o canvas em um contêiner com overflow: hidden ou utilizar sistemas de gerenciamento de layout como Flexbox ou Grid.

Recursos Úteis

  1. Canvas Basics - Web API | MDN — Visão geral dos essenciais ao trabalhar com o elemento canvas e técnicas para redimensioná-lo.
  2. Guia Completo de Flexbox | CSS-Tricks — Instruções detalhadas para criar layouts que se ajustam automaticamente utilizando Flexbox.
  3. javascript - Ajustando o Tamanho do Canvas ao Elemento Pai - Stack Overflow — Guia sobre como redimensionar o canvas em relação ao contêiner pai e trabalhar com design responsivo.
  4. HTML Canvas — Informações extensas sobre como trabalhar com o canvas em HTML5 e defini-lo em tela cheia usando CSS.
  5. Usando Unidades de Viewport CSS: vh, vw, vmin, vmax | SitePoint — Exploração das unidades de medida do viewport para criar tamanhos de canvas responsivos que se ajustam de acordo com a janela do navegador.
  6. Tamanho e Rolagem de Elementos — Descrição detalhada dos métodos para ajustar automaticamente os tamanhos do canvas com JavaScript.
  7. html - Definindo Largura e Altura do Canvas em HTML5 - Stack Overflow — Discussão sobre métodos para criar um canvas que preenche completamente um contêiner e técnicas para design responsivo.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!