Shopify LCP image loading and the Core Web Vitals

No loading attribute, loading="lazy", or loading="eager" on the LCP image: how many sites use each, where the 11 ms lazy-load delay shows up, and whether fetchpriority="high" overrides it.

Field data PhoneDesktopAll Scope All sites October 2026 edition · Phone field outcomes · Shopify sites only
Shopify Scoped to 8,248 sites out of 203,892 analyzed (cms) Compare with all sites →

Of the Shopify sites whose LCP element is an <img>, 31.2% put loading="lazy" on that image. 46.0% leave loading at the browser default and 22.8% set loading="eager". Across Shopify sites, 96% with default loading and 96% with a lazy-loaded LCP image have a good LCP. In Chrome's field data, loading="lazy" adds 11 ms of resource load delay before the image request starts (585 ms against 574 ms).

The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
1

LCP pass rate

Sites with loading="lazy" have a good LCP most often at 96%, followed by no loading attribute at 96% and loading="eager" at 94%. Within Shopify, default loading and loading="lazy" have a good LCP about equally often.

SitesGood, needs improvement, poor LCPMedian
All Shopify sites5,82595%1.4s
loading="lazy" 31.2%1,30596%1.3s
No loading attribute (auto) 46.0%1,90296%1.3s
loading="eager" 22.8%1,07294%1.4s
GoodNeeds improvementPoorSites: with Chrome field data
The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
2

LCP image loading usage

An <img> element is the Largest Contentful Paint element on 77.0% of audited Shopify sites, ahead of CSS background images (9.6%) and text blocks (8.7%). Among the 6,066 Shopify sites with an <img> LCP element, 46.0% omit the loading attribute, 31.2% set loading="lazy", and 22.8% set loading="eager".

LCP element type across all audited sites 7,873 sites
<img> element 77.0%
Sites with an <img> LCP element by loading attribute 6,066 sites
No loading attribute (auto) 46.0% loading="lazy" 31.2% loading="eager" 22.8%
No loading attribute (auto) 46.0% loading="lazy" 31.2% loading="eager" 22.8%
The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
3

Where lazy LCP images lose time: the four LCP phases

Putting loading="lazy" on the LCP image raises median resource load delay from 574 ms to 585 ms in Chrome's field data. That is a 11 ms wait before the browser starts downloading the image. Without loading="lazy", Chrome's preload scanner queues the <img> as soon as it reads the HTML. With loading="lazy", Chrome holds the request back until layout confirms the image sits in the viewport. Sites with loading="eager" show a 571 ms load delay in the field because many of them also preload other assets or load the hero image from a script.

Median LCP phase breakdown (Chrome field p75) Load delay Median LCP
Shopify sites with an <img> LCP element by loading attribute 3,799400 ms578 ms209 ms301 ms578 mslab 582 ms1.3s
loading="eager" 983428 ms571 ms205 ms360 ms571 mslab 578 ms1.4s
No loading attribute (auto) 1,659388 ms574 ms205 ms275 ms574 mslab 575 ms1.3s
loading="lazy" 1,157395 ms585 ms221 ms284 ms585 mslab 592 ms1.3s
TTFB Resource load delay Resource load time Element render delay
The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
4

LCP loading combined with fetchpriority and preload

Adding fetchpriority="high" to a lazy-loaded LCP image does not fix the lazy-load delay. The 21 sites with both attributes still wait 822 ms before the image request starts, and 100% have a good LCP. In Chromium, ShouldDeferImageLoad runs before resource priority is assigned, so the request stays deferred until layout.

loading attribute No priority hint fetchpriority="high" <link rel="preload"> <link rel="preconnect">
No loading attribute (auto)
94% 673 ms delay 1,476 sites
98% 498 ms delay 1,261 sites
few sites
83% 892 ms delay 48 sites
loading="lazy"
96% 582 ms delay 1,850 sites
100% 822 ms delay 21 sites
few sites
100% 709 ms delay 21 sites
loading="eager"
94% 595 ms delay 486 sites
94% 559 ms delay 889 sites
few sites few sites
The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
5

LCP image loading per framework

Vue puts loading="lazy" on the LCP image on 32% of its sites, and 94% of Vue sites have a good LCP. jQuery leaves the LCP image at the browser default on 54% of its sites and sets loading="lazy" on 29%, and 93% of jQuery sites have a good LCP.

FrameworkLCP image loading on its sitesGood LCP
Shopify sites with an <img> LCP element by loading attribute 6,066 sitesNo loading attribute (auto) 46%loading="lazy" 31%loading="eager" 23%95%
Vue 689 sitesNo loading attribute (auto) 42%loading="lazy" 32%loading="eager" 25%94%
jQuery 2,083 sitesNo loading attribute (auto) 54%loading="lazy" 29%loading="eager" 17%93%
No loading attribute (auto) loading="lazy" loading="eager"
The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
6

LCP image loading or the framework

Does the framework explain the loading="lazy" pass rate?

On jQuery, 92% of sites with default loading have a good LCP, against 94% of jQuery sites with loading="lazy" on the LCP image. Within jQuery, sites with default loading and loading="lazy" have a good LCP about equally often. On Vue, 93% of sites with default loading have a good LCP, against 96% of Vue sites with loading="lazy" on the LCP image. Within Vue, sites with default loading and loading="lazy" have a good LCP about equally often.

Why loading="lazy" holds back the preload scanner

Chrome's HTML preload scanner finds <img> tags in the first bytes of the document. It starts fetching default and eager images right away, before stylesheets and blocking scripts finish downloading. When an <img> carries loading="lazy", Chromium's ShouldDeferImageLoad check stops the preload scanner from queuing the request. The image waits until CSS downloads, the render tree builds, and layout confirms the image sits in the viewport. WordPress core has skipped loading="lazy" on the first three content images since version 6.3. Theme templates and page builders that hardcode loading="lazy" on hero banners still pay the full layout wait.

The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
7

Understanding LCP image loading

In Shopify Liquid templates, render the hero banner with section.settings.image | image_url: width: 2000 | image_tag: loading: 'eager', fetchpriority: 'high' (or omit loading so it defaults to eager). Many older Dawn sections and third-party Shopify themes hardcode loading="lazy" on every slideshow and image-banner block, which explains why 31.2% of Shopify LCP images are lazy-loaded. Removing loading="lazy" on Shopify cuts median resource load delay by 11 ms (574 ms vs 585 ms) and raises good LCP from 96% to 96%.

The State of Web Vitals · October 2026 · Shopify: 8,246 crawled sites · 5,825 with phone field data · 6,066 sites with an <img> LCP element by loading attributeBy Arjen Karel · corewebvitals.io/state-of-cwv
Related signals LCP origin → LCP image format → LCP image size → LCP element type → By Arjen Karel · 8,246 crawled Shopify sites (5,825 with phone Chrome field data, 6,066 sites with an <img> LCP element by loading attribute, October 2026) · How we measured