Otimização de imagens — guia prático
Tudo que o ImageLens avalia, com o porquê de cada regra e exemplos lado a lado.
1. Sirva no tamanho real exibido
Se uma imagem aparece em 320×320 na tela mas o arquivo tem 1080×1080, você está enviando ~10× mais pixels do que o necessário. Mobile paga isso em bateria, dados e tempo de carregamento.
| Uso na LP | Largura recomendada | Peso ideal |
|---|---|---|
| Ícone / avatar | 64–128px | ≤ 20 KB |
| Card pequeno | 320–480px | ≤ 60 KB |
| Card grande | 600–800px | ≤ 120 KB |
| Hero mobile | 600–900px | ≤ 150 KB |
| Hero desktop | 1200–1600px | ≤ 250 KB |
Quer testar uma imagem específica? Use a aba Otimizar imagem.
2. Use WebP ou AVIF no lugar de PNG/JPG
Formatos modernos comprimem muito melhor sem perda visível de qualidade.
- AVIF — melhor compressão atual (~50% menor que JPEG). Ideal para fotos.
- WebP — ótimo equilíbrio entre tamanho e suporte. Padrão recomendado.
- PNG — só para logos, ícones e arte com transparência.
- JPEG — fotos quando não puder usar WebP/AVIF.
- SVG — vetorial, escala sem perda. Ideal para ícones e logos.
Você pode converter usando a aba Otimizar imagem deste site, ou ferramentas como Squoosh e TinyPNG.
3. srcset e sizes — uma imagem para cada tela
Com srcset você fornece várias versões da imagem; o navegador escolhe a melhor para a tela atual (largura + densidade de pixel).
srcset, o mesmo arquivo pesado vai para o iPhone SE e para o monitor 4K. Você desperdiça banda em telas pequenas.<img
src="/img/produto-640.webp"
srcset="
/img/produto-320.webp 320w,
/img/produto-640.webp 640w,
/img/produto-1080.webp 1080w"
sizes="(max-width: 768px) 80vw, 320px"
alt="..."
width="640" height="640"
loading="lazy" decoding="async"
/>O navegador escolhe a versão certa por viewport e DPR.
<img
src="/img/produto-1080.png"
alt="..."
/>Mesmo arquivo grande para todos. Sem dimensões → CLS.
4. Lazy loading abaixo da dobra (mas nunca no LCP)
Use loading="lazy" em imagens que ficam abaixo da primeira tela. Nunca aplique no hero ou na imagem do LCP.
lazy, o navegador adia o download até a imagem chegar perto do viewport. No hero/LCP isso atrasa a renderização do maior elemento — exatamente o que o Core Web Vital mede.<!-- Hero / LCP: prioridade alta -->
<img src="/hero.webp" alt="..."
fetchpriority="high" decoding="async" />
<!-- Abaixo da dobra: lazy -->
<img src="/depoimento.webp" alt="..."
loading="lazy" decoding="async" /><!-- Lazy no hero atrasa o LCP -->
<img src="/hero.webp" alt="..."
loading="lazy" />5. Priorize a imagem do LCP
LCP (Largest Contentful Paint) é o tempo até o maior elemento visível aparecer — quase sempre uma imagem hero. É um dos três Core Web Vitals do Google.
fetchpriority="high" e <link rel="preload"> dizem ao navegador "comece a baixar isso antes de qualquer outra coisa". Sem isso, ele descobre a imagem só depois de processar o HTML inteiro.<!-- No <head> -->
<link rel="preload" as="image"
href="/hero-1200.webp"
imagesrcset="/hero-600.webp 600w, /hero-1200.webp 1200w"
imagesizes="100vw" />
<!-- No <body> -->
<img src="/hero-1200.webp" alt="..."
width="1200" height="800"
fetchpriority="high" decoding="async" />6. Sempre defina width e height
Mesmo que o CSS redimensione, declare width e height com a proporção original. O navegador reserva o espaço antes da imagem carregar.
Clique em "Recarregar" e observe o pulo de layout no card da direita.
Texto abaixo da imagem permanece estável.
Texto abaixo da imagem é empurrado quando ela carrega.
<img src="/foto.webp" alt="..."
width="640" height="360" />Espaço reservado → zero layout shift.
<img src="/foto.webp" alt="..." />Conteúdo abaixo pula quando a imagem chega.
7. Cuidado com background-image em CSS
O navegador descobre background-image tarde no pipeline — só depois de baixar e parsear o CSS. Para imagens críticas (hero, LCP), prefira <img>.
<img> são detectadas pelo preload scanner do navegador assim que o HTML chega. background-image espera o CSSOM ser construído. Diferença típica: 200–600ms no LCP.<!-- Hero como <img> -->
<img src="/hero.webp" alt="..."
fetchpriority="high" />Detectado imediatamente pelo preload scanner.
<!-- Hero como background -->
<div class="hero" style="background-image: url(/hero.webp)"></div>Só baixa depois do CSS — atrasa o LCP.
8. Checklist final
- Tamanho real conferido (no máximo 2× o exibido)
- Convertida para WebP ou AVIF
- Variantes responsivas com
srcset+sizes loading="lazy"em imagens fora da dobrafetchpriority="high"+ preload no herowidtheheightsempre declaradosaltdescritivo (acessibilidade e SEO)- PageSpeed Insights re-rodado e LCP < 2.5s