gazou-compressor.jp

HTMLImageElement.decode()

定義: HTMLImageElement.decode() は、画像のデコード完了を Promise で通知する API。img.src 設定後に await img.decode()描画直前まで非同期に待機でき、reflow/paintのタイミング制御が可能。

なぜ重要か

実務での活用(判断基準付き)

実装例

基本(LCP候補のフェード差し替え)

const img = new Image();
img.src = "/images/hero-1280.webp"; // preload 併用
try {
  await img.decode();               // デコード完了待ち
  requestAnimationFrame(() => {
    const hero = document.getElementById("hero");
    hero?.replaceChildren(img);     // 描画はフレーム境界で
    hero?.classList.add("is-ready"); // CSSアニメはprefers-reduced-motionに配慮
  });
} catch {
  // decode未対応/失敗時フォールバック
  img.onload = () => requestAnimationFrame(() => {
    document.getElementById("hero")?.replaceChildren(img);
  });
}

可視直前の遅延デコード(サムネ一覧)

const io = new IntersectionObserver((entries) => {
  for (const e of entries) {
    if (e.isIntersecting) {
      const img = e.target as HTMLImageElement;
      (async () => {
        try { await img.decode(); } finally { img.classList.add("ready"); }
      })();
      io.unobserve(img);
    }
  }
}, { rootMargin: "200px 0px" });

document.querySelectorAll<HTMLImageElement>(".thumb[data-src]").forEach((el) => {
  el.src = el.dataset.src!;
  io.observe(el);
});

検証と失敗例

チェックリスト

関連用語