A <picture>
tag HTML5 ajudará você a resolver a fonte de imagem correta, dependendo da largura da tela
Aparentemente, o comportamento dos navegadores não mudou muito nos últimos 5 anos e muitos ainda baixariam as imagens ocultas, mesmo que houvesse uma display: none
propriedade definida nelas.
Mesmo que haja uma solução alternativa para consultas de mídia , ela só poderia ser útil quando a imagem foi definida como plano de fundo no CSS.
Enquanto eu pensava que havia apenas uma solução JS para o problema ( carregamento lento , preenchimento de fotos etc.), parecia que havia uma boa solução HTML pura que sai da caixa com o HTML5.
E essa é a <picture>
etiqueta.
Veja como o MDN o descreve:
O elemento HTML<picture>
é um contêiner usado para especificar vários <source>
elementos para um específico <img>
contido nele. O navegador escolherá a fonte mais adequada de acordo com o layout atual da página (as restrições da caixa em que a imagem aparecerá) e o dispositivo em que será exibido (por exemplo, um dispositivo normal ou hiDPI).
E aqui está como usá-lo:
<picture>
<source srcset="mdn-logo-wide.png" media="(min-width: 600px)">
<img src="mdn-logo-narrow.png" alt="MDN">
</picture>
A lógica por trás
O navegador carregaria a fonte da img
tag, apenas se nenhuma regra de mídia se aplicar. Quando o <picture>
elemento não é suportado pelo navegador, ele volta a mostrar a img
tag.
Normalmente, você colocaria a menor imagem como fonte <img>
e, portanto, não carregaria as imagens pesadas para telas maiores. Vice-versa, se uma regra de mídia se aplicar, a fonte do <img>
não será baixada; em vez disso, fará o download do conteúdo do URL da <source>
tag correspondente .
A única armadilha aqui é que, se o elemento não for suportado pelo navegador, ele carregará apenas a imagem pequena. Por outro lado, em 2017, devemos pensar e codificar na primeira abordagem móvel .
E antes que alguém saísse muito, aqui está o suporte atual do navegador para <picture>
:
Navegadores de desktop
Navegadores para celular
Mais sobre o suporte ao navegador, você pode encontrar em Posso usar .
O bom é que a frase do html5please é usá-lo com um fallback . E eu pessoalmente pretendo seguir o conselho deles.
Mais sobre a tag que você pode encontrar na especificação do W3C . Existe um aviso, que eu acho importante mencionar:
O picture
elemento é um pouco diferente dos elementos video
e aparência semelhantes audio
. Embora todos eles contenham source
elementos, o src
atributo do elemento de origem não tem significado quando o elemento está aninhado em um picture
elemento e o algoritmo de seleção de recurso é diferente. Além disso, o picture
próprio elemento não exibe nada; apenas fornece um contexto para seu img
elemento contido que permite escolher entre vários URLs.
Então, o que diz é que ele apenas ajuda a melhorar o desempenho ao carregar uma imagem, fornecendo algum contexto para ela.
E você ainda pode usar um pouco de magia CSS para ocultar a imagem em pequenos dispositivos:
<style>
picture { display: none; }
@media (min-width: 600px) {
picture {
display: block;
}
}
</style>
<picture>
<source srcset="the-real-image-source" media="(min-width: 600px)">
<img src="a-1x1-pixel-image-that-will-be-hidden-in-the-css" alt="MDN">
</picture>
Portanto, o navegador não exibirá a imagem real e fará o download apenas da 1x1
imagem em pixel (que pode ser armazenada em cache se você a usar mais de uma vez). No entanto, esteja ciente de que, se a <picture>
tag não for suportada pelo navegador, mesmo nas telas do descktop, a imagem real não será exibida (portanto, você definitivamente precisará de um backup de polyfill).