-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
See PR #3752
Problem
Many websites are very image heavy, but not all of those images are going to be viewed by visitors. Especially on mobile devices where most visitors do not scroll down very much; it is mostly the content at the top of the page that is consumed. Most of the images further down the page will never be viewed, but they are downloaded anyway.
This is slowing down the overall page load time, unnecessarily increasing mobile data charges for some visitors and increasing the amount of data held in memory.
Example workaround
For years, the BBC News team have been using the following method to work around this problem. Primary images at the top of the page are included in the HTML document in the typical way using an img
element. However, any other images are loaded in lazily with a script. For those images, they are inidially included in the HTL document as a div
which acts as a placeholder. The div
is styled with CSS to have the same dimensions as the loaded image and has a grey background with a BBC logo on it.
<div class="js-delayed-image-load"
data-src="https://ichef.bbci.co.uk/news/304/cpsprodpb/26B1/production/_96750990_totenhosen_alamy976y.jpg"
data-width="976" data-height="549"
data-alt="Campino of the Toten Hosen"></div>
Eventually, a script will replace it with an img
element when it is visible in the viewport.
Doing this with a script is not ideal, because:
- If the visitor has scripts disabled, or the script fails to load, the images won't ever appear
- We don't know in advance the size of the visitor's viewport, so we have to arbitrarily determine which images to load in lazily. On a news article, vistors on small viewports will only initially see the News logo and an article's hero image, but larger viewports will initially be able to see many other images (e.g. in a sidebar). But we have to favour the lowest common denominator for the sake of mobile devices. This gives users with a large viewport a strange experience where the placeholders appear for a second when they load the page.
- We have to wait for the script to asyncronously download and execute before any placeholders can be replaced with images.
Solution
There needs to be a native method for authors to do this without using a script.
One solution to this is to have an attribute for declaring which images or objects should not be downloaded and decoded until they are visible in the viewport. For example, <img lazyload>
.*
Alternatively, a meta
element could be placed in the head
to globally set all images and objects to only download once they are visible in the viewport.
* An attribute with that name was proposed in the Resource Priorities spec a few years ago, but it didn't prevent the image from downloading - it just gave a hint to the browser about the ordering, which is probably not as useful in a HTTP/2 world.