💨

【CSS】画像のレイアウトシフト(CLS)を防ぐ

2024/03/20に公開

画像のレイアウトシフトを防ぐ方法を連ねた記事です。

前提知識:

  • レイアウトシフトとは、画像やWebフォントなどの影響で発生するレイアウトの変化です。

  • レイアウトシフトの発生原因は、画像やWebフォントが遅れて読み込まれることです。

    そのため「表示領域を確保する」ことが基本的な解決方法になります。

  • レイアウトシフトは、Googleが提唱しているWebページのパフォーマンス指標の1つです。

    低ければ低い方がよく 0.1 以下 が1つの基準です。

  • レイアウトシフトによるかかった時間は、ブラウザで「検証」→「Lighthouse」をクリックすると確認することができます。また、このときに発生箇所の確認も行えます。

  • どんな流れで表示されたかは、「検証」→「パフォーマンス」で確認することができます。

aspect-ratio でアスペクト比を指定する

主流の方法として、CSSのaspect-ratio プロパティで、画像のサイズをアスペクト比で指定する方法があります。

img {
	aspect-ratio: 16 / 9;
}

<img>に width と height を付ける

少し前の方法として、HTMLのimg タグにwidthheight 属性を設定する方法があります。

<img src="test1.png" alt="" width="300px" height="300px">

上記のどちらを使えばいいのか


https://coliss.com/articles/build-websites/operation/work/avoiding-img-layout-shifts.html

このサイトでは、以下のように述べています。

「その画像はコンテンツなのかデザインなのか」

たとえば、記事に画像を使用する場合、それはコンテンツです。確保したスペースはコンテンツのアスペクト比になるようにしたい。widthheight属性を間違えると、コンテンツ画像から正しい値が使用されるほうがよい。だから、widthheightの方が最適であるように思います。これならインラインスタイルにこだわることなく、コンテンツを作成するだけです。

画像のレイアウトが特定のアスペクト比であることがデザイン上の要件である場合は、CSSでaspect-ratioを使用することが適切な場合があります。たとえば、ヒーロー画像はつねに16 / 9でなければならないとかです。画像が16 / 9でない場合は、デザインが台無しにならないようにデザインを優先させます。ただし、画像が実際にそのアスペクト比ではない場合は、引き伸ばし(object-fit: fill;)、レターボックス(object-fit: contain;)、切り抜き()のいずれかになります。どれも理想的ではありませんが。

つまり、

  • 記事に使用する画像のように固定した大きさを保ちたいならwidthheigth属性
  • ヒーロー画像のように常にアスペクト比を保ちたいならaspect-ratio プロパティ

ということだと解釈しています。

参考資料

https://zenn.dev/tonchan1216/articles/40391604539ef760bd01#2.-広告や埋め込み要素の配置を改善する

Discussion