こんにちは。FASTCODINGデザイナーの七転び八重子です。
大量の画像を表示するWebページは、表示速度が遅くなりがちです。ページ速度が遅くなると、ブラウザが重くなるので、画面操作に支障が出て、UIが低下してしまいます。対処方法として、CSSスプライトやExpiresヘッダーを利用する方法がありますが、今回は「Lazy Load(レイジーロード)」を利用して、画像を遅延ロードさせる事で、ページスピードを改善する方法をご紹介します。
目次
画像を遅延ロードさせる理由
ページにアクセスした瞬間からブラウザは、HTMLに含まれる全ての画像ファイルを読み込みます。全て読み込むということは、ビューポート内に存在しない画像(ユーザーがほとんど閲覧しない下部の画像)でも、読み込んでしまうので、当然ブラウザは重くなります。
そこで、ブラウザのビューポート内にある画像のみを読み込みし、それ以外にある画像はスクロール位置に合わせてロードさせる事で、ページスピードを高速化することができます。
遅延ロードの方法は2つ
遅延ロードさせる方法は、ブラウザのネイティブLazyload設定と、JavaScriptライブラリの使用の2つがあります。
2021年2月現在、72%のブラウザがネイティブで遅延ロード(loading属性)をサポートしています。
loading属性のサポート状況
現在のサポート状況を踏まえて、以下のポイントで実装してみます。
- ネイティブの遅延読み込みを設定。
- Lazyload未対応ブラウザでは、JavaScriptライブラリを設定。
- Lazyload対応ブラウザの場合、JavaScriptを読み込ませない。
※基本的に上記で良いのですが、レスポンシブコーディングで、このブラウザのネイティブlazyload機能を使用する場合、画像周りのスタイル設定(CSS設定)を追加する必要があります。(デザインに寄ります)
① ネイティブの遅延読み込みを設定。
loading=”lazy”を書いておくと、ブラウザによって適切なタイミングでロードされます。
<img
src="/path/sample.jpg"
alt="description(推奨)"
width="300"
height="300"
loading="lazy"
/>
loading属性を利用する事で、ブラウザはビューポート外の画像やiframeをスクロール位置に合わせて読み込みするようになります。
loading属性は3つの値をサポートします。
lazy:遅延ロードに適した値です。
eager:遅延ロードには適してません、すぐにロードする値です。
auto:遅延ロードするかどうかをブラウザに委ねます。
※loading属性を定義しない場合は、loading=autoを定義した場合と同じ。
② Lazyload未対応ブラウザでは、JavaScriptライブラリを設定。
合わせて、Lazyload未対応ブラウザの場合には、JavaScriptライブラリ「lazysizes」を適応させるように設定していきます。jQueryやVue.jsなどは必要ありません。ビューで検知した要素にClassを設定することで、背景画像や::befor,::afterにもLazyLoadを行う事が可能です。
scriptタグの配置
ダウンロード:aFarkas/lazysizes
<script src="https://cdn.jsdelivr.net/npm/lazysizes@5.2.2/lazysizes-umd.min.js" async></script>
imgタグに”lazyload”を追加
- class=”lazyload”を追加
- src属性ではなく、data-src属性で画像パスを指定する
- srcを空にしてはいけないので、1x1pxの透明な画像のプレースホルダーを使用
基本の設定
<img
src="/path/placeholder/1px.png"
data-src="/path/sample.jpg"
alt="description(推奨)"
width="300"
height="300"
class="lazyload"
loading="lazy"
/>
レスポンシブでpictureタグを使う場合
・「srcset」を「data-srcset」に変更します。
<picture>
<source media="(max-width: 575px)" data-srcset="/path/apple@575w.jpg">
<source media="(max-width: 768px)" data-srcset="/path/apple@768w.jpg">
<source media="(max-width: 1200px)" data-srcset="/path/apple@1200w.jpg">
<img
src="/path/placeholder/1px.png"
data-src="/path/sample.jpg"
alt="description(推奨)"
width="300"
height="300"
class="lazyload"
loading="lazy"
/>
</picture>
③ Lazyload対応ブラウザの場合、JavaScriptを読み込ませない。
JavaScriptで、ユーザーが使用しているブラウザがネイティブLazyloadをサポートしているかどうかを検出します。
if ("loading" in HTMLImageElement.prototype) {
/* ネイティブの遅延読み込みをサポートしている場合 */
} else {
/* ネイティブの遅延読み込みをサポートしていない場合 */
}
JavaScriptの最終コード
<script>
if ("loading" in HTMLImageElement.prototype) {
var images = document.querySelectorAll('img[loading="lazy"]');
var sources = document.querySelectorAll("source[data-srcset]");
sources.forEach(function (source) {
source.srcset = source.dataset.srcset;
});
images.forEach(function (img) {
img.src = img.dataset.src;
});
} else {
var script = document.createElement("script");
script.src = "/link/to/lazyload.js";
document.body.appendChild(script);
}
</script>
lazyloadのサンプル
まとめ
画像の遅延ロードをまとめてみました。スマホなどのサイトは、縦に長くなるのでこの方法はページスピード対策におすすめしますが、レスポンシブデザインの場合に、ネイティブlazyload機能を使用する場合は、画像周りのスタイル設定(CSS設定)を追加する必要があります。(デザインに寄ります)
どちらにしても、Webサイトを制作する場合は、運用レベルまでしっかりと意識して、取り入れると良いと思います。
ページスピード対策でお困りですか?

