CLS/LCPの直し方|採用サイトの画像・フォント・JS最適化テンプレ

「写真が遅い」「レイアウトがガタつく」。採用サイトで起きやすいこの2大課題は、Core Web VitalsのLCP(Largest Contentful Paint)CLS(Cumulative Layout Shift)に直結します。本記事は、原因の見つけ方と、最短で効く実装テンプレをまとめた実務ガイドです。LCPは“もっとも大きな見出し/画像/動画の描画時刻”、CLSは“意図しないレイアウトのズレ量”を評価します。

LCP改善:Hero画像 / WebP / priority hints / critical CSS

まずは「ヒーロー(ファーストビュー)に最短で到達させる」設計です。LCPはページ読み込みの全プロセスの影響を受けるため、画像だけでなくCSS/JS/ネットワーク/サーバまで面で最適化します。

  • ヒーロー画像の先行取得:img要素に fetchpriority="high" を付与し、優先度を明示します(link rel=preload と併用可)。

    “The Fetch Priority API indicates the relative priority of resources.” — Optimize resource loading with the Fetch Priority API (web.dev)

  • 適切な形式とサイズ:AVIF/WebPへ変換、表示サイズに合わせてサーバ生成(画像CDN推奨)。
  • Critical CSS:初期表示に必要な最小のCSSだけインライン化し、残りは遅延/分割。CSSはデフォルトでレンダーブロックなので、肥大化を避けます。
  • 初期JSの削減:ヒーローに不要なライブラリ/ウィジェットは遅延ロード。

チェック例(最低限の実装)

<img
  src="/img/hero.avif"
  width="1200" height="800"
  alt="現場で働く先輩"
  fetchpriority="high"
  decoding="async"
  loading="eager">

CLS改善:画像サイズ・アスペクト比・フォントFOUT/FOIT対策

CLSの主犯は「寸法未指定のメディア」「フォント切替」「遅延ロード要素」です。画像/動画/広告/埋め込みの矩形(width/height or aspect-ratio)を必ず確保し、フォントの見え方を制御しましょう。

  • 画像の寸法を必ず指定:width/heightを入れると、ブラウザはアスペクト比を算出し、レイアウトのズレを防げます。

    “Prevent layout shifts by setting width and height attributes.” — Optimize Cumulative Layout Shift (web.dev)

  • レスポンシブ比率:CSSのaspect-ratioで比率を固定。iframe/動画にもプレースホルダを設ける。
  • Webフォントfont-display: swapでFOIT(文字が消える)を回避、必要なら事前読み込み+サブセット化。

    “Web fonts can impact performance… incorrect font-display could cause layout shifts.” — Optimize web fonts (web.dev)

  • 遅延読み込みの占有:lazy画像・広告・計測ウィジェットには固定高さを割り当てる。

チェック例(画像と動画)

<img
  src="/img/interview.webp"
  width="800" height="534" loading="lazy"
  alt="社員インタビューの様子">

<div class="video">
  <iframe
    src="https://www.youtube.com/embed/xxxxx"
    title="1日の流れ"
    loading="lazy"
    allowfullscreen></iframe>
</div>

/* CSS */
.video { aspect-ratio: 16 / 9; }

サードパーティ(計測タグ・チャット・ABテスト)との付き合い方

第三者スクリプトは、ネットワーク要求や同期実行で描画を阻害し、LCP/CLSの双方を悪化させます。使うなら「数を減らす・読み込み方を最適化・必要ページだけで発火」が鉄則です。

  • 不要なら削除:価値を生まないスクリプトは撤去(A/Bやヒートマップの常時稼働を見直し)。
  • 読み込みの最適化async/defer、遅延実行、自己ホスト化で往復回数を削減。
  • 範囲限定:応募フォームなど必要ページでのみ有効化。タグマネージャのトリガで制御。

チェック例(最小限の阻害で読み込む)

<script src="https://example.com/ab.js" defer crossorigin></script>
<script>
  if (location.pathname.startsWith('/apply')) {
    // フォームページだけで発火
    initAB();
  }
</script>

Before/Afterの測り方(実測・ラボ測定の両輪)

PSIは実世界(CrUX)の75パーセンタイルで合否判定し、Lighthouse/DevToolsは検証用のラボ値を提供します。両者は条件が異なるため差が出ます。現場では「ラボで即時確認 → フィールドで追認」の順がおすすめです。

  • リリース直後:Lighthouse/DevToolsのラボ値で退行をチェック
  • 運用:PSI(モバイル/デスクトップ)で定点観測、悪化ページをJQLで抽出

よくある失敗と回避策(カルーセル・埋め込み動画 など)

  • カルーセルの初期化が重い:初期スライドのみ描画、残りはIntersectionObserverで遅延。ナビゲーションはCSS優先。
  • YouTube埋め込みのCLS:iframeに比率枠を確保し、サムネイルプレースホルダ+クリックで読込。
  • フォント切り替えでガタつくfont-display: swap+メトリクス互換の代替フォント(system-ui等)を指定。

ミニ実装テンプレ(コピペ可)

<!-- 1) ヒーロー画像:優先度+寸法 -->
<img src="/img/hero.avif" width="1280" height="720" alt="現場のファーストビュー"
     fetchpriority="high" decoding="async" loading="eager">

<!-- 2) クリティカルCSS:初期ビューの最小セットをインライン -->
<style>/* above-the-fold だけ */ .hero{min-height:60svh;display:grid;place-items:center} /* ... */</style>

<!-- 3) Webフォント:FOUT許容+事前読み込み -->
<link rel="preload" as="font" href="/fonts/brand-regular.woff2" type="font/woff2" crossorigin>
<style>@font-face{font-family:Brand;src:url(/fonts/brand-regular.woff2) format('woff2');font-display:swap}</style>

<!-- 4) 埋め込み動画:比率枠でCLS防止 -->
<div class="video"><iframe src="https://www.youtube.com/embed/xxxxx" title="1日の流れ" loading="lazy" allowfullscreen></iframe></div>
<style>.video{aspect-ratio:16/9}</style>

<!-- 5) サードパーティ:必要ページのみ -->
<script defer src="/third/chat.js"></script>
<script>if(!location.pathname.startsWith('/apply')){window.stopChat?.()}</script>

参考(一次情報の抜粋)

“To improve LCP, you have to look at the entire loading process.” — Optimize Largest Contentful Paint (web.dev)

“Prevent layout shifts by setting width and height attributes.” — Optimize Cumulative Layout Shift (web.dev)

“The Fetch Priority API indicates the relative priority of resources.” — Fetch Priority API (web.dev)

“Lab data… may not accurately represent the 75th percentile of field data.” — Why lab and field data can be different (web.dev)

次に読む(内部リンク)

コメント

この記事へのコメントはありません。

最近の記事
おすすめ記事1
PAGE TOP