media
blur-up / progressive image loading
ぼけた低解像度画像(LQIP)を先に見せ、本画像の読み込み完了でシャープに切り替える読み込み演出。体感の待ち時間を減らしつつ、アスペクト比の固定でCLS(レイアウトのずれ)を防ぐところまでが本題。
02 — Prompt template
03 — Params
blur(初期ぼかし px) — 範囲 4〜40 / 初期 20
16〜24pxが目安。小さいと「ピンボケ画像」にしか見えず、読み込み演出だと伝わらない。duration(シャープ化 s) — 範囲 0.2〜2 / 初期 0.8
0.6〜1sが自然。長すぎると本画像が届いているのに待たせる演出になる。
04 — Vocab
LQIP — Low Quality Image Placeholder。数KBの縮小画像を先に出す手法。Next.jsのblurDataURLはこれの自動生成版。
CLS — Cumulative Layout Shift。読み込みで要素がずれる量の指標。枠のaspect-ratio固定(またはwidth/height属性)が最も効く対策。
縁のにじみ — filter: blurは要素の縁の外側まで滲む。scale(1.05前後)で一回り大きくし、overflow: hiddenの枠外に追い出して隠す。
onload — 画像の読み込み完了イベント。blurを外すトリガーは時間ではなくこれ。キャッシュ済みに備えて img.complete も併せて見る。
05 — NG → OK examples
NG
言い方: 「「画像をぼかしから読み込む感じにして」」
なぜNG: 読み込み完了の検知(onload)がなく、固定タイマーでぼかしを外すだけの実装が返ってきやすい。回線が遅いとぼけた画像のまま止まり、速いと無意味に待たされる。アスペクト比の固定も抜けてCLSが出る。
OK
言い方: 「「blur-up(LQIP)を実装。aspect-ratio固定でCLS 0、プレースホルダをblur(20px)+scale(1.06)で表示、img.onloadをトリガーに0.8s ease-outでblur(0)/scale(1)へ。overflow:hiddenで縁のにじみを隠す」」
なぜOK: 切替のトリガー(onload)・CLS対策・縁の処理まで指定している。「なぜscaleを併用するか」まで書くと、実装時に勝手に省かれない。
