はじめに
「WordPress高速化」シリーズの第2回です。【WordPress高速化】CLSの原因を検証ツールで探す方法(以下「前回の記事」)では、Chromeの検証ツールで、ずれた場所を見つけて高さを測る方法を紹介しました。
今回は、その続きです。当サイト(WordPressテーマ「SWELL」)で、実際にどの場所に、どんなCSSを追加したかを紹介します。結果、PageSpeed InsightsのCLSは次のように変わりました。

途中で一度、かえって悪化させてしまった書き方もありました。うまくいった方法と合わせて、失敗した理由も解説します。
当サイトで起きていたこと
Search Consoleで、パソコンの「CLS に関する問題: 0.25 超」が174件出ていました。不良だったのは記事ページで、カテゴリーページは良好でした。
前回の記事の方法で調べると、SWELLの記事ページには、読み込みの後から高さが変わる場所がいくつもありました。

| 場所 | 後から高さが変わる理由 |
|---|---|
| 目次 | SWELLはJavaScriptで目次の中身を作るため、最初は中身がない |
| 広告枠 | 広告が届くまで高さが0 |
| 記事下エリア | 関連記事などが後から入り、フッターが押し下げられる |
| サイドバーのウィジェット | 人気記事や新着記事が後から入る |
なお、AdSenseの自動広告は全画面広告(オーバーレイ)だけを使っていました。ページの上に重ねて表示されるだけなので、本文は動かず、CLSの原因にはなりません。
対策の基本:min-height で高さを先に確保する
対策の考え方は1つだけです。後から中身が入る場所に、先に高さを確保しておく。中身が入っても高さが変わらなければ、下の文章は動きません。
高さの測り方と、min-heightを設定する場所(入れ物の側)の考え方は、前回の記事の「方法3」で解説しています。パソコンとスマホで高さが違うので、SWELLの切り替え幅(960px)で分けて書きます。測った値は小数点つきのままで構いません。
以下のコードは、当サイトの追加CSS(「外観」→「カスタマイズ」→「追加CSS」)から要点を抜き出したものです。
対策1:目次と目次下の広告
SWELLの目次(.p-toc.-double)は、ページの表示後にJavaScriptで中身が作られます。その直前まで目次は空なので、中身が入った瞬間に本文が押し下げられます。目次の下にある広告枠(.w-beforeToc)も、広告が届くまで高さが0です。
/* パソコン表示(画面幅960px以上) */
@media screen and (min-width: 960px) {
/* 目次 */
.p-toc.-double {
min-height: 313px !important;
}
/* 目次下の広告 */
.w-beforeToc {
min-height: 280px !important;
}
}
/* スマホ表示(画面幅959px以下) */
@media screen and (max-width: 959px) {
.p-toc.-double {
min-height: 314.84px !important;
}
.w-beforeToc {
min-height: 280px !important;
}
}目次の高さは、SWELLの目次の設定によって決まります。当サイトの設定は次のとおりです。
| 設定 | 当サイトの値 |
|---|---|
| 目次に表示する見出し | h2まで |
| 目次の省略表示 | 項目が5個を超えると省略 |
この設定では、目次に表示される項目は最大5個なので、目次が313pxより高くなることは基本的にありません。見出しが5個より少ない記事では、確保した高さの下に少し余白が出ます。
目次にh3まで含めるなど設定を変えると、目次の高さも微妙に変わります。設定を変えたら、高さを測り直しましょう。
対策2:記事下エリア(前後の記事・著者・関連記事)
記事本文の下にある.l-articleBottomには、前後の記事へのリンク、著者の紹介、関連記事が並びます。関連記事は読み込みの少し後に中身が入るため、一瞬見えていたフッターが押し下げられるずれが起きていました。
そこで、全体を囲む親の要素と、中の3つの要素の両方にmin-heightを設定しました。
/* パソコン表示(画面幅960px以上) */
@media screen and (min-width: 960px) {
/* 記事下エリア全体 */
.l-articleBottom {
min-height: 1195px;
}
/* 前後の記事へのリンク */
.p-pnLinks.-style-normal.-thumb-on {
min-height: 63px;
}
/* 著者の紹介 */
.p-authorBox {
min-height: 295px;
}
/* 関連記事 */
.l-articleBottom__section.-related {
min-height: 583px;
}
/* 記事下の広告 */
#swell_ad_widget-9 {
min-height: 280px !important;
}
}スマホ用の値は次のとおりです。スマホは横幅が狭く、関連記事などが縦に並ぶので、パソコンよりかなり高くなります。
| 場所 | セレクタ | パソコン | スマホ |
|---|---|---|---|
| 記事下エリア全体 | .l-articleBottom | 1195px | 1806px |
| 前後の記事 | .p-pnLinks.-style-normal.-thumb-on | 63px | 96px |
| 著者の紹介 | .p-authorBox | 295px | 439px |
| 関連記事 | .l-articleBottom__section.-related | 583px | 1100px |
| 記事下の広告 | #swell_ad_widget-9 | 280px | 280px |
当サイトでは、関連記事の中にインフィード広告を表示する設定が残っていました。広告が入るかどうかで関連記事の高さが変わってしまうため、インフィード広告の設定は削除しました。CSSで高さを確保するより、高さが変わる原因そのものをなくすほうが確実な場合もあります。
#swell_ad_widget-9のような番号は、ウィジェットを追加した順番で決まるので、サイトごとに違います。次の「対策3」で調べ方を紹介します。
対策3:サイドバーのウィジェット
パソコン表示では、記事の右側にサイドバーがあります。人気記事・新着記事・広告などのウィジェットも、後から中身が入ると下のウィジェットを押し下げます。
ウィジェットは、IDで1つずつ指定しました。IDは、ウィジェットを右クリック→「検証」で、ウィジェットを囲む要素のid="swell_popular_posts-3"のような部分を見て確認します。
/* パソコン表示(画面幅960px以上) */
@media screen and (min-width: 960px) {
/* 人気記事(記事カード×5) */
#swell_popular_posts-3 {
min-height: 488px;
}
/* 新着記事(記事カード×5) */
#swell_new_posts-2 {
min-height: 488px;
}
/* サイドバーの広告(2つ) */
#swell_ad_widget-3,
#swell_ad_widget-2 {
min-height: 250px !important;
}
}このほかのウィジェット(おすすめ記事、サイト内検索など)にも、測った高さを設定しました。スマホではサイドバーの内容が記事の下に表示されるので、スマホ用の値も別に測っています(人気記事・新着記事は583px)。
失敗例:content-visibility でかえって悪化した
記事下エリアの対策で、最初に試したのはmin-heightではなく、次の書き方でした。
/* ※悪化した書き方(使わないでください) */
.l-articleBottom {
content-visibility: auto;
contain-intrinsic-size: 1195px;
}content-visibility: autoは、画面の外にある部分の描画を後回しにして、表示を速くするプロパティです。描画を後回しにしている間は、contain-intrinsic-sizeで指定した仮の大きさで場所を取っておきます。
ところが、これを記事下エリア全体に入れたところ、PageSpeed InsightsのCLSは0.14から0.26に悪化しました。

画面に近づいて本当の中身が描画されたとき、仮の大きさと実際の高さに差があると、その差がずれになります。記事下エリアは関連記事や広告が後から入るため、仮の大きさと合いにくかったと考えられます。
content-visibilityをやめてmin-heightに変えたところ、CLSは0.02まで下がりました。
ただし、必ず悪化するわけではありません。当サイトでは関連記事やサイドバーの人気記事・新着記事にも指定していますが、問題は出ていません。それでも、CLS対策が目的なら、まずmin-heightで高さを確保するほうが確実です。
追加CSSのエディターでは、content-visibilityなどの新しいプロパティが赤い文字で表示されることがあります。これはエディターのチェック機能が新しいプロパティを知らないだけで、動作には影響しません。
最後の微調整:インラインのコードとコードブロック
0.02から先の原因は、本文中のコードの表示でした。当サイトはプログラミングの記事が多く、文中のコード(<code>)とコードブロック(プラグイン「Highlighting Code Block」、以下HCB)がたくさんあります。
文中のコード
文中の<code>に付けている余白や枠線のせいで、行の高さがわずかに変わっていました。display: inlineにして、行の高さを周りの文章と同じ(inherit)にしました。
/* 文中のコード:周りの文章の行の高さに合わせる */
.post_content p code {
display: inline !important;
vertical-align: baseline !important;
padding: 0.2em 0.4em !important;
margin: 0 0.4em !important;
border: 1px solid #e2e8f0 !important;
line-height: inherit !important;
}HCBのコードブロック
検証ツールの「レイアウト シフト」タブで、HCBのコードブロックが表示の直後に下へ伸びて、元に戻る動きをしているのが見つかりました。コードの中に日本語が混じると、等幅フォントと日本語フォントが切り替わり、行の高さが一瞬変わっていたのが原因です。
そこで、行の高さと等幅フォントを固定しました。
/* HCBのコードブロック:余白・行の高さ・フォントを固定する */
.hcb_wrap {
margin-top: 28px !important;
margin-bottom: 28px !important;
}
.hcb_wrap code {
line-height: 21px !important;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace !important;
}28pxと21pxは、当サイトのHCBの元の値を「計算済み」タブで測ったものです。見た目は変えずに、値を固定しただけです。この2つの調整で、CLSは0.0026、最終的に0.0008になりました。
AIに聞いたCSSを使うときの注意
今回のCSSは、Google検索のAIモードに相談しながら作りました。とても助かりましたが、回答には根拠の弱い説明や副作用のある提案もありました。
- 「小数点の端数(0.988pxなど)がCLSの原因」という説明:根拠が弱いです。効いたのは、高さの確保と、行の高さ・フォントの固定だと考えられます
text-renderingや-webkit-font-smoothingの追加:文字の描き方を変えるだけで、位置は変わらないので、CLSにはほぼ関係ありません- 本文の画像に
aspect-ratioやwidth: 100% !importantを指定する提案:画像が縦に約1500pxに伸びたり、横幅いっぱいに拡大されたりしました。WordPressは画像にwidthとheightの属性を出力しており、ブラウザはそれを使って最初から縦横比を確保します。そのため、画像のずれ対策のCSSは基本的に不要です
AIの回答は、1つずつ反映して、そのたびに測るのがおすすめです。まとめて入れると、どれが効いたのかわからなくなります。
Search Consoleで改善を確かめる
PageSpeed Insightsの0.0008はラボの値(テスト用ブラウザで1回測った結果)です。Search Consoleは実際の訪問者のフィールドデータを使うので、反映には約28日かかります(違いは前回の記事で解説しています)。
CSSを追加したら、Search Consoleの「ウェブに関する主な指標」→「PC」→「CLS に関する問題」を開き、「修正を検証」をクリックしておきましょう。当サイトの結果(不良174件がどう変わったか)は、わかり次第この記事に追記します。
上級者向けの補足
[上級者向け補足]
Node.jsからChromeを操作して、スクロール中のずれを自動で記録するスクリプトも試しましたが、自動化したブラウザでは広告の出方が実際と違い、ずれを再現できませんでした。自分のChromeで、読者と同じように操作して確かめるのが一番確実です。
よくある質問・エラー対処
Q. CSSを追加したのに、見た目もCLSも変わりません
→ キャッシュが残っている可能性があります。SWELLの「SWELL設定」→「キャッシュクリア」や、キャッシュ系プラグイン・サーバーのキャッシュを削除してから確かめてください。また、min-height: 621.2px; !important;のようにセミコロンの位置を間違えると、その行は正しく読み込まれません。単位の付け忘れ(28ではなく28px)にも注意しましょう。
Q. 目次の下に空白ができてしまいました
→ 見出しが少なく、目次の項目が省略表示の上限(当サイトでは5個)に届かない記事では、確保した高さが余るためです。値を小さくすると、項目が上限まである記事で目次が伸びて、またずれが起きます。ずれをなくすことを優先して、項目が上限まであるときの高さに合わせておくのがおすすめです。見出しの数に合わせて、記事ごとに目次の高さを自動で変える方法は、このシリーズの今後の回で紹介する予定です。なお、関連記事の件数やウィジェットの並びを変えたときは、高さを測り直してmin-heightの値も見直してください。
おわりに(まとめ)
SWELLのCLS対策は、後から中身が入る場所に、先に高さを確保することが基本です。
- ✅ 目次・広告枠・記事下エリア・サイドバーに min-height を設定した
- ✅ パソコンとスマホで値を分ける(SWELLの切り替え幅は960px)
- ✅ content-visibility を記事下エリア全体に入れたら、CLSが0.14から0.26に悪化した
- ✅ 最後の0.02は、文中のコードとコードブロックの行の高さ・フォントの固定で解消した
- ✅ AIの提案は1つずつ入れて、そのたびに測る
- ✅ Search Consoleへの反映は約28日後。「修正を検証」を押しておく
この記事が、少しでも誰かのお役に立てれば幸いです。
関連記事
- 【WordPress高速化】CLSの原因を検証ツールで探す方法:PageSpeed InsightsとSearch Consoleの違いと、Chromeの検証ツールでずれた場所を見つけて高さを測る方法(シリーズ第1回)
- 【WordPress×PHP】テーマとPHPの関係を基本から解説:WordPressのテーマの仕組みを、PHPの基本から解説するシリーズの第1回
※1回買えば複数サイトで使い回しOK
当サイトの記事で使用したVBAなどのサンプルをDLできます
この記事のサンプルはありません!
ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


