



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp









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



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



そういう方法があるんですね!はい!よろしくお願いします!
Webサイトのパフォーマンス改善において、画像の最適化は非常に重要な要素です。特に、次世代画像フォーマットであるWebPやAVIFを使用することで、ページの読み込み速度を大幅に向上させることができます。
しかし、これらのフォーマットはすべてのブラウザで対応しているわけではありません。そこで重要になるのが「フォールバック(代替表示)」の実装です。
本記事では、WebP/AVIF非対応ブラウザへのフォールバック実装方法について、picture要素を中心に、基本から応用まで実装例を踏まえて詳しく解説します。
「学習→案件獲得」につなげた受講生のリアルな体験談も公開中!
働き方を変えたい方にも響くストーリーです。
中田さん
都内の企業で10年働くも、金銭面・働き方に不満を持ち、副業や転職を考えるようになる。「在宅で稼げるようになりたい」とフリーランスになることを決意。短期集中でプログラミング学習にフルコミットした結果、復職後3ヶ月で退社→フリーランスとして活動を開始する。現在は、子育てに参加しながら、在宅で案件をこなし収入を得られるようになる。
詳しくはこちらの記事をご覧ください。


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





まずは、WebPとAVIFという次世代画像フォーマットについて理解しよう!
WebPは、Googleが2010年に開発した画像フォーマットです。従来のJPEGやPNGと比較して、同じ品質でファイルサイズを25-35%削減できるという特徴があります。
WebPは以下の特徴を持っています:
AVIFは、Alliance for Open Mediaが開発した比較的新しい画像フォーマットです(2019年リリース)。WebPよりもさらに高い圧縮率を実現し、WebPと比較しても約20-30%のファイルサイズ削減が可能です。
AVIFの特徴:
同じ画質の画像を異なるフォーマットで保存した場合のファイルサイズを比較してみましょう:
| 画像フォーマット | ファイルサイズ | 削減率 | 画質 |
|---|---|---|---|
| JPEG(ベースライン) | 100KB | – | 高 |
| PNG | 150KB | +50% | 最高(可逆) |
| WebP | 70KB | -30% | 高 |
| AVIF | 50KB | -50% | 高 |
この表からわかるように、AVIFを使用すれば、従来のJPEGと比較して約半分のファイルサイズで同等の画質を実現できます。





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



良い質問じゃ!ここでは、WebP/AVIFを使用するメリットについて解説するぞ!
画像ファイルサイズが小さくなることで、ページ全体の読み込み時間が短縮されます。特にモバイル環境や通信速度が遅い環境では、その効果が顕著に現れます。
実際の効果:
Googleが重視するCore Web Vitals(コアウェブバイタル)の指標、特にLCP(Largest Contentful Paint)の改善に直接貢献します。
LCPとは、ページの主要コンテンツ(多くの場合、大きな画像)が表示されるまでの時間を測定する指標です。次世代画像フォーマットを使用することで:
ファイルサイズが小さくなることで、サーバーからの転送データ量が削減され、以下のメリットがあります:
ページ読み込みが速いサイトは、ユーザー満足度が高くなります:





次世代画像フォーマットの最大の課題は、すべてのブラウザで対応しているわけではないという点じゃ。
WebPは比較的広くサポートされています(2026年2月時点):
世界のブラウザシェアで見ると、約98.4%のユーザーがWebPをサポートしているブラウザを使用しています。
AVIFは比較的新しいため、対応ブラウザは限られています:
世界のブラウザシェアで見ると、約80-85%のユーザーがAVIFをサポートしているブラウザを使用しています。
上記の対応状況から、以下の課題が見えてきます:
そのため、すべてのユーザーに最適な体験を提供するために、フォールバック実装が必須となります。



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



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





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



うむ。フォールバック実装の最もシンプルで効果的な方法は、HTML5のpicture要素を使用する方法じゃ!
picture要素は、レスポンシブ画像を実装するためのHTML5の要素です。複数の画像ソースを指定し、ブラウザが自動的に最適な画像を選択して表示します。
picture要素の構成:
WebPとJPEGのフォールバックを実装する基本的なコードは以下の通りです:
<picture>
<!-- WebP形式の画像 -->
<source srcset="image.webp" type="image/webp">
<!-- フォールバック用JPEG画像 -->
<img src="image.jpg" alt="画像の説明" loading="lazy">
</picture>srcset属性でWebP形式の画像パスを指定type="image/webp"でMIMEタイプを明示alt属性でアクセシビリティを確保loading="lazy"で遅延読み込みを有効化(オプション)さらに最適化するために、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)を記述
ブラウザは上から順に確認し、最初に対応している形式の画像を表示します。
ブラウザは以下のロジックで画像を選択します:
image.avifを読み込むimage.webpを読み込むimage.jpgを読み込むこのように、各ブラウザで最適な画像フォーマットが自動的に選択され、すべてのユーザーに画像が表示される仕組みです。





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ディスプレイなどの高解像度画面にも対応する実装例:
<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など)
・ブラウザは自動的にデバイスの解像度に応じた画像を選択





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



Apacheサーバーを使用している場合、.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>%{HTTP_ACCEPT} image/avif:ブラウザがAVIFに対応しているか確認%1\.avif -f:対応するAVIFファイルが存在するか確認メリット:
デメリット:





他にも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');
}
});
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();<!-- data-src属性に元の画像パスを指定 -->
<img data-src="images/photo.jpg" alt="写真" class="lazy-image">




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



手動で複数のフォーマットの画像を用意するのは大変じゃ。ビルドツールを使って自動化するのじゃ!
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
}
}
}
}
]
})
]
};// 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の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は自動的に:





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



分かりました!よろしくお願いします!
Chrome DevToolsのNetworkタブで、実際に読み込まれている画像フォーマットを確認できます:


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


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


WithCodeメディアサイトで次世代画像フォーマットを導入した際の改善データ:
| 指標 | 導入前 | WebP導入後 | AVIF導入後 |
|---|---|---|---|
| 画像総容量 | 8.2MB | 5.8MB (-29%) | 4.1MB (-50%) |
| LCP | 3.8秒 | 2.4秒 (-37%) | 1.9秒 (-50%) |
| Lighthouseスコア | 72点 | 88点 (+16) | 94点 (+22) |
| 直帰率 | 45% | 38% (-7%) | 32% (-13%) |
AVIFを導入することで、画像容量が半分になり、LCPが50%改善、Lighthouseスコアが22点向上しました。


A: 基本的には推奨しますが、以下の場合は例外です:
A: picture要素自体はSEOに悪影響を与えません。むしろ、以下の理由でSEOに好影響です:
ただし、img要素のalt属性は必ず設定してください。検索エンジンはimg要素のaltを参照します。
A: 多くのCDNがWebP/AVIFの自動変換・配信に対応しています:
A: 推奨される品質設定:
写真の種類によって調整してください:
A: OGP(Open Graph Protocol)画像はJPEG/PNGのままにすることを推奨します。
理由:



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でスコアを測定しながら、段階的に最適化を進めていくことをおすすめします。


副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
公式サイト より
今すぐ
無料カウンセリング
を予約!