【Lazyload】lozad（ロザド）を使った遅延読み込みの簡単実装方法

ページの表示速度改善のために画像や動画などのリソースをスクロールが達したタイミングで読み込み表示する**遅延読み込み（Lazyload）を簡単に実装できるlozad**の使い方について。

##目次

1. [Lozadとは？](#lozadとは)
1. [Lozadの使い方](#lozadの使い方)
1. [lozadの読み込み](#1-lozadの読み込み)
1. [タグに適用する](#2-タグに適用する)
    1. [imageタグへの適用例](#2-1-imageタグへの適用例)
    1. [pictureタグへの適用例](#2-2-pictureタグへの適用例)
    1. [iframeタグへの適用例](#2-3-iframeタグへの適用例)
    1. [videoタグへの適用例](#2-4-videoタグへの適用例)
    1. [背景画像への適用例](#2-5-背景画像への適用例)
1. [レスポンシブ対応方法](#3-レスポンシブ対応方法)
1. [デフォルトのクラス名(lazad)を変更する方法](#4-デフォルトのクラス名lazadを変更する方法)



<br>
##Lozadとは？

- リソースの遅延読み込みを簡単に実装できる。
- javascriptで書かれた軽量ライブラリ。
- 様々なタグに対応している（img, picture, iframe, videos, audios）
- レスポンシブ画像や背景画像などにも対応。
- 画像の代替表示ができる（ダミーの軽量な画像を表示しておく）。

https://github.com/ApoorvSaxena/lozad.js/


###Lozadの使い方
##1. lozadの読み込み
lozadの読み込み方法は２つある。

1. CDNを使う
1. パッケージをインストールする

<br>

##1-1. CDNで読み込む
headタグ内に記述。

```html:
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lozad/dist/lozad.min.js"></script>
```


<br>
##1-2. パッケージをインストールする
パッケージをインストールし、読み込む。

```:インストール
$ npm install lozad
```

インストールはyarnでもできる。`yarn add lozad`

###1-1-2. 読み込み

```js:読み込み（ES6の場合）
import lozad from 'lozad'

const observer = lozad(); //デフォルトのクラス名はlazad。引数で好きなクラス名を指定できる。
observer.observe();
```

または

```js:読み込み（CommonJSの場合）
var lozad = require('lozad')

const observer = lozad(); //デフォルトのクラス名はlazad。引数で好きなクラス名を指定できる。
observer.observe();
```

ES6とCommonJS（CJS）の歴史は[こちら](https://zenn.dev/naoki_mochizuki/articles/46928ccb420ee733f78f)の記事がわかりやすいです。


###1-1-3. HTMLにインポート
lozadを使用したいページの中で上記内容を読み込む。htmlの下部`</body>`の上に記述する。

```html:
<script src="ファイルパス"></script>
```

<br>
または直書き（おすすめしません、、）

```html:
<script>
import lozad from 'lozad'

const observer = lozad();
observer.observe();
</script>
```

以上でlozadを使う準備が完了。

<br>
##2. タグに適用する
lozadの基本構文で使用する属性は2つ。

```
class="lozad" data-src="リソースのパス"
```

1. `class="lozad"` ※デフォルトのクラス名の場合
1. `data-src="遅延読み込みするリソースのパス"`
1. `src="ダミー画像のパス"`（なくてもいい）


遅延読み込みしたいリソースにクラス名`lozad`をつけ、読み込む画像を`data-src`に記述する。

もし、ページの初期ロードのタイミングでダミー画像（軽量な画像など）を表示しておきたい場合は`src`に記述する。


<br>
###2-1. imageタグへの適用例
image.pngを読み込む場合

```html:通常
<img src="image.png">
```

↓ 遅延読み込みの適用

```html:lozad適用（これの記述でOK）
<img class="lozad" data-src="image.png">
```

↓ 初期にダミー画像 dummy.png を表示させておく場合

```html:lozad適用（ダミー画像あり）
<img class="lozad" data-src="image.png" src="dummy.png">
```


<br>
###2-2. pictureタグへの適用例
ダミー画像の有無で記述方法が異なる。

1. ダミー画像を設置しない場合
1. ダミー画像を設置する場合

>(参考) [pictureタグの基本的な使い方](https://qiita.com/yuta-38/items/9ba0f6d1a0d035c5e3e4)

####2-2-1. ダミー画像を設置しない場合
sourceタグのどの条件にも当てはまらない場合に表示する`image`タグを記述しない。

代わりに、pictureタグの中で画像を指定する。その際、最少の高さも指定しておく。

```html:
<picture class="lozad" style="display: block; min-height: 1rem" data-iesrc="image.jpg" data-alt="">
    <source srcset="image-large.jpg" media="(min-width: 1280px)">
    <source srcset="image-middle.jpg" media="(min-width: 980px)">
    <source srcset="image-small.jpg" media="(min-width: 320px)">
</picture>
```

alt属性は`data-alt`に記述する。

<br>
実際に使う場合は、pictureタグに以下を追記して、imageタグにnoscriptタグ記述すれば、lozadの付け外しが簡単にできる。

```
class="lozad" style="display: block; min-height: 1rem" data-iesrc="条件に当てはまらない時の画像パス" data-alt=""
```

```html:
<picture class="lozad" style="display: block; min-height: 1rem" data-iesrc="条件に当てはまらない時の画像パス" data-alt="">
    <source srcset="image-large.jpg" media="(min-width: 1280px)">
    <noscript><img src="条件に当てはまらない時の画像パス" alt=""></noscript> -->
</picture>
```


<br>
###2-2-2. ダミー画像を設置する場合
スクロールが達するまでダミーで表示しておく画像を設定する場合はimageタグに記述する。

```html:
<picture class="lozad" style="display: block; min-height: 1rem" data-iesrc="条件に当てはまらない時の画像パス" data-alt="">
    <source srcset="image-large.jpg" media="(min-width: 1280px)">
    <img src="ダミー画像のパス">
</picture>
```

pictureタグの中のimageタグの用法が通常と異なることに注意が必要。


<br>
###2-3. iframeタグへの適用例
imageタグへの適用と同じ。

```html:
<iframe data-src="リソースのパス" class="lozad"></iframe>
```


<br>
###2-4. videoタグへの適用例
imageタグへの適用と同じ。

```html:
<video class="lozad" data-src="video/mov.mp4">
```

再生オプションを指定する場合は以下属性を追加する。

| 属性 | 内容 |
|:-:|:--|
| autoplay  | 自動再生  |
| muted  | デフォルトでミュート  |
| loop  | 繰り返し  |
| autoplay playsinline  | スマホで勝手に全画面表示にしない  |
| controls  | コントロールパネルの表示  |
| poster="画像パス"  | 動画を再生するまでに表示する画像  |
| preload=”none”  | 事前読み込みしない  |

<br>

```html:記述例
<video class="lozad" data-src="video/mov.mp4" autoplay muted loop playsinline controls data-poster="thumnail.jpg">
```

<br>
####source属性を使う場合
source属性を使って環境に合わせて再生する動画を選ぶ場合は以下のようになる。（基本mp4再生できるので不要）

```html:
<video class="lozad" data-poster="images/backgrounds/video-poster.jpeg">
    <source data-src="video/mov_bbb.mp4" type="video/mp4">
    <source data-src="video/mov_bbb.ogg" type="video/ogg">
</video>
```

`poster`は動画を再生するまでに表示する画像。lozadを適用する場合は`data-poster`とする。


<br>
###2-5. 背景画像への適用例

```html:
<div class="lozad" data-background-image="image.png">
</div>
```


<br>
##3. レスポンシブ対応方法
タグの中で画像幅に合わせて表示するリソースを指定することができる。`data-srcset`を使う。

```js:
data-srcset="画像パス1 条件, 画像パス2 条件"
```

`srcset`属性はHTML5.1から追加された属性で、imageタグやpictureタグ内のsourceタグで使うことができる。

幅の指定は`w`（画面のピクセル幅）か`x`（デバイスピクセル比）か`vw`（画面幅に対する割合）で指定する。

####実例

```html:
<img class="lozad" data-src="image-3x.png" data-srcset="image.png 1000w, image-2x.png 2000w">
```

- 画面の幅が1000pxまではimage.pngを表示。
- 1001px~2000pxまではimage-2x.pngを表示。
- どの条件にも当てはまらない（2001px以上）はimage-3x.pngを表示。


<br>
pictureタグを使って条件を指定して出し分けるのもあり。


<br>
##4. デフォルトのクラス名(lazad)を変更する方法
デフォルトのクラス名`lozad`は変更することができる。

lozadを読み込んだjsファイルで、`lozad`の引数で好きなクラス名を指定する。

```js:.js
import lozad from 'lozad'

const observer = lozad('.適用したいクラス名');
observer.observe();
```

###実例
jsファイルの設定

```js:lazyload.js
import lozad from 'lozad'

const observer = lozad('.is-lazyload');
observer.observe();
```

↓ htmlに適用

```html:.html
<img class="is-lazyload" data-src="image.png">

<script src="public/js/lazyload.js">
</body>
```



<br>
以上。