「スクロールしてもヘッダーが上に残るようにしたい」「ナビゲーションメニューをいつでも押せる状態にしたい」——WordPressサイトを作っていると、こうした要望に必ず一度はぶつかります。
実はこの「ヘッダー固定(フィックスド)表示」、テーマの設定だけで済む場合もあれば、CSSを書く必要がある場合もあり、やり方を間違えると本文がヘッダーの下に隠れてしまうという初心者がよくつまずく落とし穴もあります。
この記事では、WordPressでヘッダーを固定表示にする方法を、テーマの設定機能を使う方法と追加CSSで対応する方法の両方から解説します。
コピペで使えるCSSサンプルと、固定後によく起きる「コンテンツが隠れる」「モバイルで崩れる」といった不具合の直し方も合わせて紹介します。
ヘッダー固定表示のメリット・デメリット
ヘッダーを固定する前に、メリットとデメリットの両方を把握しておくと、自分のサイトに合うかどうかを判断しやすくなります。
メリット
- ページのどこを読んでいても、メニューやロゴへすぐアクセスできる
- お問い合わせ・購入ボタンなどのCTAを常時表示でき、行動を促しやすい
- 長いランディングページや記事ページで、迷子になりにくい
デメリット
- スマートフォンなど画面が小さい端末では、表示領域が狭くなる
- 本文の見出しがヘッダーの下に隠れてしまう不具合が起きやすい
- ヘッダーの高さが大きいデザインでは、窮屈な印象になりやすい
WordPressでヘッダーを固定表示にする2つの方法
実装方法は大きく2つに分かれます。どちらを選ぶべきかは、使用しているテーマに固定ヘッダー機能があるかどうかで決まります。
| 方法 | 向いているケース | メンテナンス性 |
|---|---|---|
| ① テーマの設定機能を使う | テーマに固定ヘッダーのオプションがある場合 | 高い(テーマ更新に追従しやすい) |
| ② 追加CSSで固定する | テーマに機能がない、または細かく調整したい場合 | 中(CSSの管理が必要) |
まずは自分のテーマのカスタマイザーに「ヘッダー固定」「Sticky Header」のような設定項目がないか確認しましょう。なければ、次の章で紹介する追加CSSの方法に進んでください。
追加CSSでヘッダーを固定表示にする手順
テーマに専用機能がない場合は、CSSのposition: fixed;もしくはpostion:stiky;を使ってヘッダーを固定します。以下の手順で進めてください。
- CSSを書く場所を決める
「外観 → カスタマイズ → 追加CSS」を使うのが最も手軽です。テーマファイルを直接編集する場合は、必ず子テーマ(チャイルドテーマ)の
style.cssに記述してください。親テーマを直接編集すると、テーマ更新時にすべての変更が消えてしまいます。 - ヘッダーのクラス名を確認する
ヘッダー部分を右クリックして「検証」(ブラウザの開発者ツール)を開き、ヘッダー全体を囲んでいる要素の
classまたはidを確認します。多くのテーマでは
header、.site-header、#mastheadのような名前になっています。
Apuraテーマの場合、開発者ツールで確認すると次のような構造になっています。
ヘッダー全体を囲む要素には
id="site-header"とclass="l-header"が付与されています。この記事のCSSサンプルで使っている
.site-headerは説明用の仮のクラス名なので、Apuraで実際にコピペする場合は.l-header(または#site-header)に置き換えてください。<!-- ブラウザの開発者ツールで見えるHTML(Apuraテーマの出力例) --> <header id="site-header" class="l-header"> <div class="header"> <div class="header__row"> <!-- ① ロゴ・サイト名エリア --> <div class="header__title"> <div class="site-branding"> <p class="site-branding__title"> <a href="https://example.com/" class="site-branding__link" rel="home">サイト名</a> </p> </div> </div><!-- .header__title --> <!-- ② グローバルナビゲーション --> <nav id="header-horizontal-nav" class="header__nav" aria-label="Primary navigation"> <div class="header-horizontal-menu-container"> <ul id="header-horizontal-menu" class="menu menu--header-horizontal"> <li><a href="/about/"><span class="menu__text">About</span></a></li> <li><a href="/contact/"><span class="menu__text">Contact</span></a></li> </ul> </div> </nav><!-- .header__nav --> </div><!-- .header__row --> </div><!-- .header --> </header><!-- #site-header -->ここで一つ注意点があります。
Apuraテーマでは、上記のHTMLのような
header.phpに直接書かれているわけではありません。Apuraの
header.phpはapura_headerというアクションフックを実行するだけの薄い構造になっており、実際のマークアップはテーマのinc/structure/フォルダ内のファイルで、このフックに登録された関数が組み立てています。<!-- header.php(Apuraテーマ・抜粋) --> <div class="site-container"> <?php do_action( 'apura_before_header' ); do_action( 'apura_header' ); // ← ヘッダー本体はここでフック実行される do_action( 'apura_after_header' ); ?> ... </div><!-- .site-container -->そして
apura_headerフックに登録されているのが、inc/structure/header.php内の関数です(抜粋)。<?php // inc/structure/header.php(抜粋) add_action( 'apura_header', __NAMESPACE__ . '\site_header' ); function site_header() { ?> <header id="site-header" <?php apura_attr( 'header', [ 'class' => 'l-header' ] ); ?>> <?php do_action( 'apura_after_header_open' ); do_action( 'apura_header_content' ); // ロゴ・ナビなどはさらにこのフックの先で組み立てられる do_action( 'apura_before_header_close' ); ?> </header><!-- #site-header --> <?php }つまり、ロゴやナビゲーションの中身を変更したい場合も、
header.phpやテーマ本体のstructureフォルダ内のファイルを直接編集するのではなく、apura_header_contentのような用意されたフックを使ってカスタマイズするのが安全です(テーマ本体のファイルは更新のたびに上書きされます)。今回のようにCSSだけで固定ヘッダーを実装する場合は、このフック構造まで意識する必要はなく、実際に出力されている
idやclassをそのままCSSのセレクタとして使えば十分です。 - 固定用CSSを追加する
確認したクラス名に合わせて、以下のCSSを書き換えて追加します。
.site-headerの部分は実際のクラス名に置き換えてください。ヘッダーを固定するCSSプロパティには
position: fixedとposition: stickyの2種類があり、見た目はどちらも「スクロールしてもヘッダーが上に残る」ですが、挙動と実装の手間が異なります。方法A:position: fixedを使う
fixedは要素を通常の文書の流れから完全に切り離して画面に固定するプロパティです。そのため、切り離された分の高さを
bodyのpadding-topで必ず補ってあげる必要があります。.site-header { position: fixed; top: 0; left: 0; width: 100%; z-index: 999; } /* ヘッダーの高さ分だけ本文を下にずらし、コンテンツが隠れるのを防ぐ */ body { padding-top: 80px; /* ヘッダーの実際の高さに合わせて調整 */ }方法B:position: stickyを使う(おすすめ)
stickyは要素を通常の文書の流れに残したまま、スクロールして指定位置(top: 0)まで到達すると固定表示に切り替わるプロパティです。ヘッダーが元から占めていた高さ分の余白がすでに確保されているため、
fixedのときのようなpadding-topでの帳尻合わせが不要になり、次で紹介する「本文の見出しがヘッダーの下に隠れる」不具合もそもそも起きにくくなります。marginやpaddingの調整に自信がない場合は、まずこちらを試すのがおすすめです。.site-header { position: sticky; top: 0; z-index: 999; } - 表示を確認・調整する
保存後、ページをスクロールしてヘッダーが上部に固定されているか確認します。
padding-topの数値は、ヘッダーの実際の高さ(開発者ツールで確認できます)にぴったり合わせるとズレがなくなります。スマートフォン表示も忘れずに確認してください。
よくある不具合と対処法
本文の見出しがヘッダーの下に隠れる
これは最も多いトラブルです。
position: fixedにした要素は通常の文書の流れから外れるため、その分の高さをpadding-topやmargin-topで補ってあげる必要があります。
さらに、ページ内リンク(目次やアンカーリンク)を使っている場合は、スクロール先がヘッダーの下に隠れることもあるので、以下のCSSも合わせて追加すると改善します。
/* アンカーリンクの飛び先がヘッダーに隠れないようにする */
h2, h3, h4 {
scroll-margin-top: 90px; /* ヘッダーの高さ+余白 */
}
スマートフォンでヘッダーが大きすぎる・崩れる
PCでは問題なくても、スマートフォンではヘッダーが画面の多くを占めてしまうことがあります。メディアクエリで、画面幅に応じてヘッダーの高さやフォントサイズを縮小しましょう。
@media (max-width: 600px) {
.site-header {
height: 56px;
}
body {
padding-top: 56px;
}
}
他の固定要素(メニューバーや通知バー)と重なる
固定表示のお知らせバーや管理者バーなど、他にもposition: fixedの要素がある場合は、z-indexの数値を見直して重なり順を整理してください。数値が大きいほど手前に表示されます。
テーマ側に固定ヘッダー機能がある場合
CSSを自分で書きたくない場合や、表示の崩れを気にせず安全に設定したい場合は、固定ヘッダー機能をあらかじめ備えたテーマを使うのも一つの選択肢です。
ApuraPro(有料)では、カスタマイザーの設定からヘッダーの固定表示・スクロール時の挙動(縮小表示など)を切り替えられるため、CSSを書かずに見出しの隠れやモバイルでの崩れを気にせず設定できます。
すでにCSSで固定ヘッダーを実装していて、メンテナンスに手間がかかっていると感じる場合は、テーマ標準機能への切り替えも検討してみてください。
まとめ
ヘッダーの固定表示は、まずテーマやプラグインに専用機能がないか確認し、なければCSSで実装するのが基本の流れです。
CSSで実装する場合は、padding-topの調整が不要で「見出しが隠れる」不具合も起きにくいposition: stickyをまず試し、親要素のoverflow指定などでうまく効かない場合だけposition: fixed+padding-topに切り替えるとよいでしょう。
固定後は「コンテンツが隠れていないか」「スマートフォンで崩れていないか」を必ずチェックし、必要に応じてscroll-margin-topやz-indexで微調整しましょう。
