ぱんだツールズぱんだツールズ

画像フォーマット

レスポンシブ画像のsrcsetとは — 画像を複数サイズ用意してページ表示を高速化する方法

約6分

PageSpeed Insightsで「適切なサイズの画像を指定してください」と指摘された、 スマホで見ると画像の読み込みだけやたら時間がかかる—— Web制作をしていると一度は突き当たるこの問題の多くは、PC用に書き出した1枚の大きな画像を、スマホにもそのまま配信していることが原因です。 この記事では、その解決策であるsrcset・sizes属性の仕組みと、 複数解像度の画像を用意する具体的な手順を解説します。

なぜ1枚の画像だけでは足りないのか

PCの大きな画面とスマホの小さな画面では、画像に必要な解像度がまったく異なります。 PCでは横幅1920pxのヒーロー画像を表示する一方、スマホでは横幅375px程度でしか表示されません。 にもかかわらず同じ1920px幅の画像を配信すると、スマホ側では表示に不要な情報量まで一緒にダウンロードしてしまうことになります。

さらに話をややこしくしているのがRetinaディスプレイ(高精細ディスプレイ)の存在です。 DPR(Device Pixel Ratio、デバイスピクセル比)が2の端末では、 CSS上の表示幅が同じでも実際には2倍の解像度で描画されるため、 見た目の幅だけを基準に画像サイズを決めると、Retinaディスプレイでは画像がぼやけて見えてしまいます。

つまり「PC・スマホ」という画面幅の違いと、「標準・Retina」という画面密度の違いの 2軸を同時に満たす必要があり、1枚の画像だけでは全端末に最適化することはできません。

srcset・sizes属性の構文

srcset属性を使うと、1つの<img>タグに複数の画像候補を指定でき、 ブラウザが画面状況に応じて最適な1枚だけを選んでダウンロードします。 記述子には幅記述子(w)倍率記述子(x)の2種類があります。

記述子記述例意味向いている用途
幅記述子(w)image-1280.jpg 1280w画像の実際の幅が1280pxである表示幅がレイアウトで変化する画像
倍率記述子(x)[email protected] 2x標準解像度の2倍で書き出した画像である表示サイズが固定のロゴ・アイコン

w記述子を使う場合は、sizes属性で「その画像が実際にどれくらいの幅で表示されるか」を あわせて宣言する必要があります。

<img
  src="image-1280.jpg"
  srcset="image-640.jpg 640w, image-1280.jpg 1280w, image-1920.jpg 1920w"
  sizes="(max-width: 600px) 100vw, 50vw"
  alt="商品写真"
>

この例では「画面幅が600px以下ならビューポート幅の100%、それ以外は50%で表示する」とsizesで宣言しています。 ブラウザはこの宣言と実際の画面幅・DPRを掛け合わせて必要な実ピクセル数を計算し、 srcsetの候補の中から過不足のない1枚を選びます。 sizesを省略すると、ブラウザはビューポート幅いっぱいに表示されると仮定してしまい、 実際より大きな画像を選んでしまうことがあるため注意が必要です。

img srcsetとpictureの使い分け

どちらも複数画像を出し分ける仕組みですが、目的が異なります。

  • <img srcset> — 同じ構図・同じ画像の解像度違いを出し分ける。 「サイズは変わるが写っているものは同じ」場合に使います。
  • <picture> — 画面幅によって構図そのものを変える 「アートディレクション」(スマホでは人物の寄り縦構図、PCでは背景込みの横構図など)や、 WebP対応ブラウザにはWebP・非対応ブラウザにはJPEGを出すフォーマット切り替えに使います。

フォーマット切り替えについてはWebP変換ツールで事前にJPEG・PNG・WebPを用意しておくと、<picture>と組み合わせやすくなります。 単純な解像度違いの出し分けだけであれば、<img srcset>だけで十分です。

Core Web Vitals(LCP)への影響

Googleがsrcset対応を推奨する最大の理由は、LCP(Largest Contentful Paint、最大コンテンツの描画時間)の改善効果です。 LCPはページ内で最も大きな要素が表示されるまでの時間を計測する指標で、 多くのページではヒーロー画像やファーストビューの写真がこの「最大の要素」に該当します。

PC用に書き出した4000px幅の写真をスマホでもそのまま配信していると、 モバイル回線では転送に時間がかかり、LCPが悪化してGoogleの評価にも影響します。 srcset対応でスマホには640px程度の軽い画像を配信すれば、 転送量を数分の1に減らせてLCPの改善につながりやすくなります。 PageSpeed Insightsの「適切なサイズの画像を指定してください」という指摘は、 まさにこのsrcset未対応を検出したものです。

手作業の手間とツールでの一括生成

srcset対応の効果は分かっていても、実装のハードルは意外と高いです。 1枚の画像につき4〜5段階のサイズを画像編集ソフトで個別に書き出し、 ファイル名を管理しながらsrcset・sizes属性を手打ちする作業は、 掲載画像の枚数が増えるほど線形に手間が増えていきます。 サイズを1つ間違えるだけでレイアウト崩れやぼやけの原因にもなります。

レスポンシブ画像srcset生成ツールを使えば、元画像をドラッグ&ドロップするだけで複数解像度への一括リサイズと、 srcset・sizes属性を含んだHTMLコードの生成までをその場で完結できます。処理はすべてブラウザ内で完結し、画像はサーバーに送信されません。 公開前のデザイン案や社外秘の商品写真でも、外部にアップロードせずに複数解像度を用意できます。 書き出した画像をさらに軽量化したい場合は画像圧縮ツールや、単一サイズへの調整には画像リサイズツールの併用も効果的です。

まとめ

  • PCとスマホでは必要な画像解像度が異なり、Retinaディスプレイ(DPR2以上)も考慮する必要がある
  • srcset属性は複数解像度の候補リスト、sizes属性は実際の表示幅の宣言。両方セットで初めて効果を発揮する
  • 解像度違いの出し分けはimg srcset、構図やフォーマットを変える場合はpictureを使う
  • srcset対応はLCP(Largest Contentful Paint)改善に直結し、PageSpeed Insightsの指摘解消にもつながる
  • 複数解像度の手作業書き出しは手間が大きいため、ブラウザ完結のツールで一括生成するとミスなく効率化できる

よくある質問

srcset属性とは何ですか?

srcset属性は、1つの`<img>`タグに複数の解像度の画像候補を指定できるHTML属性です。ブラウザは画面幅・画面密度(Retinaディスプレイかどうか)を見て、その場に最適な1枚だけを自動でダウンロードします。従来のように1枚の大きな画像を全端末に配信する必要がなくなり、スマホでは軽い画像・PCでは高精細な画像を出し分けられます。

srcsetとsizes属性は何が違いますか?

srcsetは「どの画像ファイルを何px幅として使えるか」の候補リスト、sizesは「実際の表示領域がビューポート幅に対してどれくらいか」の宣言です。sizesがないとブラウザは表示サイズを予測できず、必要以上に大きな画像を選んでしまうことがあります。2つはセットで使って初めて効果を発揮します。

幅記述子(w)と倍率記述子(x)はどちらを使うべきですか?

画像の表示サイズがレイアウトによって変わる(レスポンシブデザインでカラム数が変化するなど)場合はw記述子+sizes属性を使います。表示サイズが固定でRetina対応だけしたい場合(ロゴやアイコンなど)はx記述子がシンプルです。迷ったら汎用性の高いw記述子を選ぶのが無難です。

`<img srcset>`と`<picture>`はどう使い分けますか?

`<img srcset>`は「同じ構図の画像を解像度違いで出し分ける」用途に向いています。一方`<picture>`は画面幅によって構図そのものを変えたい「アートディレクション」(スマホでは寄りの縦構図、PCでは引きの横構図など)や、WebP対応ブラウザにはWebP・非対応ブラウザにはJPEGを出し分けるフォーマット切り替えに使います。単純な解像度切り替えなら`<img srcset>`で十分です。

srcsetを設定するとCore Web VitalsのLCPは本当に改善しますか?

多くの場合改善します。LCP(Largest Contentful Paint、最大コンテンツの描画時間を測る指標)はページ内で最も大きな要素の表示速度を計測しており、その要素がヒーロー画像であるケースが非常に多いためです。スマホ回線で4000px幅の元画像をそのまま読み込んでいたページをsrcset対応にすると、転送量が数分の1になりLCPが1〜2秒改善する例も珍しくありません。

複数解像度の画像を手作業で書き出すのは大変ですか?

手作業だと大変です。1枚の画像につき640px・1280px・1920px・2560pxなど4〜5段階のサイズをPhotoshopや画像編集ソフトで個別に書き出し、ファイル名を管理し、srcset属性を手打ちする必要があります。掲載する画像の枚数が増えるほど作業量が線形に増え、サイズを間違えるミスも起きやすくなります。

画像のアップロードなしで複数解像度を一括生成できますか?

はい。レスポンシブ画像srcset生成ツール(/tools/responsive-image-srcset)を使えば、元画像をブラウザにドラッグ&ドロップするだけで複数解像度への一括リサイズと、srcset・sizes属性を含んだHTMLコードの生成までをその場で完結できます。ファイルはサーバーに送信されないため、公開前の未発表デザイン案や社内限定の画像でも安心して使えます。

アップロードした画像はサーバーに送信されますか?

いいえ、送信されません。リサイズ処理・複数解像度の書き出し・HTMLコード生成はすべてブラウザ内(Canvas API)で完結します。ネットワーク通信が発生しないため、画像は端末の外に一切出ません。

この記事で紹介したツール