All photos by paint with stars photography.
The simplest usage is almost plain ol’ markup you’d use anyways.
<div class="js--lazyload"> <img alt="image description" src="images/example@2x.jpg" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-lazyload="images/example-300x150.jpg 300w, images/example-600x300.jpg 600w, images/example.jpg 690w, images/example@2x.jpg 1380w"> </div>
The key differences are:
img
tag is placed inside a wrapper with the js--lazyload
classes.srcset
attribute is set to a blank GIF (base-64 encoded to eliminate an extra request per image).srcset
are instead placed in the data-lazyload
attribute.
To enable lazyloading, include the following snippet just before your closing </body>
tag:
<script src="path/to/bower_components/responsive-lazyload/dist/responsive-lazyload.min.js"></script> <script> responsiveLazyload(); </script>
figure
elements and other wrappers.figure
elements.
The responsive image markup can be included inside other elements (e.g. figure
) without issue. It does require an extra tag, unfortunately.
<figure> <div class="js--lazyload"> <img alt="image description" src="images/example02@2x.jpg" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-lazyload="images/example02-300x150.jpg 300w, images/example02-600x300.jpg 600w, images/example02.jpg 690w, images/example02@2x.jpg 1380w"> </div> <figcaption> You can also include lazyloaded images in <code>figure</code> elements. </figcaption> </figure>
By default, responsiveLazyload.js
sets images to a 2:1 aspect ratio (padding-bottom: 50%;
— figure this out by dividing the height by the width, e.g. 400h ÷ 800w = 0.5
).
To change the aspect ratio to match your image, divide the height by the width and add an inline style to the wrapper:
<div class="js--lazyload" style="padding-bottom: 66.67%"> <img alt="image description" src="images/example03@2x.jpg" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-lazyload="images/example03-300w.jpg 300w, images/example03-600w.jpg 600w, images/example03.jpg 690w, images/example03@2x.jpg 1380w"> </div>
To avoid setting explicit sizes, the lazyload class can be applied directly to the img
tag.
<img alt="image description" class="js--lazyload" src="images/example04@2x.jpg" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-lazyload="images/example04-300x150.jpg 300w, images/example04-600x300.jpg 600w, images/example04.jpg 690w, images/example04@2x.jpg 1380w">
NOTE: This approach causes the content to reflow (unless the image is square) and may cause layout issues since it tries to set the image at 100% of its container width. Use at your own discretion.
In some cases, an image may be within the viewport, but not actually be visible (e.g. tabbed interfaces). Not to worry — we’ve handled that as well!
To make this happen, pass a callback to the JS function that shows or hides elements that is
the return value from responsiveLazyload()
:
<script> /* * The initialization returns a function that we can call * to force a check for new images. This is useful when * images are shown/hidden by JavaScript. */ var loadVisibleImages = responsiveLazyload(); // THIS JS FOR THE DEMO ONLY window.initTabs({ /* * Whenever a tab changes, check for new images and * lazy load them if necessary. */ onChange: loadVisibleImages, }); </script>