Carga diferida

Cómo la carga diferida de imágenes e iframes mejora las Core Web Vitals, el atributo loading, los riesgos SEO de cargar de forma diferida el contenido visible sin desplazamiento, y cómo Googlebot renderiza el contenido diferido.

Publicado por primera vez: 2 jul 2026 · Última actualización: 22 ago 2026 · Avanzado
Idiomas

La carga diferida pospone las imágenes e iframes fuera de la pantalla hasta que están a punto de aparecer al hacer scroll, reduciendo el peso inicial de la página y ayudando a las Core Web Vitals. La forma nativa es el atributo loading="lazy" en <img> y <iframe> — sin necesidad de JavaScript. El gran error es cargar de forma diferida la imagen hero/LCP, lo que retrasa la Largest Contentful Paint. Googlebot no hace scroll ni clics, por lo que cualquier cosa oculta tras un evento de scroll o clic puede pasar desapercibida. No es un factor de ranking directo — el efecto se produce a través de las Core Web Vitals y la rastreabilidad. Verifica lo que realmente se renderiza en la herramienta de inspección de URL de Search Console: las URLs de las imágenes deben estar en el atributo src del HTML renderizado.

TL;DR — La carga diferida retrasa imágenes e iframes fuera de pantalla hasta que se acercan al viewport, reduciendo el peso inicial de la página (ayuda al LCP) y el trabajo inicial del hilo principal (ayuda al INP). El atributo nativo loading="lazy" en <img>/<iframe> ha reemplazado a la mayoría de las bibliotecas de JavaScript; solo lazy y eager son valores significativos (auto está obsoleto). Los errores perjudiciales: aplicar carga diferida a la imagen LCP/por encima del pliegue (retrasa la misma métrica que persigues), y ocultar contenido detrás de desplazamiento/clic — lo cual Googlebot nunca activa porque no interactúa con la página. No es un factor de clasificación directo; el efecto se transmite a través de Core Web Vitals y la rastreabilidad. Verifica en la herramienta Inspección de URLs de Search Console que las URLs de las imágenes estén en el atributo src del HTML renderizado.

Qué hace realmente la carga diferida

La idea es simple: solo cargar recursos cuando los necesitas, en lugar de cargar todo a la vez. En una página con muchos medios, descargar cada imagen y elemento incrustado de antemano mantiene al navegador ocupado obteniendo cosas que el visitante quizás nunca se desplace a ver — quemando ancho de banda, memoria y batería para nada. Retrasar los que están fuera de pantalla permite que el contenido por encima del pliegue se pinte antes. Martin Splitt hizo exactamente este punto en el episodio de Search Off the Record «Desmitificando la carga diferida»: el objetivo es evitar trabajo que no produce nada, porque las imágenes no críticas que la página podría prescindir solo mantienen ocupado al navegador.

Esto se conecta con las Core Web Vitals que la mayoría persigue. Menos bytes compitiendo por la red desde el principio significa que el elemento de Largest Contentful Paint puede renderizarse antes. Para los iframes — anuncios, widgets sociales, secciones de comentarios, mapas — diferirlos también reduce el trabajo del hilo principal durante el inicio, lo cual es una victoria para Interaction to Next Paint, no solo para LCP. La propia guía de web.dev de Google presenta los iframes con carga diferida como una mejora de INP durante la carga de la página.

Carga diferida nativa vs. impulsada por JavaScript

Hace unos años, los navegadores ganaron un atributo nativo loading para imágenes e iframes, así que puedes delegar todo el trabajo al navegador en lugar de configurar una API de JavaScript. En mi guía de SEO para JavaScript en Ahrefs hago la misma observación: desde que escribí ese artículo por primera vez, la carga diferida ha pasado mayormente de estar impulsada por JavaScript a ser manejada por los navegadores. Todavía te encontrarás con configuraciones impulsadas por JS, y para imágenes suelen estar bien — lo que compruebo es si el contenido real (no solo imágenes) se está cargando de forma diferida, porque esas configuraciones son las que han causado que el contenido no se recoja correctamente.

La versión 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>

Siempre establece width/height explícitos (o una relación de aspecto) en las imágenes con carga diferida para que el navegador reserve el espacio antes de que la imagen se cargue — ese es el mayor riesgo de cambio de diseño con imágenes diferidas. Las dimensiones reservadas no son una garantía absoluta de CLS, sin embargo: si el diseño circundante o un recorte responsivo aún cambian después de que la imagen se cargue, todavía puedes ver un cambio, así que confirma con un seguimiento real de cambio de diseño en lugar de asumir que las dimensiones fijas por sí solas lo resuelven.

La carga diferida y los iframes necesitan una distinción más: loading="lazy" en un <iframe> solo difiere cuándo ocurren la obtención y la creación del embed. No establece su title, comportamiento de enfoque, sandbox, política de allow/permisos, referrerpolicy, manejo de consentimiento o dimensiones por ti — esos aún necesitan su propia atención, y un embed puede seguir haciendo trabajo (scripts, píxeles de seguimiento, diseño) una vez que se vuelve elegible para cargar. Y no asumas que “debajo del pliegue” se comporta igual en todas partes: el contenido con display: none, diapositivas de carrusel fuera de pantalla, elementos transformados y contenedores de desplazamiento anidados pueden intersectar el viewport de manera diferente que un elemento simple debajo del pliegue, así que prueba el diseño real y los controles de navegación en lugar de asumir equivalencia.

Los valores del atributo loading

Solo dos valores importan hoy:

  • loading="lazy" — difiere el recurso hasta que esté cerca del viewport.
  • loading="eager" — cárgalo inmediatamente, el comportamiento predeterminado. Úsalo para ser explícito sobre las imágenes por encima del pliegue.
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

Puedes ver loading="auto" en artículos más antiguos — está obsoleto en Chrome, así que no lo uses. No hay necesidad; omitir el atributo ya te da el comportamiento predeterminado (eager).

¿Qué tan cerca es “cerca”? loading="lazy" es una sugerencia, no una garantía controlada por el autor — la especificación deja la decisión real de cerca del viewport al navegador. Chromium intenta obtener un recurso diferido lo suficientemente temprano para que esté listo cuando te desplaces hasta él, y la distancia de activación varía según el navegador, la velocidad de conexión y el tipo de recurso; no es un valor de píxel fijo en el que puedas confiar o reproducir entre navegadores o versiones. No publiques — ni confíes en — un número específico de “carga N píxeles antes del viewport”; trata la ventana de cerca del viewport como definida por la implementación y confirma el comportamiento real con un seguimiento de red en el navegador/conexión que te importa en lugar de asumir una constante.

La carga diferida nativa también funciona bien con imágenes responsivas: se aplica a la selección normal de src y srcset/sizes, por lo que no pierdes el comportamiento de imagen responsiva al añadir loading="lazy". Si en su lugar ocultas la URL real solo en un atributo data-* para que un script la intercambie más tarde, la carga ahora depende de ese script: prueba el HTML renderizado y qué sucede si el script falla (más sobre esto en las pestañas Scripts y Solución 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

El error número 1: cargar de forma diferida la imagen LCP / la imagen visible sin desplazamiento

Este es el fallo que veo con más frecuencia, y todas las fuentes coinciden en ello. Si cargas de forma diferida la imagen principal (hero) —o cualquier imagen que probablemente sea el elemento LCP—, le has dicho al navegador que espere por el píxel más importante para la velocidad de carga percibida. El navegador tampoco puede cargar de forma diferida una imagen hasta que sabe dónde se ubicará en la página, por lo que las imágenes diferidas visibles sin desplazamiento tienden a cargarse más lentamente que las que se cargan de inmediato. Eso retrasa directamente el Largest Contentful Paint, la métrica que Google dice que debería resolverse dentro de los primeros 2,5 segundos de carga.

Do not lazy-load the observed or likely LCP image; confirm the actual request and paint timing in a trace. Fuente: 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 expresó claramente la otra cara en el episodio de SOTR: si no estás usando la carga diferida donde deberías, eso probablemente perjudicará algún aspecto de Core Web Vitals —muy probablemente el LCP—. Así que tiene un doble filo. La regla:

  • Candidato probable u observado a LCP → carga inmediata (omite loading="lazy", o establece eager). Considera fetchpriority="high" en la imagen LCP.
  • Debajo del pliegue → loading="lazy".

No todas las imágenes visibles sin desplazamiento son el candidato a LCP: identifica la real (un trace de Performance o PageSpeed Insights la nombrará) y verifica su tiempo de solicitud en lugar de tratar todas las imágenes de la primera pantalla por igual. Y estas son pistas separadas, no una sola configuración: loading="eager" (u omitir loading) solo significa que el navegador no diferirá el descubrimiento del recurso —no eleva por sí mismo la prioridad de búsqueda—. fetchpriority es una pista distinta y consultiva además de eso. Apilar un <link rel="preload"> con loading="lazy" en el mismo recurso envía al navegador una intención conflictiva, así que verifica el waterfall de red real en lugar de asumir que la combinación hace lo que esperas.

El anti-patrón general es activar la carga diferida para todas las imágenes del sitio —un valor predeterminado común en los CMS—. Como señaló Splitt, si cada imagen se carga de forma diferida, entonces las imágenes que son (o deberían ser) visibles de inmediato también se cargan de forma diferida, que es exactamente el caso que quieres evitar.

Cómo renderiza Googlebot el contenido con carga diferida

Esta es la realidad del rastreo que confunde a la gente: Googlebot no se desplaza y no hace clic. Renderiza tu página con un navegador sin interfaz, pero no simula que un usuario interactúe con ella. Google lo afirma directamente: sus métodos recomendados de carga diferida deliberadamente no dependen de acciones del usuario como desplazarse o hacer clic, porque Google Search no interactúa con tu 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 eso el cómo de tu implementación importa. El documento de Google enumera tres implementaciones que considera seguras: la carga diferida integrada del navegador para imágenes e iframes, la API IntersectionObserver (con un polyfill) o una biblioteca de JavaScript que carga datos a medida que entran en el viewport. Las tres se basan en la intersección con el viewport —no en un evento de desplazamiento o clic que Googlebot nunca disparará—.

El patrón de alto riesgo es una biblioteca de lazy loading de JS personalizada o de terceros. Si la biblioteca se comporta mal y la URL de la imagen nunca llega al atributo src, Google simplemente no recogerá esa imagen — Splitt describió exactamente este modo de fallo en el episodio de SOTR. No hay nada que indexar si la URL no está ahí. Esto es lo mismo que señalo en mi guía de SEO para JavaScript: el lazy loading de imágenes suele estar bien, pero el contenido cargado de forma diferida es donde se cuelan los problemas de indexación, y la solución es comprobar qué renderiza realmente Google.

El scroll infinito es un problema diferente

No confundas el lazy loading básico de imágenes/iframes con el scroll infinito o la carga paginada. Diferir imágenes es una cosa; cargar nuevos fragmentos de contenido mientras el usuario se desplaza es otra, y necesita su propia arquitectura. La guía de Google: dale a cada fragmento una URL persistente y única, mantén el contenido estable por URL (usa números de página absolutos como ?page=12, no valores relativos como ?date=yesterday), y actualiza la URL mostrada con la API History a medida que cada fragmento se convierte en el contenido visible principal para que pueda actualizarse, compartirse y enlazarse. Si omites eso, el contenido más profundo detrás de un scroll infinito puede que nunca se rastree o indexe de forma fiable.

Cómo probarlo

La ruta de verificación es la misma en el documento de Google y en mi propia metodología: usa la Herramienta de inspección de URLs de Search Console y mira el HTML renderizado. Si tus URLs de imágenes (o vídeos) aparecen en el atributo src de los elementos <img>/<video> en ese HTML renderizado, tu configuración funciona. Google lo dice claramente — comprueba el HTML renderizado para asegurarte de que tu contenido está en él: “Check the rendered HTML to make sure your content is in the rendered HTML” (traducción) «Comprueba el HTML renderizado para asegurarte de que tu contenido está en el HTML renderizado». Si la URL falta en src, ese es tu problema, y normalmente apunta a un disparador de scroll/clic o a una biblioteca rota.

Para una cuadrícula de productos con lazy loading, ve más allá de esta comprobación de presencia. Ejecuta la matriz de pruebas de SEO para scroll infinito con viewports estándar y altos, navegación nueva y redimensionado tras la carga, ejecuciones sin acción y con scroll incremental, recuentos de enlaces de producto únicos e inspección del árbol de accesibilidad. Redimensionar una página inicializada no equivale a navegar con el tamaño de viewport final porque los observadores y los cálculos por lotes pueden registrarse solo durante el inicio. 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

También puedes apoyarte en tus herramientas de rendimiento web: PageSpeed Insights señala las imágenes fuera de pantalla que deberías diferir. En mi guía de PageSpeed Insights en Ahrefs señalo que la auditoría de “diferir elementos fuera de pantalla” te dice que apliques lazy loading a las imágenes — una forma práctica de conectar el diagnóstico que ya ejecutas con la solución.

Honestidad sobre la señal de ranking

Sé claro sobre qué es y qué no es el lazy loading. Usarlo no es un factor de ranking directo, y no usarlo no es una penalización. La conexión con el ranking es indirecta: pasa a través de Core Web Vitals (principalmente LCP, a veces INP para iframes) y a través de la rastreabilidad, si una mala implementación oculta contenido. Splitt caracterizó el efecto en el ranking a través de Core Web Vitals como un factor diminuto y mínimo en la mayoría de los casos. Así que optimiza el lazy loading para la experiencia de carga de tus usuarios y para una indexación limpia — no porque esperes un aumento de ranking por el atributo en sí.

Dónde encaja

El lazy loading es una palanca más en el conjunto de herramientas más amplio de rendimiento web. Se combina con sugerencias de recursos (preload/preconnect para los recursos que quieres temprano), la estrategia de carga de fuentes, el almacenamiento en caché y una CDN — y se evalúa, en última instancia, a través de Core Web Vitals. Si aciertas con la división entre lo que está por encima y por debajo del pliegue, es una de las victorias más baratas disponibles.

Add an expert note

Pin an expert quote

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