画像表示の高速化テクニック
株式会社ピクセルグリッド
フロントエンド・エンジニア
渡辺 由 @yuw27b
2022/10/28
DIST.37 「マークアップな夜」
Webページに画像を表示する
JPEG形式
4032×3024ピクセル
12.5MB
Quality: 0.75
2016×1512ピクセル
728KB
MinifyしたjQuery(+gzip)
45KB
画像
HTML
JS
CSS
画像があってもなるべく快適に
マークアップ
<img>要素
<img src="sample_1080.jpg" alt="画像の説明"
srcset="sample_1080.jpg 1080w, sample_720.jpg 720w"
>
<img src="sample.jpg" alt="画像の説明"
srcset="sample.jpg 2x, sample_small.jpg 1x"
>
レスポンシブ
[画像のパス] [幅 または 密度]
<img>要素
<img src="sample_1080.jpg" alt="画像の説明"
srcset="sample_1080.jpg 1080w, sample_720.jpg 720w"
>
レスポンシブ
1080と720は同じ内容の画像にする
<img>要素
<img src="sample_1080.jpg" alt="画像の説明"
srcset="sample_1080.jpg 1080w, sample_720.jpg 720w"
sizes="(max-width: 1000px) 720px, 1080px"
>
レスポンシブ
メディアクエリ
<img>要素
レスポンシブ
DevToolsで確認
<img>要素
<img src="sample_1080.jpg" alt="画像の説明"
loading="lazy"
>
タイミング
<img>要素
<img src="sample_1080.jpg" alt="画像の説明"
decoding="async"
>
タイミング
Chrome 106〜
https://caniuse.com/mdn-html_elements_img_decoding
<picture>要素
<picture>
<source media="(max-width:720px)" srcset="720.jpg">
<img src="1080.jpg" alt="画像の説明">
</picture>
レスポンシブ
<picture>要素
レスポンシブ
PCとモバイルで別の画像を表示したいケース
<picture>要素
<picture>
<source srcset="sample.avif" type="image/avif">
<source srcset="sample.webp" type="image/webp">
<img src="sample.jpg" alt="画像の説明">
</picture>
レスポンシブ
<img> VS <picture> + <img>
レスポンシブ
画像のフォーマット
画像フォーマットのこと
Chrome 106
画像の容量
image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Firefox 106
image/avif,image/webp,*/*
Safari 16.1 (macOS12.6)
image/webp,video/*;q=0.8,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5
Safari 16.1 (iOS)
image/webp,image/avif,video/*;q=0.8,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5
Can I use…?
| Chrome | Edge | Safari | iOS Safari | Firefox |
AVIF | ⭕️ | ❌ | macOS 13〜 | iOS 16〜 | ⭕️ |
WebP | ⭕️ | ⭕️ | ⭕️ | ⭕️ | ⭕️ |
画像の容量
https://caniuse.com/avif ・https://caniuse.com/webp
AVIFによる圧縮
JPEG形式
4032×3024ピクセル
12.5MB
AVIF形式
2016×1512ピクセル
482KB
画像の容量
画像を用意する
<picture>
<source
srcset="sample_1080.avif 1080w,
sample_720.avif 720w,
sample.avif 480w"
type="image/avif">
<source
srcset="sample_1080.webp 1080w,
sample_720.webp 720w,
sample.webp 480w"
type="image/webp">
<img
src="sample.jpg"
srcset="sample_1080.jpg 1080w,
sample_720.jpg 720w,
sample.jpg 480w"
alt="画像の説明">
</picture>
JPEG
WebP
AVIF
画像を9枚用意する…?
フレームワークに任せる
<img class="gatsby-resp-image-image"
alt="画像の説明" title="画像の説明"
src="/.../sample.png"
srcset=
"/path/to/sample-256.png 256w,
/path/to/sample-512.png 512w,
/path/to/sample-1024.png 1024w,
/path/to/sample-1536.png 1536w"
sizes="(max-width: 1024px) 100vw, 1024px"
loading="lazy"
decoding="async"
>
画像が多いとビルドに時間はかかる
CDNサービスの活用
Webサービスの利用
画像を様々なフォーマットで配信できる
https://assets.imgix.net/examples/vista_900w.png?fm=avif&w=720&q=80
JPEG
WebP
AVIF
アップロード
URLで
フォーマットや
サイズを指定
フォーマット=auto
https://assets.imgix.net/examples/vista_900w.png?fm=auto&w=720&q=80
画像の加工・合成
https://assets.imgix.net/background.png?auto=compress,format&duotone=000000,000000&duotone-alpha=60&blend-mode=normal&blend-h=630&blend=https://assets.imgix.net/main_pic.jpg?auto=compress,format&w=1200&h=630&fit=fill&fill=solid&fill-color=272727
画像にテキストを乗せる
https://codegrid.imgix.net/image.png?ixlib=js-3.5.1&w=1200&h=630&mark=https%3A%2F%2Fcodegrid.imgix.net%2F~text%3Fixlib%3Djs-3.5.1%26w%3D1000%26txt%3D%25E8%2584%2586%25E5%25BC%25B1%25E6%2580%25A7%25E3%2581%25AE%25E3%2581%2582%25E3%2582%258Bnpm%25E3%2583%2591%25E3%2583%2583%25E3%2582%25B1%25E3%2583%25BC%25E3%2582%25B8%25E3%2581%25AE%25E4%25BD%25BF%25E7%2594%25A8%25E3%2583%25AA%25E3%2582%25B9%25E3%2582%25AF%26txt-fit%3Dmax%26txt-size%3D57%26txt-font%3DHiragino%2520Sans%2520W5%26txt-color%3Dfff&mark-x=90&mark-y=195&blend=%23268728&blend-mode=overlay&txt=npm%20audit%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%20%7C%20%E5%89%8D%E7%B7%A8&txt-align=top%2Cleft&txt-font=Hiragino%20Sans%20W5&txt-size=30&txt-pad=100&txt-color=fff
OGP画像
画像にテキストを乗せる
アップロード
.OTF
フォントの自由度が高いです
フォントファイル
まとめ