blob: 585884d93d92a9b1c5fcd4f1cef8e5259d549070 [file] [log] [blame]
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Lazyload Images</title>
<link rel="stylesheet" href="doc.css">
</head>
<body>
<!--#include virtual="_header.html" -->
<div id=content>
<h1>Lazyload Images</h1>
<h2>Configuration</h2>
<p>
The 'Lazyload Images' filter is enabled by specifying
<dl>
<dt>Apache:<dd><pre class="prettyprint"
>ModPagespeedEnableFilters lazyload_images</pre>
<dt>Nginx:<dd><pre class="prettyprint"
>pagespeed EnableFilters lazyload_images;</pre>
</dl>
in the configuration file.
<h2>Objective</h2>
<p>
Optimize browser rendering and reduce number of HTTP round-trips by deferring
the loading of images which are not in the client's viewport. This filter
implements the PageSpeed rules for <a
href="/speed/docs/best-practices/rendering" target="_blank">optimizing browser
rendering</a> and <a href="/speed/docs/best-practices/rtt" target="_blank">minimizing round
trip times</a>.
</a>
</p>
<h2>Description</h2>
<p>
The lazyload_images filter defers loading of images until they
become visible in the client's viewport or the page's <code>onload</code>
event fires. This avoids blocking the download of other critical resources
necessary for rendering the above the fold section of the page.
</p>
<p>
The filter changes the <code>src</code> attributes of <code>&lt;img&gt;</code>
elements on each HTML page to <code>data-pagespeed-lazy-src</code>. It attaches
an <code>onload</code> handler to these elements to determine whether the
element is in the client's viewport, and if so, loads it. It also attaches an
<code>onscroll</code> handler to the page, so that elements below the fold
are loaded when they become visible in the client's viewport as the user
scrolls down the page.
</p>
<h2 id="lazyload-after-onload">Lazyload After Onload</h2>
<p>
Additionally, in 1.8.31.2 and later, all images on the page that haven't yet
been loaded will be forcefully loaded after the page's <code>onload</code> event
is fired. This reduces jank when scrolling the page, especially on mobile
devices, at the cost of downloading bytes for images that may never be displayed
to the user.
</p>
<p>
To disable loading of images on page <code>onload</code>, set:</p>
<dl>
<dt>Apache:<dd><pre class="prettyprint"
>ModPagespeedLazyloadImagesAfterOnload off</pre>
<dt>Nginx:<dd><pre class="prettyprint"
>pagespeed LazyloadImagesAfterOnload off;</pre>
</dl>
<h2 id="lazyload-blank-url">Blank Url</h2>
<p>
By default, when the page is initially viewed, a 1x1 blank image is served from
<a href="configuration#pagespeed_static">pagespeed_static</a>. It is also
possible to use the same image served by Google's network, or any image that you
choose, by specifying:</p>
<dl>
<dt>Apache:<dd><pre class="prettyprint"
>ModPagespeedLazyloadImagesBlankUrl "https://www.gstatic.com/psa/static/1.gif"</pre>
<dt>Nginx:<dd><pre class="prettyprint"
>pagespeed LazyloadImagesBlankUrl "https://www.gstatic.com/psa/static/1.gif";</pre>
</dl>
<p>An advantage of this approach is that this gif may already be in
the browser cache since any PageSpeed-enabled site can share it.
However, this would send traffic to Google with your page as the
Referer.
</p>
<p>
These directives can be used in
<a href="configuration#htaccess">location-specific configuration
sections</a>.
</p>
<h2 id="pagespeed_no_defer">Disabling Lazyloading Per-image</h2>
<p>
lazyload_images doesn't defer an <code>img</code> tag if it has
the <code>data-pagespeed-no-defer</code> attribute (preferred) or <code>pagespeed_no_defer</code>
attribute (deprecated). Usage:
<pre class="prettyprint">
&lt;img data-pagespeed-no-defer src=.../&gt;
</pre>
</p>
<h2 id="ua-blacklist">User-Agent Blacklist</h2>
<p>
To ensure images are only lazyloaded in supported browsers, lazyload_images
uses a User Agent blacklist. Browsers that will not see images loaded lazily
are:
<ul>
<li>BlackBerry 5.0 and older</li>
<li>The Google
Plus <a href="https://developers.google.com/+/web/snippet/">thumbnail
fetcher</a></li>
<li>Web Spiders
(<a href="https://github.com/pagespeed/mod_pagespeed/blob/master/pagespeed/kernel/http/bot_checker.gperf">full
list</a>)</li>
</ul>
</p>
<h2 id="beacons">Lazily loading only images below the fold</h2>
<p>
By default lazyload_images injects JavaScript that uses
a <a href="faq#beacons">beacon</a> to report back to the server the images that
are visible in the client's initial viewport (<em>above the fold</em>).
It takes a few accesses of a page for the data to be reported back and
processed but eventually the above-the-fold images will be known and will be
loaded immediately while all the other below-the-fold images will be lazily
loaded; until then all images are lazily loaded.
</p>
<p>
The use of beacons can be disabled using the
<a href="config_filters#beacons">ModPagespeedCriticalImagesBeaconEnabled</a>
directive. If they are disabled, lazyload_images will not inject the
JavaScript and will revert to lazily loading all images.
</p>
<h2>Example</h2>
<p>
The effect of this filter can be observed by comparing the
number of requests <a
href="http://www.modpagespeed.com/lazyload_images.html?ModPagespeed=off">
before</a>
and <a
href="http://www.modpagespeed.com/lazyload_images.html?ModPagespeed=on&ModPagespeedFilters=lazyload_images">
after</a> rewriting.
As you scroll down, you will notice that images below the fold are only
requested after they become visible in the viewport.
</p>
<h2>Risks</h2>
<p>
The computation of each image's position in the viewport may consume
additional CPU cycles on the client side. Sites that employ
JavaScript libraries to implement lazy-loading may not work properly
with this mechanism.</p>
</div>
<!--#include virtual="_footer.html" -->
</body>
</html>