Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

The reliable test is to watch network requests during a fresh page load, then scroll toward below-the-fold content. A resource that is absent at first, starts loading as it approaches the viewport, and appears when reached is behaving as expected. Confirm the rendered DOM and, for SEO-sensitive media, Google’s rendered HTML as well. The loading="lazy" attribute alone is not proof: browser thresholds, JavaScript, cache state, errors, and layout can change the result.

What lazy loading should look like

Lazy loading defers non-critical images, videos, or iframes until they are near the visible area. Browsers normally fetch content before it crosses the viewport so it can be ready in time; the exact distance is heuristic and can vary by browser, connection, viewport, and resource type. An iframe may therefore request earlier or later than an image without indicating a bug. web.dev documents this threshold variation for embeds.

A functional pass has three parts:

  • The below-the-fold resource is not unnecessarily requested during the initial load.
  • Its request begins as you approach it, rather than only after a click or other manual action.
  • The image, video, or embed renders when you reach it, without an error or disruptive layout shift.

For content that search engines must index, also verify that the eventual URL is present in rendered HTML. Google’s guidance is at Fix Lazy-Loaded Website Content.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Step 1: Test from a clean browser state

  1. Open the page in a private/incognito window, or clear the relevant browser cache. A warm cache can make a deferred resource appear to load immediately.
  2. Open DevTools (F12 or Ctrl+Shift+I on Windows/Linux, Cmd+Option+I on macOS).
  3. Select the Network panel, enable Preserve log if navigation matters, and reload the page.
  4. Use the request-type filter for Img to inspect images. For embedded documents, inspect Doc requests and search for the iframe URL. Use the Network panel’s disable-cache option while DevTools is open if you want repeatable cold-load runs.
  5. Record the browser, viewport dimensions, device emulation, network throttling, and approximate scroll position. Without those details, two runs can look different even when both are correct.

Step 2: Observe requests before scrolling

Identify below-the-fold candidates

Choose an image or iframe well below the initial viewport. Note its URL or a distinctive filename. Do not use the hero or another element visible immediately when the page opens; those resources are expected to load promptly.

Read the initial request list

After reload, look for the candidate in Network. If it is absent initially, that is evidence that loading was deferred. If it is already present, check whether it was actually below the viewport, whether a script requested it for another reason, and whether a previous cache or preloading rule affected the run. One early request does not by itself prove that lazy loading is broken.

Check timing and status

When a request appears, inspect its status code, transferred size, initiator, and timing. A successful 200 (or a valid cached response) followed by a rendered resource is the useful result. A 404, blocked request, CORS failure, timeout, or content-type error is a loading failure, not a lazy-loading success.

Step 3: Scroll in controlled stages

  1. Scroll a small distance toward the target and pause briefly.
  2. Watch for the image or iframe request to appear. It may start before the element visibly enters the viewport because the browser is preparing ahead of time.
  3. Continue until the element is visible. Confirm that the content appears, not merely that a request was sent.
  4. Repeat for another below-the-fold element. Test a long page because one successful component does not prove every lazy-loading path works.

For embeds, compare the iframe’s document request with the visible frame. Browser implementations use different distance thresholds, so requiring a request at the exact viewport edge is an incorrect pass/fail rule. web.dev’s embed guidance explains why.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Step 4: Verify the rendered DOM

Inspect the actual image or iframe

In the Elements panel, find the target element after it has loaded. Confirm that an image has the intended URL in its src (or that a script has moved a URL from a data attribute into src). For an iframe, verify its src and that the frame’s document request succeeded.

Markup such as <img loading="eager" data-itgw-was-lazy-src="/photo.jpg"> is not enough if JavaScript never copies data-src to src. Conversely, an image can load lazily through an Intersection Observer even without the native attribute. Test behavior and the final DOM, not one implementation detail.

Use Search Console for crawlability

For an indexed page, open Google Search Console, choose URL Inspection, enter the URL, and inspect the rendered page or rendered HTML. Google recommends confirming that image or video URLs appear in the rendered element’s src. This checks what Google can discover, which is separate from what your local browser displayed. Google also cautions that visibility-triggered loading should not depend on a user scrolling or clicking, because Google Search does not interact with the page: official documentation.

Step 5: Check completion for a particular image

The page’s load event is not a complete lazy-loading test. MDN notes that lazy images, iframes, video, and audio can still be unloaded when that event fires: MDN lazy-loading guidance.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

In the DevTools console, select an image in Elements so it is available as $0, then run:

$0.complete

true means the image has finished loading (or failed and finished); it does not guarantee a successful decode. Correlate it with the Network status and the visible result. You can also check natural dimensions:

({ complete: $0.complete, width: $0.naturalWidth, height: $0.naturalHeight, src: $0.currentSrc || $0.src })

A zero natural width or height with a broken visual usually indicates a failed load, an invalid response, or an image that has not decoded yet.

What not to lazy-load

The LCP or hero image

Do not apply lazy loading to the image that forms the page’s Largest Contentful Paint (usually the prominent hero image). web.dev’s LCP guidance states: “Never lazy-load your LCP image, as that will always lead to unnecessary resource load delay, and will have a negative impact on LCP.” Let the browser discover that image immediately and use appropriate dimensions and priority hints.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Content visible on open

Google advises against lazy-loading content likely to be visible when a user opens the page because it can delay the first view: Google Search Central. Reserve lazy loading for genuinely non-critical, below-the-fold media.

Content that requires a user action

Do not make essential text, images, or video appear only after scrolling or clicking. Load them automatically when they become visible so both users and crawlers can access them.

Check layout stability and performance separately

Reserve space

Give images explicit width and height attributes or an aspect-ratio box. Give iframes dimensions and responsive CSS. Without reserved space, the late response can push content downward and create Cumulative Layout Shift. web.dev’s embed recommendations cover iframe sizing and layout stability.

Measure impact, not just requests

Lazy loading can reduce initial work, but the attribute alone does not prove a speed improvement. Compare cold-load and scroll behavior in Chrome DevTools and run Lighthouse. Inspect transfer size, main-thread work, third-party provider cost, LCP, and layout shifts. The web.dev image-performance guidance and embed article explain why third-party media can compete for bandwidth even when deferred.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Question Where to check Pass signal
Was below-fold media deferred? DevTools Network after a cold reload No initial request; request starts near the element
Did it load correctly? Network status plus visible page Successful response and rendered content
Is the final URL discoverable? Elements and Search Console URL Inspection URL appears in rendered src
Did it hurt the first view? Lighthouse, Performance panel LCP remains prompt; no avoidable layout shift

Common failures and fixes

The resource loads immediately

Likely causes: the element is within the browser’s preload threshold, it is above the fold at the tested viewport, a preload or script requested it, or cache was not cleared. Fix: test a resource farther down, disable cache, inspect the request initiator, and compare a private-window run.

The request starts but the element stays blank

Likely causes: a 4xx/5xx response, blocked third-party request, invalid URL, JavaScript error, or an image URL left in a data attribute. Fix: read the Network error, check the Console, verify the final src, and test the asset URL directly.

Content appears only after a click

Cause: user-action-only loading. Fix: trigger loading from visibility (native lazy loading or an Intersection Observer) and ensure required content is available without interaction for crawlers.

The page jumps when media appears

Cause: no reserved dimensions. Fix: add image dimensions or CSS aspect-ratio; set iframe width and height and keep the box stable while it loads.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The page load event seems to say everything is done

Cause: lazy resources are allowed to remain unloaded after load. Fix: observe each resource’s Network request, visual result, and image complete state instead of relying on the page event.

Search Console cannot see an image

Likely causes: the URL exists only in CSS or a data attribute, or it requires scrolling/clicking. Fix: make the final URL appear in rendered img or video src, and load it automatically when visible. Re-run URL Inspection after deployment.

A repeatable test record

For each run, record:

  • URL, date, browser and version, viewport, device emulation, and network profile.
  • Whether cache was disabled or the run used a private window.
  • The target element and its initial distance from the viewport.
  • Request start point, status, transferred size, and initiator.
  • Whether the final DOM contained the URL and whether the content rendered.
  • LCP and layout-shift observations from Lighthouse or the Performance panel.

This makes regressions comparable across releases and browsers instead of relying on a single visual impression.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If you need repeatable screenshots while checking different scroll states or responsive layouts, ScreenshotNeo provides a website screenshot API and MCP server. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be disabled. Only clean shots are billed: bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers identify the page verdict and billing state.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

One GET request returns PNG, JPEG, WebP, or PDF. The API supports full-page capture with lazy images loaded, CSS-selector element capture, device presets or custom viewports, retina scale, dark mode, waits for selectors/delays/network idle, custom JavaScript and CSS, cookies and headers, blocking rules, geolocation and timezone, resizing, caching, signed links, asynchronous webhooks, bulk capture of up to 100 URLs per call, and a usage API. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.

cURL

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

See the ScreenshotNeo API documentation for parameters and response headers. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account to begin.

FAQ

Should a lazy image wait until it touches the viewport?

No. Browsers intentionally request near-viewport resources early so they are ready when scrolled into view. Judge the request against the browser and test conditions, not an exact pixel boundary.

Can I verify lazy loading from page source alone?

No. Source can show an attribute or data URL, but only Network timing, rendered DOM, and the visible result establish that the implementation works.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Does a successful request prove good performance?

No. It proves fetching, not whether the hero image was delayed, bandwidth was saved, or layout remained stable. Measure LCP, transfer size, main-thread work, and layout shifts separately.

Do images loaded by JavaScript count as lazy loading?

Yes, if visibility controls when the request begins and the resource renders correctly. Verify that the script reliably writes the final URL to src and does not depend on a user action.

Frequently Asked Questions

Which browser should I use for the test?

Start with the browser your visitors use most. If cross-browser behavior matters, repeat the same clean-run procedure in each target browser because lazy-loading thresholds and heuristics differ.

How far below the fold should my test element be?

Choose an element clearly outside the initial viewport, then test additional distances. This distinguishes genuine deferral from a resource that was already within the browser’s near-viewport loading range.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.