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!