SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
12.11.2024

Fundos CSS Adaptativos como Alternativa ao srcset em HTML

Resumo Rápido

Para adaptar imagens de fundo em CSS para diferentes tamanhos de tela, você pode usar consultas de mídia para definir diferentes URLs na propriedade background-image:

/* Imagem de fundo padrão */
.background { background-image: url('imagem.jpg'); }

/* Alternativa para displays Retina */
@media (min-resolution: 2dppx) {
  .background { background-image: url('imagem-2x.jpg'); }
}

/* Alternativa para dispositivos móveis */
@media (max-width: 768px) {
  .background { background-image: url('imagem-pequena.jpg'); }
}

Otimizando as condições de maneira similar ao srcset, você pode melhorar os tempos de carregamento e a qualidade da exibição.

Explorando a Função image-set

Em CSS, o equivalente ao srcset para imagens de fundo é a função image-set, que permite especificar múltiplas fontes de imagem:

.element {
  background-image: -webkit-image-set(
    url('imagem-1x.jpg') 1x,
    url('imagem-2x.jpg') 2x,
    url('imagem-3x.jpg') 3x
  );
  background-image: image-set(
    url('imagem-1x.jpg') 1x,
    url('imagem-2x.jpg') 2x,
    url('imagem-3x.jpg') 3x
  );
}

É importante usar tanto a versão padrão quanto a versão prefixada com -webkit- para garantir a compatibilidade em todos os navegadores.

Ajustando a Exibição com Consultas de Mídia e object-fit

Você pode utilizar consultas de mídia combinadas com object-fit para exibir corretamente imagens de fundo dentro de tags <img>, mantendo suas proporções:

.img-background {
  object-fit: cover; 
  /* object-fit: contain; também é possível, dependendo das necessidades */
}

Essa abordagem preserva as proporções e permite que a imagem preencha todo o contêiner, similar à propriedade background-size.

Atualizando Imagens de Fundo Dinamicamente com JavaScript

O JavaScript pode ser usado para alterar dinamicamente a imagem de fundo com base no srcset selecionado no elemento <img>:

const img = document.querySelector('img[data-responsive-background]');
img.onload = () => {
  const backgroundElement = document.querySelector('.element');
  backgroundElement.style.backgroundImage = `url(${img.currentSrc})`;
};

Posicionamento para Layouts Responsivos

Para criar layouts responsivos adequadamente, os elementos devem ser posicionados corretamente. Use posicionamento absoluto ou relativo para camadas de fundo:

.image-container {
  position: relative;
}
.image-container .background {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

Essa abordagem permite o ajuste das posições das camadas de imagem em relação ao fundo principal.

Visualização

Diferentes imagens podem ser vistas como ferramentas em um conjunto que deve ser selecionado com base no tamanho da tela:

📱 Tela pequena usa 🖼️ Imagem pequena (background-image: url('imagem-pequena.jpg');)
💻 Tela média seleciona 🖼️ Imagem média (background-image: url('imagem-media.jpg');)
🖥️ Tela grande aplica 🖼️ Imagem grande (background-image: url('imagem-grande.jpg');)

Como o CSS não possui um equivalente exato ao srcset, consultas de mídia são utilizadas:

/* Para telas pequenas */
@media (max-width: 600px) {
  .element { background-image: url('imagem-pequena.jpg'); }
}

/* Para telas médias */
@media (min-width: 601px) and (max-width: 1200px) {
  .element { background-image: url('imagem-media.jpg'); }
}

/* Para telas grandes */
@media (min-width: 1201px) {
  .element { background-image: url('imagem-grande.jpg'); }
}

Estratégias para Supportar Vários Navegadores e Uso de Polyfills

Para garantir a compatibilidade em todos os navegadores, incluindo os desatualizados, polyfills devem ser utilizados:

<!--[if lte IE 9]>
<script src="caminho/para/image-set-polyfill.js"></script>
<![endif]-->

Testando em Diferentes Dispositivos para Garantir Desempenho Estável

Não esqueça de testar a implementação em vários dispositivos e em diferentes navegadores:

  1. Realize testes em hardware real.
  2. Use ferramentas de desenvolvedor para simular várias resoluções de tela.
  3. Compare com tamanhos de tela comuns.

Além disso, certifique-se de que a sintaxe de URL na função url() em CSS esteja correta:

/* Sintaxe correta */
background-image: url('caminho/para/imagem.jpg');

/* Sintaxe incorreta pode causar problemas */
background-image: url(caminho/para/imagem.jpg);

Exemplo do Mundo Real

Aplicar as técnicas descritas na prática pode parecer assim:

/* Usando `image-set` */
.background {
  background-image: -webkit-image-set(
    url('footer-bg-pequeno.jpg') 1x,
    url('footer-bg-grande.jpg') 2x
  );
  background-image: image-set(
    url('footer-bg-pequeno.jpg') 1x,
    url('footer-bg-grande.jpg') 2x
  );
}

/* Consulta de mídia e object-fit para img */
@media (max-width: 768px) {
  .responsive-img {
    width: 100%;
    height: auto;
    object-fit: cover; /* Para manter proporções */
  }
}

/* JavaScript para seleção dinâmica de fundo */
document.addEventListener('DOMContentLoaded', () => {
  const img = document.querySelector('img[data-responsive-background]');
  img.onload = () => {
    document.body.style.backgroundImage = `url(${img.currentSrc})`;
    document.body.style.meme = `Uma multidão de resoluções. Uau, isso é impressionante!`;
  };
});

Recursos Úteis

  1. Consultas de Mídia para Dispositivos Padrão | CSS-Tricks — um guia abrangente para criar designs responsivos.
  2. Usando Gradientes CSS | MDN — um guia sobre como usar gradientes CSS em imagens responsivas.
  3. Regras CSS @media - W3 Schools — regras para aplicar CSS condicionalmente em design responsivo.
  4. Imagens Responsivas: Um Guia para Usar <picture> e srcset — Smashing Magazine — um guia sobre como usar imagens responsivas.
  5. Perguntas sobre CSS - Stack Overflow — discussões e soluções relacionadas a imagens de fundo em CSS.
  6. Módulo de Fundos e Bordas CSS Nível 3 - W3C — documentação oficial sobre como trabalhar com fundos em CSS.
  7. Imagens Responsivas | web.dev — uma visão geral de estratégias e melhores práticas para usar imagens responsivas.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!