Lozad.js で Lazy Load (非 jQuery)
はじめに
jQuery を使わずに Lazy Load できる ApoorvSaxena/lozad.js の使い方を整理した。
TL;DR
<img class="lozad" src="dummy" data-src="image">
のように指定class="lozad"
を追加data-src
に Lazy Load 対象画像、src
にダミー画像を設定
lozad().observe()
を実行して Lazy Load 起動(監視処理の起動)IntersectionObserver
を使っているので SEO 的にも良い(らしい)
目次
環境・条件
lozad.js, intersection-observer.js は CDN(JSDELIVR) を利用。
- Google Chrome バージョン: 78.0.3904.70(Official Build) (64 ビット)
- lozad.js v1.14.0
- intersection-observer.js v0.7.0
詳細
Intersection Observer とは
要素同士の交差を監視することができる API。
分かりやすい例だと、(lozad.js でも使われているように)「表示画面」と「画像」の交差有無を検出できる。「表示画面」と「画像」の交差有無とは、言い換えると「画像が画面に表示されているかどうか」ということ。
lozad.js
従来の Lazy Load は scroll
イベントにイベントリスナーを仕掛けて検出するという方法だったが、この方法だとイベントが大量に発火するため、パフォーマンス的な問題がある。
lozad.js は、scroll
イベントは使わずに Intersection Observer で Lazy Load を実現している。
使い方
事前準備
手っ取り早いのは CDN から読み込む方法。
- lozad CDN by jsDelivr
https://cdn.jsdelivr.net/npm/lozad@1.14.0/dist/lozad.min.js
InterSectionObserver は未対応のブラウザがあるので、polyfill である intersection-observer も合わせて読み込む。
- intersection-observer CDN by jsDelivr
https://cdn.jsdelivr.net/npm/intersection-observer@0.7.0/intersection-observer.js
※参考: IntersectionObserver - Can I use
1 | <head> |
画像表示箇所の設定
やることは下記
class="lozad"
の付与(※独自クラスも使用可能)data-src="/path/to/image"
で Lazy Load させたい画像を指定src="/path/to/dummy"
を指定すると Lazy Load 前に表示しておく画像を指定できる
1 | <img src="/path/to/image"> |
lozad.js の実行
lozad.js
のインスタンスを生成して observe()
を実行するだけ。
1 | const observer = lozad(); |
Tips
独自クラスを使う
myLazyLoad
のような独自クラスを対象にしたい場合。
1 | <img class="myLazyLoad" src="/path/to/dummy" data-src="/path/to/image"> |
lozad.js
のインスタンス生成時にクラス名を指定する。
1 | const observer = lozad('.myLazyLoad'); |
Lazy Load のタイミング変更
lozad.js
のインスタンス生成時の第2引数に IntersectionObserver のオプションが指定できる。
デフォルトでは指定要素が全て画面上に現れた時(対象要素の bottom
まで表示された時)が、Lazy Load の発火タイミングになっている模様。rootMargin
を指定することで、発火タイミングを指定数値分だけ調整できる。
以下例だとデフォルトよりも 100px
分速く Lazy Load が行われる。
1 | const options = { |
img タグ以外で使う
<img src="">
以外にも使うことができる。
srcset
1 | <img class="lozad" data-src="image.png" data-srcset="image.png 1000w, image-2x.png 2000w" /> |
CSS の background-image
1 | <!-- 単一画像 --> |
video
1 | <video data-poster="images/backgrounds/video-poster.jpeg"> |
iframe
1 | <iframe data-src="embed.html" class="lozad"></iframe> |
まとめ
<img class="lozad" src="dummy" data-src="image">
のように指定class="lozad"
を追加data-src
に Lazy Load 対象画像、src
にダミー画像を設定
lozad().observe()
を実行して Lazy Load 起動(監視処理の起動)IntersectionObserver
を使っているので SEO 的にも良い(らしい)
参考文献
- ApoorvSaxena/lozad.js: 🔥 Highly performant, light ~1kb and configurable lazy loader in pure JS with no dependencies for responsive images, iframes and more
- IntersectionObserver - Can I use
- intersection-observer - npm
- lozad CDN by jsDelivr
- intersection-observer CDN by jsDelivr
- IntersectionObserverベースな、遅延読み込みライブラリのLozad.jsを紹介する - Qiita
- Lozad.jsからIntersection Observerを始めよう|ホームページ制作、Webマーケティング|株式会社SPC
- Intersection Observer が良さそうなので試してみた - Qiita
- 使ってみよう!Intersection Observer! - Qiita
- RailsでSEO対策もバッチリなIntersection Observer(Lozad.js)を使ったlazyload実装方法 - Qiita
関連記事
- jQuery Select2 で、初期値の設定と選択状態のクリア
- jQuery Select2 で ajax を使って選択肢を取得する
- jQuery Select2 で動的に選択肢を追加する
- jQuery Select2 で上限ありの複数選択
- JavaScript で画像をローカルにダウンロード
- JavaScript で複数画像を zip に圧縮してローカルにダウンロード
- JavaScript で URL のクエリパラメータを操作する方法
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)