Skip to main content

画像フォーマットの選択

目的に合った最適な画像フォーマットを選択することが重要です。

モダンフォーマットの活用

<!-- 次世代フォーマットの使用例 -->
<picture>
  <source srcset="image.avif" type="image/avif">
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="説明文" width="800" height="600">
</picture>
WebPはほとんどのモダンブラウザでサポートされており、JPEGと比較して30%程度のファイルサイズ削減が期待できます。 AVIFはさらに優れた圧縮率を提供しますが、ブラウザサポートはWebPより限定的です。

用途別の推奨フォーマット

コンテンツタイプ推奨フォーマット代替フォーマット
写真AVIF, WebPJPEG
アイコン、ロゴSVGWebP, PNG
アニメーションWebPGIF
透過が必要な画像WebP, PNGPNG-8

レスポンシブ画像

デバイスのサイズに応じて適切な画像を提供することで、帯域幅を節約します。
<img 
  srcset="small.jpg 400w, medium.jpg 800w, large.jpg 1200w" 
  sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
  src="fallback.jpg" 
  alt="説明文">

アートディレクション

画面サイズによって、異なるアスペクト比や構図の画像を表示できます。
<picture>
  <source media="(max-width: 600px)" srcset="mobile-crop.jpg">
  <source media="(max-width: 1200px)" srcset="tablet-crop.jpg">
  <img src="desktop.jpg" alt="説明文">
</picture>

遅延読み込み

ビューポート外の画像を遅延読み込みすることで、初期ロード時間を短縮します。
<!-- ネイティブ遅延読み込み -->
<img src="image.jpg" loading="lazy" alt="説明文">

<!-- Intersection Observer APIを使用した遅延読み込み -->
<img data-src="image.jpg" class="lazy" alt="説明文">
// JavaScript実装例
document.addEventListener("DOMContentLoaded", function() {
  const lazyImages = document.querySelectorAll("img.lazy");
  
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        observer.unobserve(img);
      }
    });
  });
  
  lazyImages.forEach(img => observer.observe(img));
});

画像のサイズ最適化

適切なサイズ指定

<!-- 画像サイズの明示によるCLSの防止 -->
<img 
  src="image.jpg" 
  width="800" 
  height="600" 
  alt="説明文">
widthheight属性を指定することで、Cumulative Layout Shift (CLS)を防止できます。 これにより、画像が読み込まれる前にブラウザが適切なスペースを確保できます。

画像CDNの活用

<!-- Cloudinaryの例 -->
<img 
  src="https://res.cloudinary.com/example/image/upload/w_800,q_auto,f_auto/sample.jpg" 
  alt="説明文">
URLパラメータを使って、動的に画像を変換できます:
  • w_800: 幅800pxに変換
  • q_auto: 品質の自動最適化
  • f_auto: フォーマットの自動選択

アクセシビリティ対応

<!-- 良い例 -->
<img 
  src="chart.png" 
  alt="2023年度の四半期売上グラフ: Q1: 100万円、Q2: 150万円、Q3: 120万円、Q4: 200万円" 
  width="600" 
  height="400">

<!-- 装飾的な画像 -->
<img 
  src="decorative.jpg" 
  alt="" 
  role="presentation" 
  width="300" 
  height="200">

SVG画像のアクセシビリティ

<svg role="img" aria-labelledby="chart-title chart-desc">
  <title id="chart-title">売上チャート</title>
  <desc id="chart-desc">2023年度の四半期ごとの売上推移グラフ</desc>
  <!-- SVGの内容 -->
</svg>

画像の表示管理

object-fit の活用

/* アスペクト比を維持して、コンテナにフィットさせる */
.thumbnail {
  width: 300px;
  height: 200px;
  object-fit: cover;
  object-position: center;
}

/* 複数画像の均一表示 */
.gallery-item img {
  width: 100%;
  height: 250px;
  object-fit: cover;
}

アスペクト比の維持

/* モダンなアプローチ */
.aspect-ratio-box {
  aspect-ratio: 16 / 9;
}

/* 代替手法 */
.aspect-ratio-container {
  position: relative;
  width: 100%;
  padding-top: 56.25%; /* 16:9のアスペクト比 */
}
.aspect-ratio-container img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

パフォーマンスチェックリスト

  1. モダンフォーマット(WebP/AVIF)を使用する
  2. レスポンシブ画像技術を活用する
  3. ファイルサイズを最適化する(必要以上に大きな画像を避ける)
  4. 遅延読み込みを実装する
  5. 画像のサイズを明示する(width/height属性)
  6. 画像を圧縮する(lossyまたはlossless)
  7. キャッシュ戦略を適用する

便利なツールとリソース

画像最適化はウェブパフォーマンスの中でも、比較的少ない労力で大きな改善が見込める領域です。 特に大きな画像を多用するサイトでは、最適化による効果が顕著に現れます。