Guia de SVG para Desenvolvedores: Gráficos Escaláveis que Funcionam em Todo Lugar
Aprenda como o SVG funciona, como otimizar arquivos SVG para a web, padrões de uso inline vs externo, e como animar e manipular SVGs com CSS e JavaScript.
SVG (Scalable Vector Graphics) é o único formato de imagem nativamente compreendido pelos navegadores como XML estruturado, estilizável e programável. Um logotipo em SVG é exibido com nitidez em um monitor 1×, em uma tela 4K e em um outdoor impresso — tudo a partir do mesmo arquivo. Entender SVG faz de você um desenvolvedor frontend mais capacitado.
O que torna o SVG diferente
Formatos raster (JPEG, PNG, WebP) armazenam imagens como uma grade de pixels. Amplie-os e você obtém desfoque. O SVG armazena imagens como descrições matemáticas de formas:
<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="40" fill="#3b82f6" />
<text x="50" y="55" text-anchor="middle" fill="white" font-size="14">Hello</text>
</svg>
Isso renderiza um círculo azul com o texto "Hello" — em qualquer tamanho, perfeitamente nítido.
Quando usar SVG:
- Logotipos e ícones (precisam permanecer nítidos em todos os tamanhos)
- Ilustrações e diagramas
- Gráficos e visualizações de dados (D3.js gera SVG)
- Animações e gráficos interativos
- Ícones de UI (muito melhor do que fontes de ícones)
Quando NÃO usar SVG:
- Fotografias e imagens fotorrealistas complexas (use JPEG/WebP)
- Capturas de tela (use PNG)
- Quando o SVG possui milhares de nós (torna-se mais lento do que Canvas)
Elementos principais do SVG
Formas
<!-- Retângulo -->
<rect x="10" y="10" width="80" height="60" rx="8" fill="#e2e8f0" stroke="#94a3b8" stroke-width="2"/>
<!-- Círculo -->
<circle cx="50" cy="50" r="30" fill="#3b82f6"/>
<!-- Elipse -->
<ellipse cx="50" cy="50" rx="40" ry="20" fill="#10b981"/>
<!-- Linha -->
<line x1="0" y1="0" x2="100" y2="100" stroke="#1e293b" stroke-width="2"/>
<!-- Polígono -->
<polygon points="50,10 90,90 10,90" fill="#f59e0b"/>
<!-- Polilinha (forma aberta) -->
<polyline points="10,80 30,20 50,60 70,30 90,70" fill="none" stroke="#ef4444" stroke-width="3"/>
Paths — a forma universal
O elemento <path> pode descrever qualquer forma usando uma minilinguagem de comandos de mover, traçar linha, curva e arco:
<path d="M 10 80 Q 50 10 90 80" fill="none" stroke="#8b5cf6" stroke-width="3"/>
Comandos de path:
M x,y— Mover para (caneta levantada)L x,y— Linha atéH x— Linha horizontalV y— Linha verticalQ cx,cy x,y— Curva de Bezier quadráticaC cx1,cy1 cx2,cy2 x,y— Curva de Bezier cúbicaA rx,ry rot large-arc sweep x,y— ArcoZ— Fechar path
Raramente escrevemos paths manualmente — ferramentas de design os exportam. Mas saber lê-los ajuda na depuração e otimização.
O viewBox: SVGs responsivos
O atributo viewBox é a chave para SVGs responsivos:
<svg viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
<!-- Conteúdo desenhado em um espaço de coordenadas 200×100 -->
</svg>
Sem width/height no elemento, o SVG preenche seu contêiner como uma imagem responsiva. Defina width: 100% no CSS e ele escala perfeitamente.
.logo svg {
width: 100%;
height: auto;
}
Três formas de usar SVG na web
1. Arquivo externo (<img>)
<img src="logo.svg" alt="Logotipo da empresa" width="200" height="80">
✅ Simples, com cache, funciona em todo lugar
❌ Não pode ser estilizado com CSS, não pode ser programado
2. Background CSS
.icon {
background-image: url('icon.svg');
background-size: contain;
width: 24px;
height: 24px;
}
✅ Bom para ícones decorativos
❌ Sem estilização CSS dos elementos internos do SVG, sem acessibilidade
3. SVG inline (mais poderoso)
<button>
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true">
<path d="M5 4l7 6-7 6" fill="none" stroke="currentColor" stroke-width="2"/>
</svg>
Próximo
</button>
✅ Controle total via CSS, programável, usa currentColor para herdar a cor do texto
❌ Sem cache, aumenta o tamanho do HTML
Para ícones em componentes de UI, SVG inline é a melhor escolha. Sprite sheets (um único <svg> com elementos <symbol> e referências <use>) oferecem cache com capacidade de estilização.
Estilizando SVG com CSS
SVGs inline respondem ao CSS como qualquer elemento HTML:
.icon {
width: 24px;
height: 24px;
color: #3b82f6; /* controla currentColor */
}
.icon:hover {
color: #1d4ed8;
}
No SVG, use currentColor em vez de cores fixas:
<path fill="currentColor" d="..."/>
<path stroke="currentColor" d="..."/>
Agora a cor do ícone é controlada inteiramente pelo CSS — modo escuro, estados de hover e temas funcionam automaticamente.
Animações CSS em SVG
@keyframes spin {
to { transform: rotate(360deg); }
}
.spinner {
animation: spin 1s linear infinite;
transform-origin: center;
}
<svg viewBox="0 0 24 24">
<circle class="spinner" cx="12" cy="12" r="10"
fill="none" stroke="#3b82f6" stroke-width="2"
stroke-dasharray="31.4" stroke-dashoffset="10"/>
</svg>
stroke-dasharray e stroke-dashoffset são as propriedades de animação mais poderosas do SVG — elas permitem animações de desenho, nas quais os paths parecem se desenhar sozinhos.
Otimizando arquivos SVG
Ferramentas de design exportam SVGs com metadados desnecessários, comentários e IDs do editor. Um SVG exportado típico pode ter 15 KB; otimizado, pode chegar a 3 KB.
O que remover:
- Declaração
<?xml version="1.0"?>(não é necessária inline) xmlns:xlink,xmlns:dc, namespaces de metadados do Adobe/Inkscape- Atributos
idusados apenas pelo editor - Comentários e espaços em branco
- Elementos de grupo redundantes
<g> - Valores de atributos padrão (
fill="black",opacity="1")
Ferramentas como SVGO automatizam esse processo. Quando você precisar de uma versão raster para plataformas que não suportam SVG, converta para PNG com nosso conversor de SVG para PNG.
Acessibilidade
SVGs usados como conteúdo significativo precisam de descrições acessíveis:
<svg role="img" aria-labelledby="title desc">
<title id="title">Gráfico de receita</title>
<desc id="desc">Gráfico de barras mostrando a receita mensal crescendo de $10 mil em janeiro para $45 mil em junho de 2026</desc>
<!-- conteúdo do gráfico -->
</svg>
SVGs decorativos (ícones ao lado de botões com rótulos) devem ser ocultados dos leitores de tela:
<svg aria-hidden="true" focusable="false">...</svg>
Referência rápida: atributos úteis do SVG
| Atributo | O que faz |
|---|---|
viewBox="x y w h" |
Define o sistema de coordenadas |
fill |
Cor de preenchimento da forma (none, hex, currentColor) |
stroke |
Cor do contorno |
stroke-width |
Espessura do contorno |
stroke-linecap |
Estilo da extremidade da linha: butt, round, square |
stroke-linejoin |
Estilo dos cantos: miter, round, bevel |
opacity |
Transparência do elemento (0–1) |
transform |
translate(), rotate(), scale(), skew() |
clip-path |
Recorta o conteúdo em uma forma |
filter |
Aplica filtros SVG (blur, sombra, etc.) |
SVG é uma das ferramentas mais subutilizadas da web. Assim que você entende o sistema de coordenadas e o modelo de estilização, é possível criar ícones, ilustrações, gráficos e animações que ficam perfeitos em qualquer tamanho e respondem dinamicamente à interação do usuário.