🍷
AppBar の下にコンテンツが隠れる問題の原因と解決方法【MUI + Next.js】
Next.js(App Router)、MUI(Material UI)で開発していると、AppBarをposition="fixed"で固定した際に、ページ上部の要素がヘッダーに隠れてしまうことがあります。
この記事では、
- なぜコンテンツが
AppBarの下に隠れるのか(原因) - MUI が推奨する解決方法
- 実際のコード例
をわかりやすく解説します。
結論:原因は「fixed AppBarが高さを占有しない」ため
<AppBar position="fixed">
上記のようにした場合、AppBarは画面上部に重ねて固定されるだけで、レイアウト上は高さを占有していない扱いになります。
そのため、次のような現象が起きます:
- ヘッダーのすぐ下にあるタイトルや画像が見えなくなる
- スクロール位置がずれたように感じる
- モバイルでは画面の縦幅が狭いため、
AppBarが占める相対的な割合が大きく、問題が顕著になりやすい
MUI公式の正しい解決方法:ToolbarをAppBarの下に置く
MUI公式ドキュメントでは、固定AppBarを使用する場合はその直下にToolbarを追加して余白を確保することを推奨しています。
▼ 公式ドキュメント(英語)
実装例
悪い例
<Header /> // AppBar(fixed)が含まれるコンポーネント
<main> ... </main> // ← ここが隠れる!
良い例
<Header /> // AppBar(fixed)が含まれるコンポーネント
<Toolbar /> // ← 自動的に AppBar と同じ高さの余白が生成される
<main> ... </main>
なぜToolbarがベストなのか?
- デフォルトでは
AppBarの高さは端末ごとに異なる- モバイル:約56px
- デスクトップ:約64px
- カスタマイズされているとさらに変化
-
Toolbarなら高さが自動で一致
ToolbarはAppBarの内部と同じ高さになるよう設計されています。つまり、自力でpaddingを設定したりする必要はありません。AppBarの下の要素にpaddingやmarginをつけることもできますが、モバイルとPCで高さがズレたりするので、MUIの設計思想に従う方が無難でしょう。
Toolbarなら高さが自動で一致する仕組み
Toolbarは単なる余白ではなく、MUIテーマ(Theme)内のmixins.toolbarの値を使って高さが決まる特殊なコンポーネントです。
MUIのAppBarとToolbarは次のような仕組みで連動しています:
- MUIのテーマには
theme.mixins.toolbarという、AppBarに対応した標準ツールバーの高さが定義されている - これはCSSのメディアクエリに対応したオブジェクトで、
- モバイル時(56px)
- デスクトップ時(64px) のようにレスポンシブに高さが変わる
-
Toolbarは内部でこのmixins.toolbarを自動的に適用する - 一方、
AppBarの内部に入るToolbarも同じmixinに基づいて高さが決まる
つまり、下記の高さが常に同じになるように設計されています。
-
AppBarの内部に配置されたToolbarと -
AppBarの外に置いて余白として使ったToolbar
このため、特別なCSSを設定しなくても、AppBarの高さと完全に一致した余白が正しく作られるというわけです。
まとめ
MUIのAppBarを固定すると下のコンテンツが隠れる原因は、AppBarがレイアウト上では高さを持たないためでした。
なので、MUIの設計思想に則って、AppBarの直後に<Toolbar />を配置して高さ分のスペースを作りましょう!
Discussion