Carregamento Preguiçoso

Como o carregamento preguiçoso de imagens e iframes melhora o Core Web Vitals, o atributo loading, os riscos de SEO de carregar conteúdo acima da dobra de forma preguiçosa, e como o Googlebot renderiza conteúdo adiado.

Publicado pela primeira vez: 2 de jul. de 2026 · Última atualização: 11 de ago. de 2026 · Avançado
Idiomas

O carregamento preguiçoso adia imagens e iframes fora da tela até que estejam prestes a entrar na visualização, reduzindo o peso inicial da página e ajudando o Core Web Vitals. A forma nativa é o atributo loading="lazy" em <img> e <iframe> — sem necessidade de JavaScript. O grande erro é carregar preguiçosamente a imagem hero/LCP, o que atrasa a Maior Pintura com Conteúdo. O Googlebot não rola nem clica, então qualquer coisa atrás de um evento de rolagem ou clique pode passar despercebida. Não é um fator de ranqueamento direto — o efeito ocorre através do Core Web Vitals e da rastreabilidade. Verifique o que realmente é renderizado na Ferramenta de Inspeção de URL do Search Console: as URLs das imagens devem estar no atributo src do HTML renderizado.

TL;DR — Lazy loading adia imagens e iframes fora da tela até que se aproximem do viewport, reduzindo o peso inicial da página (ajuda o LCP) e o trabalho inicial na thread principal (ajuda o INP). O atributo nativo loading="lazy" em <img>/<iframe> tem substituído a maioria das bibliotecas JS; apenas lazy e eager são valores significativos (auto está obsoleto). Os erros prejudiciais: usar lazy loading na imagem LCP/acima da dobra (atrasa exatamente a métrica que você está buscando) e esconder conteúdo atrás de rolagem/clique — o que o Googlebot nunca aciona porque ele não interage com a página. Não é um fator de ranqueamento direto; o efeito passa pelo Core Web Vitals e pela rastreabilidade. Verifique na Ferramenta de Inspeção de URLs do Search Console se os URLs das imagens estão no atributo src do HTML renderizado.

O que lazy loading realmente faz

A ideia é simples: carregue recursos apenas quando precisar deles, em vez de carregar tudo de uma vez. Em uma página com muitos recursos de mídia, baixar cada imagem e embed antecipadamente mantém o navegador ocupado buscando coisas que o visitante pode nunca rolar para ver — gastando banda, memória e bateria à toa. Adiar os que estão fora da tela permite que o conteúdo acima da dobra seja pintado mais cedo. Martin Splitt fez exatamente esse ponto no episódio “Carregamento preguiçoso desmistificado” do podcast oficial do Google: o objetivo é evitar trabalho que não traz resultado, porque imagens não críticas que a página poderia dispensar apenas mantêm o navegador ocupado.

Isso se conecta aos Core Web Vitals que a maioria das pessoas busca. Menos bytes competindo pela rede no início significa que o elemento Largest Contentful Paint pode renderizar mais cedo. Para iframes — anúncios, widgets sociais, seções de comentários, mapas — adiá-los também reduz o trabalho na thread principal durante a inicialização, o que é uma vitória para Interaction to Next Paint, não apenas para LCP. A própria orientação do web.dev do Google apresenta iframes com carregamento preguiçoso como uma melhoria de INP durante o carregamento da página.

Carregamento preguiçoso nativo vs. orientado por JavaScript

Há alguns anos, os navegadores ganharam um atributo nativo loading para imagens e iframes, então você pode entregar todo o trabalho ao navegador em vez de configurar uma API JavaScript. Em meu guia de SEO JavaScript na Ahrefs faço a mesma observação: desde que escrevi esse artigo, o carregamento preguiçoso passou em grande parte de ser orientado por JavaScript para ser tratado pelos navegadores. Você ainda encontrará configurações orientadas por JS, e para imagens elas geralmente são boas — a coisa que verifico é se o conteúdo real (não apenas imagens) está sendo carregado preguiçosamente, porque essas configurações são as que causaram problemas de conteúdo não ser capturado corretamente.

A versão nativa:

<!-- Below-the-fold image: defer it -->
<img src="gallery-07.jpg" loading="lazy" width="800" height="600" alt="…">

<!-- Off-screen embed: defer it -->
<iframe src="https://www.youtube.com/embed/…" loading="lazy" title="…"></iframe>

Sempre defina width/height explícitos (ou uma proporção de aspecto) em imagens preguiçosas para que o navegador reserve o espaço antes de a imagem carregar — esse é o maior risco de mudança de layout com imagens adiadas. Dimensões reservadas não são uma garantia absoluta de CLS, no entanto: se o layout ao redor ou um corte responsivo ainda mudar depois que a imagem carregar, você ainda pode ver uma mudança, então confirme com um rastreamento real de mudança de layout em vez de assumir que dimensões fixas sozinhas resolvem isso.

Carregamento preguiçoso e iframes precisam de mais uma distinção: loading="lazy" em um <iframe> apenas adia quando a busca e a criação do embed acontecem. Não define seu title, comportamento de foco, sandbox, allow/política de permissões, referrerpolicy, tratamento de consentimento ou dimensões para você — esses ainda precisam de atenção própria, e um embed pode continuar fazendo trabalho (scripts, pixels de rastreamento, layout) uma vez que se torna elegível para carregar. E não assuma que “abaixo da dobra” se comporta igual em todos os lugares: conteúdo com display: none, slides de carrossel fora da tela, elementos transformados e contêineres de rolagem aninhados podem intersectar o viewport de forma diferente de um elemento simples abaixo da dobra, então teste o layout real e os controles de navegação em vez de assumir equivalência.

Os valores do atributo loading

Apenas dois valores importam hoje:

  • loading="lazy" — adie o recurso até que esteja perto do viewport.
  • loading="eager" — carregue imediatamente, o comportamento padrão. Use-o para ser explícito sobre imagens acima da dobra.
Evidence for this claim The native loading attribute supports lazy loading for images and iframes without a JavaScript lazy-loading library. Scope: Browser-level lazy loading behavior; browser heuristics decide the fetch distance. Confidence: high · Verified: web.dev: Browser-level image lazy loading

Você pode ver loading="auto" em artigos mais antigos — está obsoleto no Chrome, então não use. Não há necessidade; omitir o atributo já lhe dá o comportamento padrão (eager).

Quão perto é “perto”? loading="lazy" é uma dica, não uma garantia controlada pelo autor — a especificação deixa a decisão real de proximidade do viewport para o navegador. O Chromium tenta buscar um recurso preguiçoso cedo o suficiente para que esteja pronto quando você rolar até ele, e a distância de acionamento varia por navegador, velocidade de conexão e tipo de recurso; não é um valor fixo em pixels que você pode confiar ou reproduzir entre navegadores ou versões. Não publique — nem confie — em um número específico de “carrega N pixels antes do viewport”; trate a janela de proximidade do viewport como definida pela implementação e confirme o comportamento real com um rastreamento de rede no navegador/conexão que você se importa, em vez de assumir uma constante.

O lazy loading nativo também funciona bem com imagens responsivas: ele se aplica à seleção normal de src e srcset/sizes, então você não perde o comportamento de imagem responsiva ao adicionar loading="lazy". Se, em vez disso, você esconder a URL real apenas em um atributo data-* para um script trocar depois, o carregamento passa a depender desse script — teste o HTML renderizado e o que acontece se o script falhar (mais sobre isso nas abas Scripts e Solução de problemas).

Evidence for this claim Native lazy loading works with ordinary src and responsive srcset/sizes selection; hiding the real URL only in data-* attributes makes loading dependent on script and should be tested in rendered HTML and under script failure. Scope: responsive image fetching and layout Confidence: high · Verified: HTML Standard: img

O erro nº 1: aplicar lazy loading ao LCP / imagem acima da dobra

Este é o erro que vejo com mais frequência, e todas as fontes concordam. Se você aplicar lazy loading à imagem hero — ou a qualquer imagem que provavelmente seja o elemento LCP — você está dizendo ao navegador para esperar pelo pixel mais importante para a velocidade de carregamento percebida. O navegador também não consegue aplicar lazy loading a uma imagem até saber onde ela ficará na página, então imagens acima da dobra com lazy loading tendem a carregar mais lentamente do que as sem lazy loading. Isso atrasa diretamente o Largest Contentful Paint, a métrica que o Google diz que deve ser resolvida nos primeiros 2,5 segundos de carregamento.

Do not lazy-load the observed or likely LCP image; confirm the actual request and paint timing in a trace. Fonte: Lazy Loading

The eager path discovers the likely LCP image in HTML and starts its request promptly. The lazy path waits for browser loading heuristics before request start. The comparison uses no fixed timing values and notes that actual LCP must be measured.

© Patrick Stox LLC · CC BY 4.0 ·

Splitt colocou o outro lado claramente no episódio do SOTR: se você não está usando lazy loading onde deveria, isso provavelmente prejudicará algum aspecto do Core Web Vitals — muito provavelmente o LCP. Então é uma faca de dois gumes. A regra:

  • Candidato provável ou observado a LCP → carregue com eager (omitindo loading="lazy", ou defina eager). Considere fetchpriority="high" na imagem LCP.
  • Abaixo da dobra → loading="lazy".

Nem toda imagem acima da dobra é o candidato a LCP — identifique o real (um trace de Performance ou o PageSpeed Insights vai nomeá-lo) e verifique o tempo de requisição dele em vez de tratar todas as imagens da primeira tela da mesma forma. E esses são hints separados, não uma configuração única: loading="eager" (ou omitir loading) só significa que o navegador não vai adiar a descoberta do recurso — isso não aumenta a prioridade de fetch por si só. fetchpriority é um hint distinto e consultivo por cima disso. Empilhar um <link rel="preload"> com loading="lazy" no mesmo recurso envia ao navegador intenções conflitantes, então verifique o waterfall real da rede em vez de assumir que a combinação faz o que você espera.

O anti-padrão geral é ativar o lazy loading para todas as imagens do site — um padrão comum em CMS. Como Splitt observou, se todas as imagens têm lazy loading, então imagens que estão (ou deveriam estar) imediatamente visíveis também têm, que é exatamente o caso que você quer evitar.

Como o Googlebot renderiza conteúdo com lazy loading

Aqui está a realidade do rastreamento que confunde as pessoas: o Googlebot não rola a página e não clica. Ele renderiza sua página com um navegador headless, mas não simula um usuário interagindo com ela. O Google afirma isso diretamente — seus métodos recomendados de lazy loading deliberadamente não dependem de ações do usuário como rolar ou clicar, porque o Google Search não interage com sua página.

Evidence for this claim Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Scope: Google Search guidance for JavaScript-driven lazy loading. Confidence: high · Verified: Google Search Central: Lazy-load content

É por isso que o como da sua implementação importa. O documento do Google lista três implementações que considera seguras: o lazy loading nativo do navegador para imagens e iframes, a API IntersectionObserver (com um polyfill) ou uma biblioteca JavaScript que carrega dados conforme eles entram no viewport. Todas as três dependem da interseção com o viewport — não de um evento de rolagem ou clique que o Googlebot nunca vai disparar.

O padrão de alto risco é uma biblioteca de lazy loading em JS personalizada ou de terceiros. Se a biblioteca se comportar mal e o URL da imagem nunca chegar ao atributo src, o Google simplesmente não vai captar essa imagem — Splitt descreveu exatamente esse modo de falha no episódio do SOTR. Não há nada para indexar se o URL não estiver lá. Isso é a mesma coisa que eu sinalizo em meu guia de SEO para JavaScript: lazy loading de imagens normalmente é tranquilo, mas conteúdo carregado com lazy loading é onde os problemas de indexação aparecem, e a solução é verificar o que o Google realmente renderiza.

Rolagem infinita é um problema diferente

Não confunda lazy loading básico de imagens/iframes com rolagem infinita ou carregamento paginado. Adiar imagens é uma coisa; carregar novos pedaços de conteúdo conforme o usuário rola é outra, e isso exige uma arquitetura própria. A orientação do Google: dê a cada pedaço um URL persistente e único, mantenha o conteúdo estável por URL (use números de página absolutos como ?page=12, não valores relativos como ?date=yesterday) e atualize o URL exibido com a History API conforme cada pedaço se torna o conteúdo visível principal para que possa ser atualizado, compartilhado e linkado. Pule isso e o conteúdo mais profundo por trás de uma rolagem infinita pode nunca ser rastreado ou indexado de forma confiável.

Como testar

O caminho de verificação é o mesmo no documento do Google e na minha própria metodologia: use a Ferramenta de Inspeção de URL do Search Console e observe o HTML renderizado. Se os URLs das suas imagens (ou vídeos) aparecerem no atributo src nos elementos <img>/<video> desse HTML renderizado, sua configuração funciona. O Google diz isso claramente — verifique o HTML renderizado para garantir que seu conteúdo está nele. A formulação exata da fonte é “check the rendered HTML to make sure your content is in it” (tradução) «verifique o HTML renderizado para garantir que seu conteúdo está nele». Se o URL estiver ausente do src, esse é o seu problema, e geralmente aponta para um gatilho de rolagem/clique ou uma biblioteca quebrada.

Para uma grade de produtos com lazy loading, vá além dessa verificação de presença. Execute a matriz de testes de SEO para rolagem infinita com viewports padrão e altas, navegação nova e redimensionamento pós-carregamento, execuções sem ação e com rolagem incremental, contagens de links de produtos únicos e inspeção da árvore de acessibilidade. Redimensionar uma página inicializada não é equivalente a navegar no tamanho final do viewport porque observadores e cálculos em lote podem ser registrados apenas durante a inicialização. Evidence for this claim Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Scope: Google Search guidance for JavaScript-driven lazy loading. Confidence: high · Verified: Google Search Central: Lazy-load content

Você também pode contar com suas ferramentas de performance web: o PageSpeed Insights sinaliza imagens fora da tela que você deveria adiar. Em meu guia de PageSpeed Insights na Ahrefs eu observo que a auditoria “adiar elementos fora da tela” está dizendo para você aplicar lazy loading em imagens — uma forma prática de conectar o diagnóstico que você já executa à solução.

Transparência sobre sinais de ranqueamento

Seja claro sobre o que lazy loading é e não é. Usá-lo não é um fator de ranqueamento direto, e não usá-lo não é uma penalidade. A conexão com o ranqueamento é indireta: ela passa pelos Core Web Vitals (principalmente LCP, às vezes INP para iframes) e pela capacidade de rastreamento, se uma implementação ruim esconder conteúdo. Splitt caracterizou o efeito no ranqueamento através dos Core Web Vitals como um fator minúsculo e ínfimo na maioria dos casos. Então otimize o lazy loading para a experiência de carregamento dos seus usuários e para uma indexação limpa — não porque você espera um aumento de ranqueamento do atributo em si.

Onde isso se encaixa

Lazy loading é uma alavanca no conjunto mais amplo de performance web. Ele combina com resource hints (preload/preconnect para os recursos que você quer antecipadamente), estratégia de carregamento de fontes, cache e uma CDN — e é avaliado, em última análise, por meio dos Core Web Vitals. Acertar a divisão acima-da-dobra/abaixo-da-dobra e é uma das vitórias mais baratas disponíveis.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.