Ícones

A maioria das imagens faz parte do seu conteúdo, mas os ícones fazem parte da interface do usuário. Eles precisam ser dimensionados e adaptados da mesma forma que o texto da sua interface.

elementos gráficos vetoriais escaláveis

Quando se trata de imagens fotográficas, há muitas opções de formato: JPG, WebP e AVIF. Para imagens não fotográficas, você pode escolher entre o formato Portable Network Graphics (PNG) e o formato elementos gráficos vetoriais escaláveis (SVG).

Os formatos PNG e SVG são bons para lidar com áreas de cores planas e permitem que as imagens tenham fundos transparentes. Se você usar um PNG, provavelmente vai precisar criar várias versões da imagem em tamanhos diferentes e usar o atributo srcset no elemento img para tornar a imagem responsiva. Se você usar um SVG, ele será responsivo por padrão.

PNGs (e JPGs, WebP e AVIF) são imagens bitmap. As imagens bitmap armazenam informações como pixels. Em um SVG, as informações são armazenadas como instruções de desenho. Quando o navegador lê o arquivo SVG, as instruções são convertidas em pixels. E o melhor de tudo é que essas instruções são relativas. Independente das dimensões usadas para descrever linhas e formas, tudo é renderizado com a nitidez certa. Em vez de criar vários SVGs de tamanhos diferentes, você pode fazer um que funcione em todos os tamanhos. Não é necessário usar o atributo srcset.

<img src="image.svg" alt="A description of the image." width="25" height="25">
<img src="image.svg" alt="A description of the image." width="250" height="250">

O XML é usado para escrever as instruções em um arquivo SVG. Essa é uma linguagem de marcação, como o HTML.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-21 -21 42 42" width="100" height="100">
  <title>Smiling face</title>
  <circle r="20" fill="yellow" stroke="black"/>
  <ellipse rx="2.5" ry="4" cx="-6" cy="-7" fill="black"/>
  <ellipse rx="2.5" ry="4" cx="6" cy="-7" fill="black"/>
  <path stroke="black" d="M -12,5 A 13.5,13.5,0 0,0 12,5 A 13,13,0 0,1 -12,5"/>
</svg>

Um emoji de rosto sorridente amarelo que aumenta sem pixelização.

Você pode até mesmo colocar SVG dentro de HTML.

<figure>
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="-21 -21 42 42" width="100" height="100">
    <title>Smiling face</title>
    <circle r="20" fill="yellow" stroke="black"/>
    <ellipse rx="2.5" ry="4" cx="-6" cy="-7" fill="black"/>
    <ellipse rx="2.5" ry="4" cx="6" cy="-7" fill="black"/>
    <path stroke="black" d="M -12,5 A 13.5,13.5,0 0,0 12,5 A 13,13,0 0,1 -12,5"/>
  </svg>
  <figcaption>
  A description of the image.
  </figcaption>
</figure>

Se você incorporar um SVG assim, será uma solicitação a menos que o navegador precisará fazer. Não é preciso esperar o download da imagem porque ela chega com o HTML… no HTML! Além disso, como você vai descobrir em breve, incorporar SVGs como este oferece mais controle sobre o estilo deles.

Ícones e texto

As imagens de ícones geralmente apresentam formas simples em um fundo transparente. O SVG é ideal para ícones.

Se você tiver um botão ou um link com texto e um ícone dentro dele, o ícone será de apresentação. O que importa é o texto. Ao usar um elemento img, um atributo alt vazio indica que a imagem é de apresentação.

<button>
<img src="hamburger.svg" alt="" width="16" height="16">
Menu
</button>

Como o CSS é para apresentação, você pode colocar o ícone no CSS como uma imagem de plano de fundo.

<button class="menu">
Menu
</button>
.menu {
  background-image: url(hamburger.svg);
  background-position: 0.5em;
  background-repeat: no-repeat;
  background-size: 1em;
  padding-inline-start: 2em;
}

Se você colocar o SVG no HTML, use o atributo aria-hidden para ocultá-lo da tecnologia adaptativa.

<button class="menu">
  <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 80" width="16" height="16">
    <rect width="100" height="20" />
    <rect y="30" width="100" height="20"/>
    <rect y="60" width="100" height="20"/>
  </svg>
  Menu
</button>

Ícones independentes

Use texto dentro dos botões e links se quiser que a finalidade deles seja clara. Você pode usar um ícone sem texto, mas não presuma que todos entendam o significado de um ícone específico. Em caso de dúvida, teste com usuários reais.

Se você decidir usar um ícone sem texto acompanhante, ele não será mais de apresentação. Uma imagem de plano de fundo em CSS não é uma maneira adequada de mostrar o ícone. O ícone precisa receber um nome acessível em HTML.

Se você usar um elemento img, o ícone vai receber o nome acessível do atributo alt.

<button>
<img src="hamburger.svg" alt="Menu" width="16" height="16">
</button>

Outra opção é colocar o nome acessível no próprio link ou botão e declarar que a imagem é de apresentação. Use o atributo aria-label para fornecer o nome acessível.

<button aria-label="Menu">
<img src="hamburger.svg" alt="" width="16" height="16">
</button>

Se você colocar o SVG dentro do HTML, use o atributo aria-label no link ou botão para dar a ele um nome acessível e use o atributo aria-hidden no ícone.

<button aria-label="Menu">
  <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 80" width="16" height="16">
    <rect width="100" height="20" />
    <rect y="30" width="100" height="20"/>
    <rect y="60" width="100" height="20"/>
  </svg>
</button>

Ícones de estilo

Se você incorporar os ícones SVG diretamente no HTML, poderá estilizar partes deles como qualquer outro elemento na página. Isso não é possível se você usar um elemento img para mostrar seus ícones.

No exemplo a seguir, os elementos rect dentro do SVG têm um valor fill de blue para corresponder aos estilos do texto do botão.

button {
 color: blue;
}
button rect {
  fill: blue;
}

Também é possível aplicar estilos hover e focus.

button:hover,
button:focus {
  color: red;
}
button:hover rect,
button:focus rect {
  fill: red;
}

Recursos

Os ícones são uma parte importante da marca do seu site. Em seguida, você vai descobrir como tornar outros aspectos da sua marca responsivos com o poder da aplicação de temas.

Teste seu conhecimento

Teste seus conhecimentos sobre ícones

O SVG pode processar qualquer densidade de pixels com um único arquivo ou bloco de código <svg>.

Verdadeiro
O SVG inclui como desenhar as formas e linhas em qualquer densidade de pixels, escala ou zoom.
Falso
Ao contrário de .png ou .jpg, o SVG não precisa de srcset ou um elemento <picture>.

Quais são as vantagens do código SVG diretamente no HTML?

Estilizável com CSS
Combine as formas dos ícones SVG com os botões e as cores da marca.
Não é necessário fazer download.
Todas as instruções estão lá.
Carregamento lento por padrão.
Não há download para ter preguiça.
Menor uso da CPU.
Eu inventei isso.
Tema claro ou escuro sem um novo recurso.
As consultas de mídia podem mudar os estilos SVG inline.