Carrega imagens só quando estão perto de entrar na tela.
Economiza banda e acelera o carregamento inicial da página — imagens fora da tela só baixam quando o usuário está prestes a rolar até elas.
Um IntersectionObserver compartilhado (com rootMargin: 200px, carrega um pouco antes de aparecer) observa todas as img[sw-lazy]. Ao entrar na margem, carrega a imagem real numa Image() de teste antes de trocar o src — evita mostrar um estado quebrado se a URL falhar.
O placeholder já nasce com a mesma proporção da imagem real (width/height + aspect-ratio) — o espaço reservado não muda quando a imagem de verdade chega, zero salto de layout (CLS).
<!-- width/height reais da imagem (proporção correta) + placeholder do mesmo tamanho.
sw-lazy-wrap é opcional: só necessário se você quiser o spinner de carregamento
(img sozinho não aceita ::after, por isso o spinner vive no wrapper). -->
<div sw-lazy-wrap class="minha-imagem-wrap">
<img sw-lazy
sw-lazy-src="fabric-chrome.webp"
src="placeholder-leve.svg"
width="1122" height="1402"
class="minha-imagem">
</div>
<!-- CSS — nunca style="" inline, sempre uma classe -->
<style>
.minha-imagem { width: 100%; max-width: 22.5rem; aspect-ratio: 1122 / 1402; object-fit: cover; }
</style>
Lazy Load atrasa o carregamento (bom pra imagem longe da dobra). Quando é o contrário — uma imagem que vai aparecer em 1 segundo (próximo slide, próxima etapa de um wizard) — o certo é pré-carregar antes, pra ela já estar pronta na hora. Isso é o módulo Pré-carregamento, companheiro do Lazy Load:
// Pré-carrega 1 imagem antes de precisar dela
const img = await SWMotion.preloadImage('proximo-slide.webp');
container.appendChild(img); // já decodificada, aparece em 0ms
// Pré-carrega um lote inteiro, com progresso
SWMotion.preloadImages(
['foto1.webp', 'foto2.webp', 'foto3.webp'],
(carregadas, total) => console.log(carregadas + '/' + total)
);
Regra prática: imagem longe da dobra → sw-lazy (este componente). Imagem que vai aparecer em breve (próximo passo, próximo slide) → SWMotion.preloadImage(). Nunca as duas juntas na mesma imagem — são estratégias opostas.
sw-lazy-srcsrc inicial pode ser um placeholder leve)Nenhum.
sw:lazy:loadedsw:lazy:errorNenhum.
Nenhuma.
Nenhuma.