Uma das otimizações de desempenho de site mais rápidas e fáceis é diminuir o carregamento de imagens. Isso significa uma variedade de coisas, incluindo a redução de imagens com ferramentas como ImageOptim e TinyPNG, o uso de URIs de dados e sprites e o carregamento lento de imagens. É um pouco chocante quando o senhor está carregando imagens de forma preguiçosa e elas aparecem do nada, e é por isso que adoro a rota de fading in. A página ainda fica embaralhada se o senhor não estiver definindo explicitamente as dimensões da imagem, mas o fade in oferece um pouco de classe. Já vi muitas soluções que fazem isso (algumas não muito boas, como o meu método antigo), então pensei em compartilhar minha implementação atual.




O HTML


Começaremos montando a tag de imagem com detalhes específicos:



<img data-src="https://davidwalsh.name/path/to/image.jpg" alt="">


Use data-src para representar o eventual URL.


O CSS


Qualquer imagem com um data-src deve começar como invisível e, eventualmente, fazer a transição da opacidade:



img {
	opacity: 1;
	transition: opacity 0.3s;
}

img[data-src] {
	opacity: 0;
}


A esta altura, o senhor provavelmente pode adivinhar o que faremos com esse atributo quando uma imagem for carregada…


O JavaScript


…que está removendo o data-src quando a imagem é carregada:



[].forEach.call(document.querySelectorAll('img[data-src]'), function(img) {
	img.setAttribute('src', img.getAttribute('data-src'));
	img.onload = function() {
		img.removeAttribute('data-src');
	};
});


Essa solução requer JavaScript, como alguns dos senhores apontaram. Para uma solução alternativa, o senhor poderia fazer o seguinte:



<noscript data-src="https://davidwalsh.name/path/to/image.jpg">
<img src="https://davidwalsh.name/path/to/image.jpg" data-src="" alt="">
</noscript>



[].forEach.call(document.querySelectorAll('noscript'), function(noscript) {
	var img = new Image();
	img.setAttribute('data-src', '');
	img.parentNode.insertBefore(img, noscript);
	img.onload = function() {
		img.removeAttribute('data-src');
	};
	img.src = noscript.getAttribute('data-src');
});




Este é um tutorial superbásico, mas, considerando que já vi muitas outras soluções, pensei em compartilhar o que implementei; ele funciona em todos os cenários que testei, incluindo alterações no histórico por meio de AJAX (como meu site faz).


É claro que isso não leva em conta o verdadeiro carregamento preguiçoso baseado em rolagem, mas isso geralmente é feito por um plug-in em sua estrutura JavaScript favorita ou por um componente autônomo. No entanto, se o senhor estiver procurando uma solução simples, esta é a solução!