Uma imagem pode adaptar-se perfeitamente à largura do ecrã e continuar desnecessariamente pesada. É um dos problemas mais frequentes do responsive design.
Com CSS como:
img { max-width: 100%; height: auto; }
uma fotografia de 4.000 píxeis pode ser apresentada corretamente numa coluna de 360 px. Mas, se o navegador descarregar sempre o ficheiro de 4.000 px, o utilizador móvel recebe muito mais dados do que precisa.
As imagens responsivas resolvem este problema ao fornecer vários recursos possíveis e permitir ao navegador escolher uma variante adequada.
Imagem fluida e imagem responsiva
Uma imagem fluida adapta a sua apresentação ao contentor com CSS. O ficheiro descarregado pode, no entanto, permanecer exatamente o mesmo.
Uma imagem responsiva oferece vários ficheiros, por exemplo:
foto-480.webp
foto-800.webp
foto-1200.webp
foto-1600.webp
O CSS adapta a apresentação; srcset e sizes adaptam o recurso transferido.
Porque não enviar sempre a maior imagem?
Porque um recurso grande tem um custo. Se uma variante de 800 px pesa 110 kB e uma de 2.000 px pesa 420 kB, enviar sempre a segunda para um telemóvel pode desperdiçar centenas de kilobytes por imagem.
Em galerias, catálogos ou páginas com muitas imagens, esse desperdício acumula-se rapidamente.
E porque não usar sempre a mais pequena?
Uma imagem de 480 px pode perder nitidez num ecrã grande ou de alta densidade. É necessário equilibrar dimensões, densidade, peso e qualidade. As imagens responsivas permitem oferecer várias respostas em vez de impor um tamanho universal.
Preparar as variantes
O HTML não cria os ficheiros automaticamente. A partir de um original suficientemente grande pode preparar:
hero-480.webp
hero-768.webp
hero-1024.webp
hero-1440.webp
hero-1920.webp
O redimensionador de imagens ajuda a gerar larguras e o conversor permite mudar formato e compressão.
Não é necessário criar uma variante para cada largura possível; escolha um conjunto razoável de patamares coerentes com o layout.
Como funciona srcset com w
<img
src="foto-800.webp"
srcset="foto-480.webp 480w, foto-800.webp 800w, foto-1200.webp 1200w"
sizes="(max-width: 600px) 100vw, 800px"
alt="Descrição">
480w descreve a largura intrínseca do ficheiro, não a largura CSS final. sizes indica uma estimativa do espaço que a imagem ocupará no layout. O navegador combina estas informações com viewport e densidade do dispositivo para escolher uma candidata.
O descritor de densidade x
Para elementos com uma dimensão CSS relativamente fixa, pode usar:
<img src="logo.png" srcset="logo.png 1x, logo@2x.png 2x" alt="Logótipo">
Não misture descritores w e x no mesmo srcset sem compreender o modelo de seleção. Para imagens de conteúdo cuja largura muda com o layout, w com sizes é normalmente mais adequado.
