Image Load Lab

Guides Browser Behaviour Tested Oct 17, 2026 Chrome 155 · 7 markups · 2 viewports

How Chrome Chooses a Source in the picture Element

One request per picture element, always the first supported type: listing WebP before AVIF cost 61 % more bytes for the same photo. Chrome 155 also accepted a source marked image/jxl.

The <picture> element lets a page offer the same image in several formats and sizes. The browser is supposed to pick exactly one. Which source does Chrome choose, does the order of the sources matter, and what happens when the markup is wrong? We tested seven variations of the same photo and recorded every request.

The test

All pages show one CC0 photo of a sunset, prepared at 400, 800, 1200 and 1600 pixels wide in JPEG (MozJPEG quality 80), WebP (quality 75) and AVIF (quality 50). At 800 pixels the three files transfer 49.2 KB, 40.6 KB and 25.2 KB; these, like all byte figures below, are transfer sizes reported by Chrome, which include about 180 bytes of HTTP headers. The seven pages use: AVIF, WebP and JPEG in the usual order; WebP listed before AVIF; a source with type="image/jxl" listed first; an AVIF source with no type attribute; a WebP file wrongly labelled type="image/avif"; a phone-only source chosen with a media query; and a source with a full srcset and sizes.

Each page was loaded in Chrome 155.0.8059.82 on a phone viewport (390 pixels, 3× density) and a desktop viewport (1440 pixels, 1×), with the cache disabled. We recorded requests through the DevTools Protocol and read currentSrc to see which file was displayed. See the methodology for the general setup.

Results

One request per page in every case; Chrome 155, phone 390 px at 3×, desktop 1440 px at 1×
Markup Requests Phone downloaded Desktop downloaded
AVIF, then WebP, then JPEG 1 sunset-800.avif (25.2 KB) sunset-800.avif (25.2 KB)
WebP listed before AVIF 1 sunset-800.webp (40.6 KB) sunset-800.webp (40.6 KB)
type="image/jxl" listed first 1 sunset-800.jpg (49.2 KB) sunset-800.jpg (49.2 KB)
AVIF source with no type attribute 1 sunset-800.avif (25.2 KB) sunset-800.avif (25.2 KB)
WebP file labelled image/avif 1 sunset-800.webp (40.6 KB) sunset-800.webp (40.6 KB)
Media query + type (small file for phones) 1 sunset-400.avif (7.0 KB) sunset-1200.avif (51.5 KB)
srcset + sizes inside <source> 1 sunset-1200.avif (51.5 KB) sunset-800.avif (25.2 KB)

Chrome made exactly one image request on every page. No fallback JPEG was fetched “just in case”, even when a better format was chosen. That is the main promise of <picture>, and it held in all fourteen loads.

Bar chart: listing AVIF first downloaded 25.2 KB, listing WebP first downloaded 40.6 KB for the same photo, and a source marked image/jxl listed first was taken by Chrome 155
Kilobytes downloaded for the same 800-pixel photo depending on which source comes first. Chart generated from the linked CSV.

Order decides, not file size. Chrome takes the first <source> whose type it supports. With AVIF first it downloaded 25.2 KB; with WebP listed first it downloaded the 40.6 KB WebP, although the AVIF was available and 38 % smaller. The browser does not compare formats; it reads the list from the top.

Chrome 155 accepted a source labelled image/jxl. We expected that source to be skipped as an unsupported format. Instead Chrome selected it. In our page that source pointed to a JPEG file, which Chrome then displayed after recognising its real format. Together with the Accept header we recorded in our Accept header test, which lists image/jxl first, this means this Chrome build declares JPEG XL support. We did not test a real JPEG XL file in this guide.

A missing or wrong type attribute did not break Chrome, but it removes the safety net. The AVIF source without a type was downloaded and shown, and the WebP file labelled as AVIF was downloaded and shown too, because Chrome checks the file’s contents. A browser without AVIF support would have done the same and then failed to decode the image, since the type attribute is what lets it skip a source it cannot read.

Media conditions and sizes worked together with types. On the phone, the media="(max-width: 700px)" source delivered the 400-pixel AVIF (7.0 KB); the desktop got the 1200-pixel AVIF from the next source. With srcset and sizes inside the AVIF source, the phone at 3× density took the 1200-pixel file (390 × 3 = 1,170 pixels needed) and the desktop the 800-pixel one for a 700-pixel slot.

How to write picture markup

  • List sources from the smallest format to the largest: AVIF, then WebP, then the JPEG <img>. Putting WebP first made Chrome download 61 % more bytes for the same photo.
  • Always set type on format sources, and make it match the file. Chrome tolerated mistakes in our test, but the attribute is the only thing that tells older browsers to skip a format.
  • Put srcset and sizes on every <source>, not only on the <img>; each source chooses its own width. Our srcset and sizes test shows how much a wrong sizes value costs.
  • The <img> still matters: its alt, width, height and loading attributes apply to whichever source is chosen.

Practical conclusion

Chrome 155 downloaded one file per <picture> and always took the first source with a type it supports, so put AVIF first. It also accepted image/jxl, which matters if you plan to add JPEG XL sources. Keep type attributes accurate for the benefit of browsers that cannot read every format.

Limitations

We tested Chrome only, so we cannot say how browsers without AVIF or JPEG XL support behave with the faulty markup; their behaviour follows from the HTML rules but was not measured. One photo, one quality setting per format.

Data and files

Download picture-sources.csv (14 rows, 1.0 KB) · Method: testing methodology. Photo: image credits.

Client Hints on Image Requests: What Chrome Sends

Chrome 155 sent DPR, width and network hints with image requests only after Accept-CH, and to another origin only with Permissions-Policy delegation. Width was in device pixels.

Browser Behaviour 4 min read

Video Poster Images and LCP: Same as an img?

A video poster was discovered as early as an img, got the same priority and counted as the LCP element with the same timing, 1,316 ms against 1,320 ms. It cannot use srcset.

Browser Behaviour 3 min read