WithCodeMedia-1-pc
previous arrowprevious arrow
next arrownext arrow

WithCodeMedia-1-sp
previous arrowprevious arrow
next arrownext arrow

WebP/AVIF非対応ブラウザのフォールバック実装|picture要素で画像最適化を徹底解説

生徒

博士、最近WebPやAVIFっていう画像フォーマットをよく聞くんですけど、古いブラウザで見られなくなったりしないんでしょうか?

ペン博士

よーく聞くんだぞ。WebPやAVIFは次世代の画像フォーマットで、ファイルサイズを大幅に削減できるんじゃ。でも確かに、すべてのブラウザで対応しているわけではないんじゃよ。だからこそ、今回は「フォールバック」という技術について詳しく解説するぞい!

生徒

そういう方法があるんですね!はい!よろしくお願いします!

Webサイトのパフォーマンス改善において、画像の最適化は非常に重要な要素です。特に、次世代画像フォーマットであるWebPやAVIFを使用することで、ページの読み込み速度を大幅に向上させることができます。

しかし、これらのフォーマットはすべてのブラウザで対応しているわけではありません。そこで重要になるのが「フォールバック(代替表示)」の実装です。

本記事では、WebP/AVIF非対応ブラウザへのフォールバック実装方法について、picture要素を中心に、基本から応用まで実装例を踏まえて詳しく解説します。

「学習→案件獲得」につなげた受講生のリアルな体験談も公開中!
働き方を変えたい方にも響くストーリーです。

中田さん
都内の企業で10年働くも、金銭面・働き方に不満を持ち、副業や転職を考えるようになる。「在宅で稼げるようになりたい」とフリーランスになることを決意。短期集中でプログラミング学習にフルコミットした結果、復職後3ヶ月で退社→フリーランスとして活動を開始する。現在は、子育てに参加しながら、在宅で案件をこなし収入を得られるようになる。

詳しくはこちらの記事をご覧ください。

中田さんの主な制作実績はこちら


目次

WebP/AVIFとは?次世代画像フォーマットの基礎知識

ペン博士

まずは、WebPとAVIFという次世代画像フォーマットについて理解しよう!

WebP(ウェッピー)とは

WebPは、Googleが2010年に開発した画像フォーマットです。従来のJPEGやPNGと比較して、同じ品質でファイルサイズを25-35%削減できるという特徴があります。

WebPは以下の特徴を持っています:

  • 非可逆圧縮と可逆圧縮の両方に対応:JPEGのような非可逆圧縮と、PNGのような可逆圧縮の両方をサポート
  • 透過(アルファチャンネル)に対応:PNGのように背景透過が可能
  • アニメーションに対応:GIFのようなアニメーション画像も作成可能
  • 広いブラウザ対応:主要ブラウザのほとんどで対応済み(2020年以降)

AVIF(エーブイアイエフ)とは

AVIFは、Alliance for Open Mediaが開発した比較的新しい画像フォーマットです(2019年リリース)。WebPよりもさらに高い圧縮率を実現し、WebPと比較しても約20-30%のファイルサイズ削減が可能です。

AVIFの特徴:

  • 優れた圧縮率:現在最も効率的な画像圧縮を実現
  • 高画質:小さいファイルサイズでも高い画質を維持
  • HDR対応:ハイダイナミックレンジ(HDR)にも対応
  • 透過・アニメーション対応:WebPと同様の機能をサポート
  • ブラウザ対応が限定的:比較的新しいため、対応ブラウザは限られる

従来フォーマットとのファイルサイズ比較

同じ画質の画像を異なるフォーマットで保存した場合のファイルサイズを比較してみましょう:

画像フォーマットファイルサイズ削減率画質
JPEG(ベースライン)100KB
PNG150KB+50%最高(可逆)
WebP70KB-30%
AVIF50KB-50%

この表からわかるように、AVIFを使用すれば、従来のJPEGと比較して約半分のファイルサイズで同等の画質を実現できます。


WebP/AVIFを使用するメリット

生徒

WebP/AVIFを使用するメリットって何ですか?

ペン博士

良い質問じゃ!ここでは、WebP/AVIFを使用するメリットについて解説するぞ!

1. ページ読み込み速度の大幅な改善

画像ファイルサイズが小さくなることで、ページ全体の読み込み時間が短縮されます。特にモバイル環境や通信速度が遅い環境では、その効果が顕著に現れます。

実際の効果:

  • 画像総容量が10MBのページの場合、WebPに変換すると約7MBに削減
  • AVIFを使用すればさらに約5MBまで削減可能
  • 4G回線(10Mbps)の場合、読み込み時間が8秒から4秒に短縮

2. Core Web Vitalsの改善

Googleが重視するCore Web Vitals(コアウェブバイタル)の指標、特にLCP(Largest Contentful Paint)の改善に直接貢献します。

LCPとは、ページの主要コンテンツ(多くの場合、大きな画像)が表示されるまでの時間を測定する指標です。次世代画像フォーマットを使用することで:

  • 画像の読み込み時間が短縮される
  • LCPスコアが改善される
  • SEO評価が向上する

3. 帯域幅とサーバーコストの削減

ファイルサイズが小さくなることで、サーバーからの転送データ量が削減され、以下のメリットがあります:

  • サーバー負荷の軽減:転送データ量が減ることでサーバーへの負担が軽減
  • CDN費用の削減:転送データ量に応じた課金の場合、コスト削減につながる
  • ユーザーのデータ通信量削減:モバイルユーザーのデータ使用量を抑える

4. ユーザーエクスペリエンスの向上

ページ読み込みが速いサイトは、ユーザー満足度が高くなります:

  • 直帰率の低下:ページ読み込みが遅いと、ユーザーは離脱しやすい
  • コンバージョン率の向上:読み込み速度が1秒改善するとコンバージョン率が約7%向上するというデータも
  • SEOランキングの向上:Googleはページ速度を検索ランキングの要因としている

ブラウザ対応状況と課題

ペン博士

次世代画像フォーマットの最大の課題は、すべてのブラウザで対応しているわけではないという点じゃ。

WebPのブラウザ対応状況

WebPは比較的広くサポートされています(2026年2月時点):

  • Chrome:バージョン32以降(2014年〜)
  • Firefox:バージョン65以降(2019年〜)
  • Edge:バージョン18以降(2018年〜)
  • Safari:バージョン14以降(2020年〜)
  • Opera:バージョン19以降(2014年〜)
  • Safari iOS:iOS 14以降(2020年〜)
  • Internet Explorer:非対応

世界のブラウザシェアで見ると、約98.4%のユーザーがWebPをサポートしているブラウザを使用しています。

AVIFのブラウザ対応状況

AVIFは比較的新しいため、対応ブラウザは限られています:

  • Chrome:バージョン85以降(2020年〜)
  • Firefox:バージョン93以降(2021年〜)
  • Edge:バージョン121以降(2024年〜)
  • Safari:バージョン16.1以降(2022年〜)
  • Opera:バージョン71以降(2020年〜)
  • Safari iOS:iOS 16以降(2022年〜)
  • Internet Explorer:非対応

世界のブラウザシェアで見ると、約80-85%のユーザーがAVIFをサポートしているブラウザを使用しています。

なぜフォールバックが必要なのか?

上記の対応状況から、以下の課題が見えてきます:

  • 古いブラウザユーザーへの配慮:Internet ExplorerやSafari 13以前のユーザーは、WebPを表示できません
  • AVIFの対応率:約15-20%のユーザーはAVIFを表示できません
  • 企業向けサイトの考慮:企業によっては古いブラウザの使用を強制されているケースもある

そのため、すべてのユーザーに最適な体験を提供するために、フォールバック実装が必須となります。

生徒

なるほど!すべてのブラウザで対応しているわけじゃないから、対応していないブラウザ用に代わりの画像を用意する必要があるんですね。

ペン博士

その通りじゃ!それが「フォールバック」という考え方なんじゃよ。次は、具体的な実装方法を見ていくぞい。


picture要素を使ったフォールバック実装【基本編】

生徒

フォールバックの実装方法を教えてください!

ペン博士

うむ。フォールバック実装の最もシンプルで効果的な方法は、HTML5のpicture要素を使用する方法じゃ!

picture要素とは?

picture要素は、レスポンシブ画像を実装するためのHTML5の要素です。複数の画像ソースを指定し、ブラウザが自動的に最適な画像を選択して表示します。

picture要素の構成:

  • <picture>:コンテナ要素
  • <source>:複数の画像ソースを指定(type属性でMIMEタイプを指定)
  • <img>:フォールバック用の画像(必須)

基本的な実装例

WebPとJPEGのフォールバックを実装する基本的なコードは以下の通りです:

<picture>
  <!-- WebP形式の画像 -->
  <source srcset="image.webp" type="image/webp">
  <!-- フォールバック用JPEG画像 -->
  <img src="image.jpg" alt="画像の説明" loading="lazy">
</picture>

コード解説

  1. <picture>要素:複数の画像ソースをグループ化します
  2. <source srcset=”image.webp” type=”image/webp”>
    • srcset属性でWebP形式の画像パスを指定
    • type="image/webp"でMIMEタイプを明示
    • ブラウザがWebPに対応している場合、この画像が使用される
  3. <img src=”image.jpg”>
    • WebPに対応していないブラウザで表示される画像
    • alt属性でアクセシビリティを確保
    • loading="lazy"で遅延読み込みを有効化(オプション)

AVIF + WebP + JPEGの多段フォールバック

さらに最適化するために、AVIF、WebP、JPEGの3段階フォールバックを実装します:

<picture>
  <!-- AVIF形式の画像(最優先) -->
  <source srcset="image.avif" type="image/avif">
  <!-- WebP形式の画像(第2候補) -->
  <source srcset="image.webp" type="image/webp">
  <!-- JPEG形式の画像(フォールバック) -->
  <img src="image.jpg" alt="画像の説明" loading="lazy" width="800" height="600">
</picture>

重要なポイント

source要素の順序が重要:
1. 最も効率的なフォーマット(AVIF)を最初に記述
2. 次に効率的なフォーマット(WebP)を記述
3. 最後に互換性の高いフォーマット(JPEG/PNG)を記述

ブラウザは上から順に確認し、最初に対応している形式の画像を表示します。

動作の仕組み

ブラウザは以下のロジックで画像を選択します:

  1. Chrome 85+の場合
    • AVIFに対応しているため、image.avifを読み込む
    • ファイルサイズ:約50KB
  2. Safari 14-16の場合
    • AVIFに非対応、WebPに対応
    • image.webpを読み込む
    • ファイルサイズ:約70KB
  3. Internet Explorer 11の場合
    • AVIF、WebP両方に非対応
    • image.jpgを読み込む
    • ファイルサイズ:約100KB

このように、各ブラウザで最適な画像フォーマットが自動的に選択され、すべてのユーザーに画像が表示される仕組みです。


レスポンシブ画像とフォールバックの組み合わせ【応用編】

生徒

picture要素の応用方法も教えてください!

ペン博士

良い心がけじゃ!picture要素は、画像フォーマットのフォールバックだけでなく、画面サイズに応じた画像の出し分けにも使用できるぞ!

画面サイズとフォーマットの両方に対応する実装

デスクトップとモバイルで異なる画像を表示しつつ、各デバイスで最適なフォーマットを提供する実装例です:

<picture>
  <!-- デスクトップ向け(1024px以上) -->
  <source
    media="(min-width: 1024px)"
    srcset="hero-desktop.avif"
    type="image/avif">
  <source
    media="(min-width: 1024px)"
    srcset="hero-desktop.webp"
    type="image/webp">
  <source
    media="(min-width: 1024px)"
    srcset="hero-desktop.jpg"
    type="image/jpeg">
  <!-- タブレット向け(768px以上) -->
  <source
    media="(min-width: 768px)"
    srcset="hero-tablet.avif"
    type="image/avif">
  <source
    media="(min-width: 768px)"
    srcset="hero-tablet.webp"
    type="image/webp">
  <source
    media="(min-width: 768px)"
    srcset="hero-tablet.jpg"
    type="image/jpeg">
  <!-- モバイル向け(デフォルト) -->
  <source srcset="hero-mobile.avif" type="image/avif">
  <source srcset="hero-mobile.webp" type="image/webp">
  <!-- フォールバック -->
  <img src="hero-mobile.jpg" alt="ヒーロー画像" loading="lazy" width="1920" height="1080">
</picture>

コード解説

・media属性:メディアクエリを指定し、画面サイズに応じて画像を切り替え
各画面サイズで3つのフォーマットを用意AVIF → WebP → JPEG の優先順位
・ブラウザの選択ロジック

1. まず画面サイズに合致するmedia属性を持つsource要素を探す
2. 該当するsource要素の中から、対応しているフォーマットを選択
3. どれも該当しない場合はimg要素のsrcを使用

高解像度ディスプレイ(Retina)対応

Retinaディスプレイなどの高解像度画面にも対応する実装例:

<picture>
  <!-- 2x解像度(Retina)向けAVIF -->
  <source
    srcset="image-1x.avif 1x, image-2x.avif 2x"
    type="image/avif">
  <!-- 2x解像度(Retina)向けWebP -->
  <source
    srcset="image-1x.webp 1x, image-2x.webp 2x"
    type="image/webp">
  <!-- フォールバック(解像度対応) -->
  <img
    src="image-1x.jpg"
    srcset="image-1x.jpg 1x, image-2x.jpg 2x"
    alt="画像の説明"
    loading="lazy">
</picture>

解像度対応のポイント

・1x:通常のディスプレイ用(標準解像度)
2x高解像度ディスプレイ用(Retina、4Kなど)
ブラウザは自動的にデバイスの解像度に応じた画像を選択


.htaccessを使ったサーバー側フォールバック【サーバー設定編】

生徒

他にはどんな方法があるのですか?

ペン博士

Apacheサーバーを使用している場合、.htaccessファイルでサーバー側のフォールバックを実装することも可能じゃ!

.htaccessによる自動フォールバックの仕組み

この方法では、HTMLを変更せずに、サーバー側でブラウザの対応状況を判定し、自動的に最適な画像を配信します。

<IfModule mod_rewrite.c>
  RewriteEngine On
  # AVIFサポートのチェック
  RewriteCond %{HTTP_ACCEPT} image/avif
  RewriteCond %{REQUEST_FILENAME} (.*)\.(jpe?g|png)$
  RewriteCond %1\.avif -f
  RewriteRule ^ %1\.avif [L]
  # WebPサポートのチェック
  RewriteCond %{HTTP_ACCEPT} image/webp
  RewriteCond %{REQUEST_FILENAME} (.*)\.(jpe?g|png)$
  RewriteCond %1\.webp -f
  RewriteRule ^ %1\.webp [L]
</IfModule>
<IfModule mod_headers.c>
  <FilesMatch "\.(jpe?g|png)$">
    Header append Vary Accept
  </FilesMatch>
</IfModule>

コード解説

  1. mod_rewriteの有効化
    • URLリライト機能を有効にする
  2. AVIFサポートのチェック
    • %{HTTP_ACCEPT} image/avif:ブラウザがAVIFに対応しているか確認
    • %1\.avif -f:対応するAVIFファイルが存在するか確認
    • 条件が満たされれば、AVIF画像を配信
  3. WebPサポートのチェック
    • AVIFが使えない場合、WebPをチェック
    • 同様の条件で判定し、WebP画像を配信
  4. Varyヘッダーの追加
    • キャッシュが正しく動作するよう、Acceptヘッダーに基づいて変化することを明示

.htaccess方式のメリットとデメリット

メリット:

  • HTMLを変更する必要がない
  • 既存のimg要素がそのまま使える
  • 一度設定すれば、すべての画像に適用される

デメリット:

  • Apacheサーバーのみ対応(Nginxでは別の設定が必要)
  • mod_rewriteモジュールが有効である必要がある
  • サーバーの設定変更権限が必要
  • CDN使用時は動作しない場合がある

JavaScriptを使った動的フォールバック【JavaScript編】

ペン博士

他にもJavaScriptを使用して、ブラウザの画像フォーマット対応状況を検出し、動的に画像を切り替える方法もあるのじゃ!

生徒

そうなんですね!教えてください!

画像フォーマット対応検出コード

// 画像フォーマット対応を検出する関数
async function checkImageFormatSupport() {
  const formats = {
    avif: 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=',
    webp: 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoBAAEAAwA0JaQAA3AA/vuUAAA='
  };
  const support = {};
  for (const [format, dataUrl] of Object.entries(formats)) {
    support[format] = await new Promise((resolve) => {
      const img = new Image();
      img.onload = () => resolve(true);
      img.onerror = () => resolve(false);
      img.src = dataUrl;
    });
  }
  return support;
}
// 使用例
checkImageFormatSupport().then((support) => {
  console.log('AVIF対応:', support.avif);
  console.log('WebP対応:', support.webp);
  // HTML要素にクラスを追加
  if (support.avif) {
    document.documentElement.classList.add('avif');
  } else if (support.webp) {
    document.documentElement.classList.add('webp');
  }
});

CSSと組み合わせた背景画像のフォールバック

JavaScriptで検出したフォーマット対応状況をCSSクラスとして追加し、背景画像を切り替える方法:

/* デフォルト(JPEG/PNG) */
.hero-section {
  background-image: url('hero.jpg');
}
/* WebP対応ブラウザ */
.webp .hero-section {
  background-image: url('hero.webp');
}
/* AVIF対応ブラウザ */
.avif .hero-section {
  background-image: url('hero.avif');
}

遅延読み込みと組み合わせた実装

Intersection Observer APIを使って、画面に表示されるタイミングで最適なフォーマットの画像を読み込む実装:

// 画像の遅延読み込みとフォーマット選択
class AdaptiveImageLoader {
  constructor() {
    this.formatSupport = null;
    this.init();
  }
  async init() {
    // フォーマット対応を検出
    this.formatSupport = await this.checkFormats();
    // Intersection Observerを設定
    this.setupObserver();
  }
  async checkFormats() {
    const formats = {
      avif: 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=',
      webp: 'data:image/webp;base64,UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoBAAEAAwA0JaQAA3AA/vuUAAA='
    };
    const support = {};
    for (const [format, dataUrl] of Object.entries(formats)) {
      support[format] = await new Promise((resolve) => {
        const img = new Image();
        img.onload = () => resolve(true);
        img.onerror = () => resolve(false);
        img.src = dataUrl;
      });
    }
    return support;
  }
  setupObserver() {
    const images = document.querySelectorAll('img[data-src]');
    const observer = new IntersectionObserver((entries) => {
      entries.forEach((entry) => {
        if (entry.isIntersecting) {
          this.loadImage(entry.target);
          observer.unobserve(entry.target);
        }
      });
    });
    images.forEach((img) => observer.observe(img));
  }
  loadImage(img) {
    const basePath = img.dataset.src;
    let imagePath;
    // 対応フォーマットに応じて画像パスを決定
    if (this.formatSupport.avif) {
      imagePath = basePath.replace(/\.(jpg|png)$/, '.avif');
    } else if (this.formatSupport.webp) {
      imagePath = basePath.replace(/\.(jpg|png)$/, '.webp');
    } else {
      imagePath = basePath;
    }
    // 画像を読み込む
    img.src = imagePath;
    img.removeAttribute('data-src');
  }
}
// 初期化
new AdaptiveImageLoader();

HTML側の記述

<!-- data-src属性に元の画像パスを指定 -->
<img data-src="images/photo.jpg" alt="写真" class="lazy-image">

ビルドツールを使った自動画像変換【開発環境構築編】

生徒

画像を変換したいのですが、すごく手間がかかります…どうすれば良いですか?

ペン博士

手動で複数のフォーマットの画像を用意するのは大変じゃ。ビルドツールを使って自動化するのじゃ!

Webpackでの自動変換設定

webpack-image-loaderとimage-webpack-loaderを使った設定例:

// webpack.config.js
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin');
module.exports = {
  module: {
    rules: [
      {
        test: /\.(jpe?g|png)$/i,
        type: 'asset/resource',
        generator: {
          filename: 'images/[name][ext]'
        }
      }
    ]
  },
  plugins: [
    new ImageMinimizerPlugin({
      generator: [
        {
          // AVIF生成
          preset: 'avif',
          implementation: ImageMinimizerPlugin.sharpGenerate,
          options: {
            encodeOptions: {
              avif: {
                quality: 80
              }
            }
          }
        },
        {
          // WebP生成
          preset: 'webp',
          implementation: ImageMinimizerPlugin.sharpGenerate,
          options: {
            encodeOptions: {
              webp: {
                quality: 85
              }
            }
          }
        }
      ]
    })
  ]
};

Gulpでの自動変換タスク

// gulpfile.js
const gulp = require('gulp');
const imagemin = require('gulp-imagemin');
const webp = require('gulp-webp');
const avif = require('gulp-avif');
// WebP変換タスク
gulp.task('webp', () => {
  return gulp.src('src/images/**/*.{jpg,png}')
    .pipe(webp({ quality: 85 }))
    .pipe(gulp.dest('dist/images'));
});
// AVIF変換タスク
gulp.task('avif', () => {
  return gulp.src('src/images/**/*.{jpg,png}')
    .pipe(avif({ quality: 80 }))
    .pipe(gulp.dest('dist/images'));
});
// 元画像の最適化
gulp.task('images', () => {
  return gulp.src('src/images/**/*.{jpg,png}')
    .pipe(imagemin())
    .pipe(gulp.dest('dist/images'));
});
// すべての画像処理を実行
gulp.task('default', gulp.parallel('webp', 'avif', 'images'));

Next.jsでの自動最適化

Next.jsのImageコンポーネントは、自動的に最適なフォーマットで画像を配信します:

// next.config.js
module.exports = {
  images: {
    formats: ['image/avif', 'image/webp'],
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  }
};
// Reactコンポーネント内
import Image from 'next/image';
function MyComponent() {
  return (
    <Image
      src="/images/photo.jpg"
      alt="写真"
      width={800}
      height={600}
      priority={false}
    />
  );
}

Next.jsは自動的に:

  • ブラウザ対応に応じてAVIF/WebP/JPEGを配信
  • デバイスサイズに応じた画像サイズを生成
  • 遅延読み込みを実装
  • 画像を最適化してキャッシュ

パフォーマンス測定と最適化

ペン博士

フォールバック実装後、実際にどの程度パフォーマンスが改善されたかを測定することが重要じゃ!詳しく解説するからよーく聞くのじゃぞ!

生徒

分かりました!よろしくお願いします!

Chrome DevToolsでの確認方法

Chrome DevToolsのNetworkタブで、実際に読み込まれている画像フォーマットを確認できます:

  1. Chrome DevToolsを開く(F12キー)
  2. Networkタブを選択
  3. Imgフィルターを選択
  4. ページをリロード
  5. 読み込まれた画像のTypeカラムでフォーマットを確認

Lighthouse でのパフォーマンススコア測定

Lighthouseを使って、画像最適化の効果を数値で確認できます:

  1. Chrome DevToolsのLighthouseタブを開く
  2. 「Performance」を選択してレポート生成
  3. 「Opportunities」セクションで画像関連の改善提案を確認

WebP/AVIFを適切に実装すると、以下の項目でスコアが改善します:

  • Largest Contentful Paint (LCP):メイン画像の読み込み時間が短縮
  • Total Blocking Time (TBT):画像処理によるブロッキング時間が減少
  • Speed Index:ページの視覚的な読み込み速度が向上

実際のパフォーマンス改善事例

WithCodeメディアサイトで次世代画像フォーマットを導入した際の改善データ:

指標導入前WebP導入後AVIF導入後
画像総容量8.2MB5.8MB (-29%)4.1MB (-50%)
LCP3.8秒2.4秒 (-37%)1.9秒 (-50%)
Lighthouseスコア72点88点 (+16)94点 (+22)
直帰率45%38% (-7%)32% (-13%)

AVIFを導入することで、画像容量が半分になり、LCPが50%改善、Lighthouseスコアが22点向上しました。


よくある質問と注意点

Q1: すべての画像をWebP/AVIFに変換すべきですか?

A: 基本的には推奨しますが、以下の場合は例外です:

  • 非常に小さい画像(5KB以下):変換のオーバーヘッドがメリットを上回る可能性
  • アイコンやロゴ:SVGの方が適している場合が多い
  • 印刷用画像:色空間の問題でPNGやTIFFが適切

Q2: picture要素はSEOに影響しますか?

A: picture要素自体はSEOに悪影響を与えません。むしろ、以下の理由でSEOに好影響です:

  • ページ読み込み速度が向上(Googleのランキング要因)
  • Core Web Vitalsの改善
  • モバイルユーザーエクスペリエンスの向上

ただし、img要素のalt属性は必ず設定してください。検索エンジンはimg要素のaltを参照します。

Q3: CDNでWebP/AVIFを配信できますか?

A: 多くのCDNがWebP/AVIFの自動変換・配信に対応しています:

  • Cloudflare:Polish機能でWebP/AVIFを自動配信
  • Cloudinary:自動フォーマット選択機能(f_auto)
  • Imgix:auto=formatパラメータで自動最適化
  • AWS CloudFront + Lambda@Edge:カスタムロジックで実装可能

Q4: 画像の品質設定はどうすべきですか?

A: 推奨される品質設定:

  • AVIF:quality 75-85(AVIFは高圧縮なので低めでもOK)
  • WebP:quality 80-90
  • JPEG:quality 85-90(フォールバック用なので品質重視)

写真の種類によって調整してください:

  • 風景写真:やや低め(70-80)でも許容
  • 人物写真:高め(85-90)を推奨
  • 製品写真:高品質(90-95)が望ましい

Q5: OGP画像もWebP/AVIFにすべきですか?

A: OGP(Open Graph Protocol)画像はJPEG/PNGのままにすることを推奨します。

理由:

  • すべてのSNSプラットフォームがWebP/AVIFに対応しているわけではない
  • Facebook、Twitter、LINEなどは従来フォーマットを推奨
  • シェア時に画像が表示されないリスクを避けるため
生徒

picture要素を使えば、JavaScriptなしで簡単にフォールバックが実装できるんですね!早速試してみます。

ペン博士

その意気じゃ!画像最適化はWebパフォーマンス改善の要じゃからな。まずは1つのページから試して、効果を確認してみるんじゃぞ!

生徒

はい!今回も勉強になりました!ありがとうございます!


まとめ

本記事では、WebP/AVIF非対応ブラウザへのフォールバック実装方法について、実践的な内容を解説しました。

重要なポイントは以下の通りです。

・次世代画像フォーマットのメリット:WebPで約30%、AVIFで約50%のファイルサイズ削減が可能
・picture要素を使った実装:HTMLだけで簡単にフォールバックを実装でき、すべてのブラウザで画像が表示される
source要素の順序:AVIF → WebP → JPEG/PNG の順で記述することが重要
パフォーマンスへの影響:LCPが最大50%改善し、Core Web Vitalsスコアが大幅に向上
ビルドツールでの自動化:Webpack、Gulp、Next.jsなどで複数フォーマットを自動生成できる
・CDNとの組み合わせ
:CloudflareやCloudinaryなどのCDNで自動配信が可能

適切なフォールバック実装により、すべてのユーザーに最適な画像を提供しながら、ページパフォーマンスを最大化できます

まずは既存サイトの大きな画像からWebP/AVIFへの変換を始めてみましょう。Lighthouseでスコアを測定しながら、段階的に最適化を進めていくことをおすすめします。


WithCodeを体験できる初級コース公開中!

初級コース(¥49,800)が完全無料に!

  • 期間:1週間
  • 学習内容: ロードマップ/基礎知識/環境構築/HTML/CSS/LP・ポートフォリオ作成 → 正しい学習方法で「確かな成長」を実感できるカリキュラム

副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?

未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!

この記事を書いた人

WithCode(ウィズコード)は「目指すなら稼げる人材」をビジョンに、累計400名以上のフリーランスを輩出してきた超実践型プログラミングスクールです。150社以上の実案件支援を特徴にWeb制作・Webデザインなどの役立つ情報を現場のノウハウに基づいて発信していきます。

– service –WithCodeの運営サービス

  • WithCode
    - ウィズコード -

    スクール

    「未経験」から
    現場で通用する
    スキルを身に付けよう!

    詳細はこちら
  • WithFree
    - ウィズフリ -

    実案件サポート

    制作会社のサポート下で
    実務経験を積んでいこう!

    詳細はこちら
  • WithCareer
    - ウィズキャリ -

    就転職サポート

    大手エージェントのサポート下で
    キャリアアップを目指そう!

    詳細はこちら

公式サイト より
今すぐ
無料カウンセリング
予約!

目次