Skip to content

Commit d7f2e41

Browse files
feat: implement responsive image preloading for lightbox images
1 parent 6c5b0cd commit d7f2e41

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

packages/block-library/src/image/index.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,14 @@ function block_core_image_render_lightbox( $block_content, $block ) {
155155
$img_styles = $p->get_attribute( 'style' );
156156
$img_width = 'none';
157157
$img_height = 'none';
158+
$img_sizes = '100vw';
158159
$aria_label = __( 'Enlarge' );
159160
$dialog_aria_label = __( 'Enlarged image' );
160161

161162
if ( isset( $block['attrs']['id'] ) ) {
162163
$img_uploaded_src = wp_get_attachment_url( $block['attrs']['id'] );
163164
$img_metadata = wp_get_attachment_metadata( $block['attrs']['id'] );
165+
$img_srcset = wp_get_attachment_image_srcset( $block['attrs']['id'] );
164166
$img_width = $img_metadata['width'] ?? 'none';
165167
$img_height = $img_metadata['height'] ?? 'none';
166168
}
@@ -179,6 +181,8 @@ function block_core_image_render_lightbox( $block_content, $block ) {
179181
'metadata' => array(
180182
$unique_image_id => array(
181183
'uploadedSrc' => $img_uploaded_src,
184+
'lightboxSrcset' => $img_srcset,
185+
'lightboxSizes' => $img_sizes,
182186
'figureClassNames' => $figure_class_names,
183187
'figureStyles' => $figure_styles,
184188
'imgClassNames' => $img_class_names,
@@ -308,7 +312,14 @@ class="wp-lightbox-overlay zoom"
308312
</div>
309313
<div class="lightbox-image-container">
310314
<figure data-wp-bind--class="state.currentImage.figureClassNames" data-wp-bind--style="state.figureStyles">
311-
<img data-wp-bind--alt="state.currentImage.alt" data-wp-bind--class="state.currentImage.imgClassNames" data-wp-bind--style="state.imgStyles" data-wp-bind--src="state.enlargedSrc">
315+
<img
316+
data-wp-bind--alt="state.currentImage.alt"
317+
data-wp-bind--class="state.currentImage.imgClassNames"
318+
data-wp-bind--style="state.imgStyles"
319+
data-wp-bind--src="state.enlargedSrc"
320+
data-wp-bind--srcset="state.enlargedSrcset"
321+
data-wp-bind--sizes="state.enlargedSizes"
322+
>
312323
</figure>
313324
</div>
314325
<div class="scrim" style="background-color: $background_color" aria-hidden="true"></div>

packages/block-library/src/image/view.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ const { state, actions, callbacks } = store(
7171
'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='
7272
);
7373
},
74+
get enlargedSrcset() {
75+
return state.currentImage.lightboxSrcset || '';
76+
},
77+
get enlargedSizes() {
78+
return state.currentImage.lightboxSizes || '100vw';
79+
},
7480
get figureStyles() {
7581
return (
7682
state.overlayOpened &&
@@ -213,7 +219,8 @@ const { state, actions, callbacks } = store(
213219
},
214220
prefetchImage() {
215221
const { imageId } = getContext();
216-
const uploadedSrc = state.metadata[ imageId ].uploadedSrc;
222+
const imageMetadata = state.metadata[ imageId ];
223+
const uploadedSrc = imageMetadata.uploadedSrc;
217224

218225
// Bails if the image is not valid or if it has already been prefetched.
219226
if (
@@ -223,11 +230,20 @@ const { state, actions, callbacks } = store(
223230
return;
224231
}
225232

233+
// Get the original img element's srcset
234+
const srcset = imageMetadata.lightboxSrcset;
235+
226236
const imageLink = document.createElement( 'link' );
227-
imageLink.rel = 'prefetch';
237+
imageLink.rel = 'preload';
228238
imageLink.as = 'image';
229239
imageLink.href = uploadedSrc;
230240

241+
// Apply srcset if available for better responsive prefetching
242+
if ( srcset ) {
243+
imageLink.setAttribute( 'imagesrcset', srcset );
244+
imageLink.setAttribute( 'imagesizes', '100vw' );
245+
}
246+
231247
document.head.appendChild( imageLink );
232248
state.prefetchedImageIds.add( imageId );
233249
},

0 commit comments

Comments
 (0)