模写修行メディア

CLS(Cumulative Layout Shift)とは?対策・改善方法も紹介!

サイトを開いた際に、画像や広告などが遅れて読み込まれ、レイアウトがズレたり変わったりした経験はありませんか?

この現象をレイアウトシフトと呼びます。

この記事では、どれくらいレイアウトシフトしたかを定量化したCLS(Cumulative Layout Shift)の概要と、その対策・改善方法を紹介します。

CLS(Cumulative Layout Shift)とは

CLS(Cumulative Layout Shift)を知るために、まずはCore Web Vitals(コアウェブバイタル)について簡単に紹介します。

Googleが定めた、優れたユーザー体験を提供するための重要な指標をWeb Vitalsと呼びます。その中でコアなものが、Core Web Vitalsになります。

  • LCP(Largest Contentful Paint)
  • FID(First Input Delay)
  • CLS(Cumulative Layout Shift)

Core Web Vitalsには上の3つがあります。この3つの中の1つが、今回の記事で紹介する、CLS(Cumulative Layout Shift)です。

Cumulative Layout Shiftは、ページがどのくらい安定しているように感じられるかを表します。視覚的な安定性を測定し、表示されるページ コンテンツにおける予期しないレイアウトのずれの量を定量化します。

Google Developersの記事を引用したものです。

Core Web Vitalsは、SEOのランキング要因でもある、重要な指標です。ただし、Core Web Vitalsの指標をクリアしていれば上位表示されるわけではありません。あくまで、ランキング要因の1つということです。

レイアウトシフト(Layout Shift)が起こることどうなる?

上の動画はレイアウトシフト対策をしていないページで、キャッシュを消してリロードした時の挙動です。

画像が表示されるまで、テキストは画像が入るスペースを埋めてしまっているので、画像表示後にレイアウトがズレます。

  • 急にレイアウトがずれて、読んでいた箇所を見失った
  • レイアウトがずれたせいで誤ったボタンをクリックしてしまった

例えば、上のような現象は明らかに優れたユーザー体験とは言えず、ユーザーにストレスを与えます。

レイアウトシフトの計測方法

レイアウトシフトを計測する方法をいくつか紹介します。

PageSpeed Insights

PageSpeed Insightsの画面スクショ
PageSpeed Insightsにアクセスをして、計測したいサイトのURLを入力することで、分析結果を見ることができます。

拡張機能

Chromの拡張機能を入れると、より簡単に計測できます。


Lighthouse

Lighthouseの画面スクショ

上の画像のGenerate reportをクリックすると、PageSpeed Insightsで出るような詳細なレポートを出してくれます。


Web Vitals

Web Vitalsの画面スクショ

Web Vitalsは上の画像のように、数値だけを出してくれます。結果が出るまでに時間がかからないので、数値だけサクッと確認したい時はWeb Vitalsを使うと良いです。

Google Search Console

Google Search Consoleの画面スクショ

自分が管理しているサイトで、Google Search Consoleを導入していれば、エクスペリエンスのウェブに関する主な指標からチェックすこともできます。

デベロッパーツール

デベロッパーツールで確認することもできます。

  1. Mac:Command + Shift + P / Windows:Ctrl + Shift + P
  2. 『render』と入力
  3. 『Show Rendering』を選択
  4. 『Layout Shift Regions』にチェック
  5. リロード

手順はこの通りです。リロードすると、レイアウトシフトが起こっている箇所に一時的に色がつきます。

CLS(Cumulative Layout Shift)の対策・改善方法

  • 画像
  • webフォント
  • 広告
  • 動的なコンテンツ

上の4つはレイアウトシフトの原因となりやすい項目です。

Point
後から表示される可能性がある箇所の領域を予め確保しておくことで、レイアウトシフトは防げます。ただし、それが不可能な場合もあります。

画像のレイアウトシフト対策・改善方法

対策・改善方法
imgタグにwidthとheightを設定する
<img width="1000" height="500" src="img/hoge.jpg" alt="" class="hoge-img"/>
img {
    width: 100%;
    height: auto;
    vertical-align: bottom;
}

.hoge-img{
    width: 80%;
    max-width: 500px;
}

画像は、imgタグにwidthとheightを設定することで、予めその領域を確保してくれるので、レイアウトシフトが起こりません。

widthとheightの値は画像の実際の横と縦のサイズを指定すれば良いです。比率が重要なので、上のコードでは、width="2"height="1"にしても問題ありません。実際に表示したいサイズは、CSSで設定します。

ただし、アートディレクションする際には注意が必要です。

<div class="art-direction">
    <picture>
        <source media="(max-width: 599px)" srcset="img/sp.png" />
        <source media="(max-width: 699px)" srcset="img/tb.png" />
        <img width="1600" height="800" src="img/pc.png" alt="" />
    </picture>
</div>

縦横比が異なる画像を出し分ける場合は、CSSで予め領域を確保する必要があります。

.art-direction {
    padding-top: 125%;
    position: relative;
}

@media screen and (min-width: 500px) {
    .art-direction {
        padding-top: 100%;
    }
}

@media screen and (min-width: 700px) {
    .art-direction {
        padding-top: 50%;
    }
}

.art-direction img {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
}

2021年6月時点でSafariとIEでは使えませんが、aspect-ratioを使うともっとすっきり書けます。

CSSで縦横比(アスペクト比)を固定できるaspect-ratioについて!具体的な使い道も紹介!

aspect-ratioについての記事です。

HTMLのsrcset属性やpictureタグを使ったレスポンシブイメージを解説

アートディレクションに関しては、上の記事の後半で紹介しています。

webフォントのレイアウトシフト改善方法

対策・改善方法
フォントデータの読み込みを最適化する

webフォントは容量が大きく、読み込まれて表示されるまでに時間がかかります。

表示されるまで、デバイスフォントを表示するので、webフォントの反映後にレイアウトシフトが発生します。完全に防ぐことは難しいです。なるべく影響を少なくするには、読み込みの最適化が必要です。

  • 各webフォントサービスの配信方法
  • サブセット化
  • ダイナミックサブセット化
  • preload
  • font-display
  • ハック的なやり方

これらを知ると、読み込みを最適化できることもあります。(詳しくはいずれ別記事にします)

広告のレイアウトシフト改善方法

対策・改善方法
予め領域を作っておく / レイアウトシフトの原因となるコンテンツの下に他のコンテンツを置かない

Google AdSenseなど、スクリプトを読み込んで、サイト内に広告を表示する場合、レイアウトシフトが発生します。

広告のサイズがわかっている場合は、予めその領域を CSS で作っておくことで回避できます。

また、広告に限りませんが、レイアウトシフトの原因となるコンテンツの下に他のコンテンツを置かなければ、そもそもレイアウトシフトは発生しません。

ただでさえ、ユーザーのストレスになるレイアウトシフトが広告のせいで発生すると、さらにストレスになる可能性があるので、気をつけたい所です。

動的なコンテンツのレイアウトシフト改善方法

対策・改善方法
予め領域を作っておく / レイアウトシフトの原因となるコンテンツの下に他のコンテンツを置かない / ユーザーの操作なしにコンテンツを挿入しない

ユーザの操作と関係なく、動的なコンテンツがページ内に挿入されると、レイアウトシフトが発生します。

例えば、、ログインしてるかどうかを判定して、コンテンツを表示する際など、状況によってはやむを得ない場合もあります。

コーディングの練習が出来るサービスを作りました 🎉

模写修行はこんな方におすすめ!

  • プロの制作フローを学びたい
  • どんなことを考えながら書くのか知りたい
  • 実践的な練習がしたい

【初級編】はこんな方におすすめ!

  • 基礎学習中、もしくは終えたばかり
  • サイト制作経験が5サイト未満 (実際の案件でなくてもOK)

【中級編】はこんな方におすすめ!

  • CSS設計を意識したコーディングを学びたい
  • SCSSを使った書き方を学びたい (解説はSCSSを使わない前提でします)

模写修行ではデザインデータ(XD) / web上で見れる解説 / サンプルコードを配布しています。ご自身でデザインを見ながらコーディングに挑戦し、解説とサンプルコードで深く学ぶことができるサービスです。

模写修行を見る

この記事を書いた人

Gakuのアイコン

Gaku / @gaku92014091

大学・大学院時代から個人で仕事をする。卒業後5年間のフリーランス期を経て、法人化。マーケティング、デザイン、コーディング、プログラミング(フロント)、幅広くやります。webサービス作るのが好き!

\Share/

模写修行のトップページのスクリーンショット
模写修行

駆け出しエンジニアのためのコーディング練習教材