スクロールに合わせて要素をピタリと張り付かせる—— それが position: sticky;
だ。
ところが、君のナビは動かない! 「なぜだ!? CSS は正しく書いたはずなのに…」
その疑問こそ、今回のデバッグ道場のテーマである!
Contents
🧩 問題:コードを見よ!
以下のサンプルは、ナビゲーションを固定したいだけのシンプルな構成だ。
<style>
.wrapper {
height: 150vh;
overflow: auto;
border: 2px dashed #999;
}
nav {
position: sticky;
top: 0;
background: #e91e63;
color: #fff;
padding: 8px 16px;
font-weight: bold;
}
</style>
<div class="wrapper">
<nav>団長ナビ(本来はここで張り付く)</nav>
<p>…長文が続く…</p>
</div>
しかし、スクロールしても nav は固定されない。 さて、真犯人はどこに潜むのか──!?
…長文が続く…

✅ 回答:親要素がスクロールコンテナ化していた!
原因は .wrapper
の overflow: auto;
。
これにより 親要素そのものがスクロールコンテナ となり、 子である nav
の position: sticky
は「親の枠内」でしか動作しなくなる。
結果、張り付くべきタイミングを得られず “効かない” と見えるわけだ。
…長文が続く…
📖 解説:sticky は「直近のスクロールコンテナ」を基準に働く
- overflow が
visible
以外になると、その要素はスクロールコンテナ扱い - sticky は最も近いスクロールコンテナの中でのみ固定される
- 親に
overflow: hidden|auto|scroll
があれば、子の sticky は外へ出られない
…というブラウザ仕様を理解していれば、 「sticky が効かない=親の overflow を疑う」が鉄板のチェックリストとなる。
💡 回避策&ベストプラクティス
- 親の
overflow
を外す(最もシンプル) - どうしても overflow が必要なら、sticky 対象を一つ外側へ
- 大きくレイアウトを見直すか、JS で代替(最後の手段)
🧠 Tips:スクロールコンテナの見つけ方
Chrome DevTools → Elements パネルで対象要素を右クリック → Scroll into View
と “Scroll Container” 表示をチェック。 sticky デバッグ時に覚えておくと便利だ。
📌 まとめ
- sticky が動かないときは親要素の overflowをまず疑え
- レイアウト調整で
overflow
を除去 or 階層を変える - 仕様を理解すれば、バグは“仕様通り”に変わる!
🔥 団長のエール
sticky は働き者だ。だが、働き場所を奪われれば力を発揮できない!
環境を整え、正しい仕様を味方にせよ──
戦え、そして勝ち取れ! 君のレイアウトの“理想形”をッ!!🔥