レスポンシブ画像

ウェブ上のテキストは、はみ出さないよう画面の端で自動的に改行されます。画像の場合は違います画像には固有のサイズがあります。画像が画面よりも広いと、画像がはみ出して横方向のスクロールバーが表示されます。

幸いなことに、CSS で対策を講じてこのようなことが起こらないようにすることができます。

画像を制限する

スタイルシートで max-inline-size を使用すると、画像を含む要素よりも大きなサイズで画像をレンダリングしないよう宣言できます。

対応ブラウザ

  • 57
  • 79
  • 41
  • 12.1

ソース

img {
  max-inline-size: 100%;
  block-size: auto;
}

動画や iframe などの他の埋め込みコンテンツにも、同じルールを適用できます。

img,
video,
iframe {
  max-inline-size: 100%;
  block-size: auto;
}

このルールを適用すると、ブラウザは画面に合わせて画像を自動的に縮小します。

2 枚のスクリーンショット。1 枚目にはブラウザの幅を超えて拡大する画像、2 枚目にはブラウザのビューポート内に制約された同じ画像が表示されています。

block-size の値に auto を追加すると、画像のアスペクト比が一定に保たれます。

コンテンツ マネジメント システムによって画像が追加された場合など、画像のサイズをお客様が制御できないことがあります。実際のサイズとは異なるアスペクト比の画像がデザイン上必要な場合は、CSS の aspect-ratio プロパティを使用します。

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
}

ただし、指定どおりのアスペクト比に合わせて、ブラウザによって画像が押しつぶされたり引き伸ばされたりすることがあります。

口にボールをくわえた幸せそうに見えるハンサムな犬の横顔が、画像が押しつぶされている。

これを防ぐには、object-fit プロパティを使用します。

対応ブラウザ

  • 32
  • 79
  • 36
  • 10

ソース

object-fit の値を contain にすると、上下に空白が残る場合でも、画像のアスペクト比を保持するようブラウザに指示します。

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: contain;
}

object-fit の値を cover に設定すると、画像の上下が切り取られる場合でも、画像のアスペクト比が保持されます。

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
}
口にボールをくわえた幸せそうに見えるハンサムな犬の横顔。画像の両側に余白がある。 ボールをくわえた幸せそうに見えるハンサムな犬の横顔。画像は上下がトリミングされている。
同じ画像で「object-fit」に 2 つの異なる値が適用されています。1 つ目のグループには「object-fit」値が「contains」の「object-fit」値があり、2 つ目は「object-fit」値で「cover」となっています。

上下を均等に切り抜くのが問題な場合は、object-position CSS プロパティを使用して、切り抜きのフォーカスを調整します。

対応ブラウザ

  • 32
  • 79
  • 36
  • 10

ソース

最も重要な画像コンテンツを表示したままにすることができます。

img {
  max-inline-size: 100%;
  block-size: auto;
  aspect-ratio: 2/1;
  object-fit: cover;
  object-position: top center;
}

ボールをくわえた幸せそうに見えるハンサムな犬の横顔。画像は下部のみがトリミングされています。

画像を配信する

これらの CSS ルールは、画像のレンダリング方法をブラウザに指示します。ブラウザでの画像の処理方法についてヒントを HTML で指定することもできます。

サイズに関するヒント

画像のサイズがわかっている場合は、width 属性と height 属性を含める必要があります。画像が別のサイズでレンダリングされた場合でも(max-inline-size: 100% ルールにより)、ブラウザは幅と高さの比率を認識しているため、適切なスペースを確保できます。これにより、画像の読み込み時に他のコンテンツの動きが止まります。

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
>
最初の動画は、画像サイズが定義されていないレイアウトを示しています。画像が読み込まれるとテキストがどのように跳ね上がるかに注目してください。2 番目の動画では、画像のサイズが示されています。読み込み後にテキストが飛ばないよう、画像用のスペースが残っています。

ヒントを読み込んでいます

loading 属性を使用して、画像の読み込みをビューポート内またはビューポート近くまで遅らせるかどうかをブラウザに指示します。スクロールしなければ見えない範囲の画像には、値 lazy を使用します。ユーザーが下までスクロールし、画像が表示されるまでに時間がかかるまで、ブラウザで遅延画像は読み込まれません。ユーザーがスクロールしなかった場合、画像は読み込まれません。

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
>

スクロールせずに見える範囲にヒーロー画像を表示する場合は、loading を使用しないでください。サイトで loading="lazy" 属性が自動的に適用されている場合は、多くの場合、eager 属性(デフォルト)を設定して適用されないようにできます。

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
>

優先度を取得する

LCP 画像などの重要な画像の場合、fetchpriority 属性を high に設定することで、フェッチの優先度を使用して読み込みの優先順位をさらに高めることができます。

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
 fetchpriority="high"
>

これにより、画像は通常取得されたとき、ブラウザでレイアウトが完了するまで待機するのではなく、画像を直ちに高い優先度で取得するようブラウザに指示します。

ただし、1 つのリソース(画像など)のダウンロードを優先するようブラウザに指示した場合、ブラウザは別のリソース(スクリプトやフォント ファイルなど)の優先度を下げる必要があります。fetchpriority="high" は、本当に重要な場合にのみ画像に設定します。

プリロードのヒント

JavaScript または CSS の背景画像として追加された画像は、最初の HTML で使用できないことがあります。また、プリロードを使用して、このような重要な画像を事前に取得できるようにすることもできます。非常に重要な画像については、この属性を fetchpriority 属性と組み合わせることができます。

<link rel="preload" href="hero.jpg" as="image" fetchpriority="high">

これも、ブラウザの優先順位に関するヒューリスティックを過剰にオーバーライドしてパフォーマンスが低下するのを防ぐため、慎重に使用する必要があります。

imagesrcset 属性と imagesizes 属性を使用して、srcset(後述)に基づくレスポンシブ画像をプリロードする方法がより高度であり、一部のブラウザでサポートされていますが、すべてではありません。

href の代替を除外することで、これをサポートしていないブラウザで誤った画像がプリロードされないようにすることができます。

現時点では、ブラウザによるそれらの画像のサポートに基づくさまざまな画像形式に基づくプリロードはサポートされておらず、追加のダウンロードが発生する可能性があります。

理想は、可能な限りプリロードを回避し、最初の HTML で画像を用意して、コードの繰り返しを回避し、ブラウザがサポートするすべてのオプションにアクセスできるようにすることです。

画像のデコード

また、img 要素に追加できる decoding 属性もあります。画像を非同期でデコードできることをブラウザに伝えることができます。これにより、ブラウザは他のコンテンツの処理を優先できるようになります。

<img
 src="image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
>

画像自体が最も重要なコンテンツ要素である場合は、sync 値を使用できます。

<img
 src="hero.jpg"
 alt="A description of the image."
 width="1200"
 height="800"
 loading="eager"
 decoding="sync"
>

decoding 属性は、画像のデコード速度ではなく、ブラウザがこの画像のデコードを待機してから他のコンテンツをレンダリングするかどうかを変更するだけです。

ほとんどの場合、影響はほとんど生じませんが、状況によっては画像やコンテンツの表示が少し速くなることもあります。たとえば、レンダリングに時間がかかる要素が多く、デコードに時間がかかる大きな画像が含まれる大規模なドキュメントの場合、重要な画像で sync を設定すると、ブラウザは画像を待機して一度にレンダリングするように指示します。または、async を設定すると、画像のデコードを待たずにコンテンツをより速く表示できます。

ただし、通常は、過剰な DOM サイズを回避し、レスポンシブな画像を使用してデコード時間を短縮することをおすすめします。つまり、デコード属性がほとんど効果を持ちません。

srcset のレスポンシブ画像

max-inline-size: 100% の宣言により、イメージがコンテナの外に出ることはありません。しかし、収まるように縮小する大きな画像で問題はないように見えても、それでは不十分です。低帯域幅のネットワーク上で小画面のデバイスを使用すると、不必要に大きい画像がダウンロードされてしまいます。

同じ画像についてサイズが異なる複数のバージョンを作成した場合は、srcset 属性を使用してブラウザにそれらのバージョンを認識させることができます。

幅記述子

カンマ区切りの値のリストを渡すことができます。各値には、画像の URL を指定し、その後にスペースと画像に関するメタデータを指定します。このメタデータは記述子と呼ばれます。

この例では、メタデータに w 単位を使用して各画像の幅を記述しています。1 つの w が 1 ピクセル。

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 300w,
  medium-image.png 600w,
  large-image.png 1200w"
>

srcset 属性は src 属性を置換するものではありません。代わりに、srcset 属性は src 属性を補完します。有効な src 属性は引き続き必要ですが、ブラウザはその値を srcset 属性に記載されたオプションのいずれかに置き換えることができます。

必要でない限り、大きな画像はブラウザによってダウンロードされません。帯域幅を節約できます。

サイズ

幅記述子を使用している場合は、sizes 属性も使用して、ブラウザにより多くの情報を伝える必要があります。これは、さまざまな条件下で画像が表示されると予想されるサイズをブラウザに伝えます。これらの条件は、メディアクエリで指定します。

sizes 属性は、メディアクエリと画像の幅のカンマ区切りのリストを受け取ります。

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 300w,
  medium-image.png 600w,
  large-image.png 1200w"
 sizes="(min-width: 66em) 33vw,
  (min-width: 44em) 50vw,
  100vw"
>

この例では、ビューポートの幅 66em を超えて、画面の 3 分の 1 以内(たとえば 3 列レイアウト内)に画像を表示するようブラウザに指示します。

ビューポートの幅が 44em66em の場合、画像が画面の半分の幅で表示されます(2 列レイアウト)。

44em より下の場合は、画面の横幅いっぱいで画像を表示します。

つまり、最も大きな画像が必ずしも最も広い画面で使用されるとは限りません。複数列のレイアウトを表示できる幅の広いブラウザ ウィンドウでは、1 列に収まる画像が使用されます。この画像は、狭い画面で単一列のレイアウトに使用される画像よりも小さい場合があります。

ピクセル密度記述子

また、同じ画像の複数のバージョンを提供したい場合もあります。

一部のデバイスは高密度ディスプレイを搭載しています。倍密度ディスプレイでは、2 ピクセル分の情報を 1 ピクセルのスペースにパッキングできます。これにより、このようなディスプレイで画像を鮮明に表示できます。

ボールをくわえた幸せそうに見えるハンサムな犬の同じ画像の 2 つのバージョン。鮮明に見える画像と柔らかく見える画像。

密度記述子を使用して、画像のピクセル密度を src 属性の画像との関係で記述します。密度記述子は、数字の後に文字 x(1x2x など)が続きます。

<img
 src="small-image.png"
 alt="A description of the image."
 width="300"
 height="200"
 loading="lazy"
 decoding="async"
 srcset="small-image.png 1x,
  medium-image.png 2x,
  large-image.png 3x"
>

small-image.png のサイズが 300 x 200 ピクセルで、medium-image.png のサイズが 600 x 400 ピクセルの場合、srcset リストの medium-image.png の後に 2x を指定できます。

整数を使用する必要はありません。画像の別のバージョンが 450x300 ピクセルの場合は、1.5x で記述できます。

プレゼンテーション画像

HTML の画像はコンテンツです。そのため、スクリーン リーダーや検索エンジン向けに、常に alt 属性に画像の説明を指定します。

意味のあるコンテンツがなく、純粋に視覚的に魅力ある画像を埋め込む場合は、空の alt 属性を使用します。

<img
 src="flourish.png"
 alt=""
 width="400"
 height="50"
>

その場合でも alt 属性を含める必要があります。alt 属性の欠落は、空の alt 属性とは異なります。空の alt 属性は、この画像がプレゼンテーション用であることをスクリーン リーダーに伝えます。

理想的なのは、プレゼンテーション用画像や装飾用画像を HTML に含めないのが理想的です。HTML は構造化するためのものです。CSS はプレゼンテーション用です。

背景画像

CSS で background-image プロパティを使用して、プレゼンテーション画像を読み込みます。

element {
  background-image: url(flourish.png);
}

background-imageimage-set 関数を使用して、複数の画像候補を指定できます。

CSS の image-set 関数は、HTML の srcset 属性と同様に機能します。画像のリストと、各画像のピクセル密度記述子を提供します。

element {
  background-image: image-set(
    small-image.png 1x,
    medium-image.png 2x,
    large-image.png 3x
  );
}

ブラウザにより、デバイスのピクセル密度に最適な画像が選択されます。

サイトに画像を追加する際には、次のようなさまざまな要素を考慮してください。

画像ごとに適切なスペースを確保する。必要なサイズの数を検討します。 画像がコンテンツか装飾的かを決定する。

適切な画像を作り出すために時間をかける価値はある。不適切な画像戦略は、ユーザーの不満や煩わしさの原因になります。優れた画像戦略を立てることで、ユーザーのデバイスやネットワーク接続に関係なく、サイトに軽快でシャープな印象を与えることができます。

ツールキットには、画像をより詳細に制御できるようにするためのもう 1 つの HTML 要素、picture 要素があります。

理解度チェック

画像に関する知識をテストする

画像がビューポートに収まるようにするには、スタイルを追加する必要があります。

正しい
画像に含まれない画像は、元のサイズと同じ大きさで表示されます。
誤り
スタイルは必須です。

画像の高さと幅を不自然なアスペクト比にした場合、その比率に画像を合わせるのに役立つスタイルはどれですか。

object-fit
containcover などのキーワードに画像がどのように適合するかを指定します。
image-fit
このプロパティは存在しません。作成しました。
fit-image
このプロパティは存在しません。作成しました。
aspect-ratio
これにより、画像の不自然な比率が発生したり、解決されたりすることがあります。

画像に heightwidth を設定すると、CSS で異なるスタイルを設定できなくなります。

正しい
ルールというよりも、ヒントのようなものと考えてください。
誤り
CSS には、タグ内で高さと幅をインラインで指定している場合でも、画像のサイズを変更するための動的オプションが多数用意されています。

srcset 属性は src 属性を _______ ではなく、_______ である。

を補う
srcsetsrc 属性は置き換えられることはありません。
置換, 補完
可能な場合は、ブラウザが選択できる追加のオプションを提供します。

イメージで alt がないことは、空の alt と同じです。

正しい
空の alt 属性により、この画像がプレゼンテーション用であることをスクリーン リーダーに伝える
誤り
alt が指定されていない場合、スクリーン リーダーには何も通知されません。