What this plugin does:
This plugin supports:
srcset
; the image in the src
attribute will be
used for determining the placeholder image and width/height attributesv2.1 just released! View the release/upgrade notes
Like this project? Buy me a coffee via PayPal or ko-fi
In your project directory run:
# Using npm
npm install eleventy-plugin-lazyimages --save-dev
# Or using yarn
yarn add eleventy-plugin-lazyimages --dev
Then update your project's .eleventy.js
to include the plugin:
const lazyImagesPlugin = require('eleventy-plugin-lazyimages');
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(lazyImagesPlugin);
};
This plugin will automatically set the width and height attributes for each image based on the source image dimensions. You might want to overwrite this with the following CSS:
img {
display: block;
width: 100%;
max-width: 100%;
height: auto;
}
The above CSS will ensure the image is never wider than its container and the aspect ratio is maintained.
You can pass an object with configuration options as the second parameter:
eleventyConfig.addPlugin(lazyImagesPlugin, {
imgSelector: '.post-content img', // custom image selector
cacheFile: '', // don't cache results to a file
});
A full list of available configuration options are listed below, and some common questions are covered at the end of this file.
Key | Type | Description |
---|---|---|
maxPlaceholderWidth |
Integer | The maximum width in pixels of the generated placeholder image. Recommended values are between 15 and 40. Default: 25 |
maxPlaceholderHeight |
Integer | The maximum height in pixels of the generated placeholder image. Recommended values are between 15 and 40. Default: 25 |
imgSelector |
String | The DOM selector used to find IMG elements in the markup. Default: img |
transformImgPath |
Function | A function that takes the IMG src attribute and returns a string representing the actual file path to your image. |
cacheFile |
String | Cache image metadata and placeholder images to this filename. Greatly speeds up subsequent builds. Pass an empty string to turn off the cache. Default: .lazyimages.json |
appendInitScript |
Boolean | Appends code to initialise lazy loading of images to the generated markup. Set this to false if you include your own lazy load script.Default: true |
scriptSrc |
String | The URI for the lazy load script that is injected into the markup via appendInitScript .Default: https://cdn.jsdelivr.net/npm/lazysizes@5/lazysizes.min.js |
preferNativeLazyLoad |
Boolean | Use the native browser loading="lazy" instead of the lazy load script (if available).Default: false |
setWidthAndHeightAttrs |
Boolean | Set the width and height attributes on img elements to the actual size of the image file.Default: true |
className |
String[] | The class names added to found IMG elements. You usually don't need to change this unless you're using a different scriptSrc .Default: ['lazyload'] |
Example projects using the plugin can be found in the
/example
directory.
This project welcomes suggestions and Pull Requests!
See also the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE file for details
Yes! This plugin defaults to
LazySizes from JSDelivr
but you can specify a relative path via the scriptSrc
configuration option.
(a.k.a Why do I have "Input file is missing" messages in my terminal?)
By default this plugin will look for the file referenced in a src
attribute like
<img src="https://github.com/liamfiddler/eleventy-plugin-lazyimages/raw/master/images/dog.jpg" />
at <project root>/images/dog.jpg
or
<project root>/src/images/dog.jpg
.
Whereas a file referenced like
<img src="https://github.com/liamfiddler/eleventy-plugin-lazyimages/raw/master/images/dog.jpg" />
or <img src="https://github.com/liamfiddler/eleventy-plugin-lazyimages/raw/master/images/dog.jpg" />
is expected to
be found at <input file directory>/images/dog.jpg
.
If you prefer to store your images elsewhere the transformImgPath
config
option allows you to specify a function that points the plugin to your
internal image path.
For example, if your file structure stores <img src="https://github.com/liamfiddler/eleventy-plugin-lazyimages/raw/master/images/dog.jpg" />
at <project root>/assets/dog.jpg
you could set transformImgPath
like:
// .eleventy.js
eleventyConfig.addPlugin(lazyImagesPlugin, {
transformImgPath: (imgPath) => imgPath.replace('/images/', './assets/'),
});
The transformImgPath
configuration option takes a function that receives two
parameters; src
, and options
.
src
is a string containing the value of the img
elements src
attribute.
options
is an object containing the outputPath
of the file being processed,
as well as the outputDir
, inputPath
, inputDir
, and
extraOutputSubdirectory
values from eleventy config.
Yes! By default this plugin uses LazySizes
to handle lazy loading, but any lazy load script that reads from the data-src
attribute is supported via the scriptSrc
configuration option.
We've included an example project in this repo demonstrating this plugin using vanilla-lazyload.
Note: if you need to modify the custom script's parameters the recommended approach
is to set appendInitScript: false
in this plugin's config. This tells the plugin
to skip adding the script loader code to the page. It ignores any value set for
scriptSrc and allows you to use your own method for including the custom script.
The plugin will still set the data-src
+ width
+ height
attributes on IMG
tags and generate the low quality image placeholders, it just doesn't manage the
actual lazy loading.
Yes! The key to solving this problem is the order in which the plugins are
defined in .eleventy.js
. It is important this plugin runs after the plugin
that moves/renames files otherwise this plugin may still be referencing the
original filepath in the markup, not the one generated by the other plugin.
We've included an example project in this repo demonstrating this plugin with eleventy-plugin-local-images.
This release improves support for relative file paths in src
attributes.
transformImgPath
now receives an optional second parameter containing the outputPath
of the file being processed, as well as the outputDir
, inputPath
, inputDir
, and
extraOutputSubdirectory
values from eleventy config.
This release also adds the setWidthAndHeightAttrs
config option which allows you to turn
off the setting of width
and height
attributes being added to img
elements.
The underlying tool used to generate placeholders has switched from JIMP to Sharp. This allows the plugin to handle a greater variety of image formats, while also increasing in speed.
The API remains largely the same so most sites should not need to adjust their config.
maxPlaceholderWidth
and maxPlaceholderHeight
have been increased from 12 to 25 - this increases the quality of the LQIP without a significant change in filesizeplaceholderQuality
has been removed - at the size of the LQIP it didn't make much of a difference to filesize or image qualitypreferNativeLazyLoad
is now false
- most users install this plugin to generate LQIP and the previous default meant the LQIP weren't visible in modern browsersLike this project? Buy me a coffee via PayPal or ko-fi