front-end

27 jan 2025

Substituindo background-image por <img> no HTML (Parte 1)

Ao utilizar imagens como background, a forma mais comum é utilizar a propriedade background-image no CSS. Porém, podemos substituir de forma simples pelo uso da tag <img> no HTML, o que traz muitas vantagens em performance e responsividade.

A tag <img> oferece um controle muito maior sobre o carregamento e o comportamento da imagem. Um dos principais benefícios é a possibilidade de usar o atributo loading="lazy", que permite o carregamento sob demanda. Isso reduz o peso inicial da página, melhorando o tempo de carregamento, principalmente em dispositivos móveis Outro recursos “liberados” muito importantes são o srcset e sizes, possibilitando a entrega de imagens diferentes dependendo do tamanho da tela (explico melhor num futuro breve).

Essa abordagem elimina a dependência do carregamento completo do CSS para exibir as imagens. Diferentemente de um background-image, que é carregado apenas após o CSS ser processado pelo navegador, a tag <img> permite que a imagem seja carregada de forma assíncrona e antecipada (se necessário).

Nos códigos abaixo, mostro um exemplo dessa substituição. A imagem é configurada para preencher toda a área, utilizando as propriedades CSS object-fit e object-position. Dessa forma, replicamos o funcionamento das propriedades de background do CSS. Vale ressaltar que, nesse caso, não uso o lazy=”loading” pois a seção de hero é a primeira a ser renderizada na tela.

Usando CSS e background-image

<style>
  .hero {
    background-image: url("https://placehold.co/1200x1200");
    background-size: cover;
    background-position: center;
  }
</style>
<section class="hero">
  <div class="container hero__container">
    <h1>Hello, World!</h1>
    <p>Lorem ipsum...</p>
  </div>
</section>

Otimizando o uso com HTML e <img>

<style>
  .hero {
    position: relative;
  }

  .bg {
    position: absolute;
    z-index: 0;
    inset: 0;

    img {
      width: 100%;
      height: 100%;
      object-fit: cover;
      object-position: center;
    }
  }
</style>
<section class="hero">
  <div class="container hero__container">
    <h1>Hello, World!</h1>
    <p>Lorem ipsum...</p>
  </div>

  <div class="bg">
    <img
      src="https://placehold.co/1200x1200"
      width="1200"
      height="1200"
      aria-hidden="true"
      alt=""
    />
  </div>
</section>

Exemplo final com as diferenças de código:

code example

Essa técnica é muito útil em páginas com grande número de imagens, pois melhora tanto UX quanto as métricas do pagespeed, por exemplo. Utilizo há alguns anos e percebi na prática a melhora de desempenho, custando muito pouco em termos de trabalho e aplicação.