CSS position: stickyが効かない時の対処法

コーディング

position: stickyとは?

position: stickyの基本的な役割と特徴

position: stickyは、要素をスクロールに応じて「通常のフローに従いつつ、特定の位置で固定できる」CSSのプロパティです。
ナビゲーションバーやサイドバーをスクロールに応じて固定したい場合に便利です。

position: fixedabsoluteとの違い

・fixed常に画面の同じ位置に固定される(ページ全体に対して適用)
・absolute通常のレイアウトフローから外れ、親要素を基準に固定される
・sticky通常のレイアウトに従うが、特定の位置を超えたら固定される

position: stickyの活用シーン
  • ナビゲーションバーの固定
  • サイドバーをスクロール時に固定
  • テーブルのヘッダー(thead)をスクロール時に固定

例:スクロールしても常に上部に固定されるヘッダー

.header {
  position: sticky;
  top: 0;
  left: 0;
  background: white;
  z-index: 1000;
}

position: stickyが効かない原因と対処法

1. 親要素にoverflow: hidden;が設定されている

問題点

position: sticky は、親要素に overflow: hidden;overflow: auto; があると機能しません。
overflow を設定すると、sticky の「固定する基準」が制限されるため、意図した動作になりません。

解決策

親要素の overflowvisible に変更する

.parent {
  overflow: visible; /* hidden や auto を使わない */
}

2.top, bottom, left, rightの指定がない

問題点

position: sticky は、どの位置で固定するかの指定が必須top, bottom, left, right のどれか)です。
これがないと、通常のrelativeのように動作してしまいます。

解決策

固定位置を指定する(例:top: 0; で上部固定)

3. display: flex;の子要素だとstickyが効かない

問題点

stickyの要素がdisplay: flexの子要素の場合、意図した動作にならないことがあります。
親要素のalign-items: stretchの影響でstickyが正しく動作しないこともあります。

解決策

align-self: flex-start;を指定してstickyを効かせる

.parent {
  display: flex;
}

.child {
  position: sticky;
  top: 10px;
  align-self: flex-start;
}

4.position: stickyの要素がoverflow: auto;のコンテナ内にある

問題点

スクロールのある親要素(overflow: auto;)の中にstickyを適用しても、スクロールの影響を受けて固定されないことがある。

解決策

親要素のoverflowvisibleにする。
もしくは sticky の親要素を見直し、ページ全体のスクロールに依存させる

.scroll-container {
  overflow: visible;
}

5.position: stickyの対象要素がtableのtdやthの中にある

問題点

tablethtdposition: sticky;を適用すると、思ったように動作しないことがある。

解決策

theadposition: sticky;を適用する
またはthdisplay: block;にする(ただし、テーブルのデザインが崩れる可能性があります)

thead {
  position: sticky;
  top: 0;
  background: white;
}

position: stickyを正しく動作させるためのチェックリスト

top, bottom, left, right のどれかを指定しているか?
親要素に overflow: hidden;overflow: auto; が設定されていないか?
display: flex; の影響を受けていないか?
position: sticky; を適用する要素が適切か?

実際に試してみよう

position: sticky が効かない理由と対策」がわかったら、次は 実際にコードを書いて試してみましょう!
以下のコードでHTMLファイルを作成して、自分の環境で試してみてください!

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Stickyテスト</title>
  <style>
    .container {
      height: 1500px;
      padding: 20px;
    }
    .sticky {
      position: sticky;
      top: 0;
      background: lightblue;
      padding: 10px;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="sticky">私はスクロールすると固定されます</div>
    <p>スクロールしてみてください。</p>
  </div>
</body>
</html>

💡 Stickyの動作を試しながら、コードをカスタマイズしてみましょう!

この記事を書いた人
管理人

2012年にWebデザインの勉強を始め、2013年より制作会社に勤務。
これまでに500件以上のWebサイト制作・運用に携わってきました。
現在も制作会社に勤務しながら、Webデザインスクールのトレーナーとしても後進の育成に取り組んでいます。
WordPressやデザインの実践的なノウハウを、初心者にもわかりやすく発信できるよう試行錯誤しています。

管理人をフォローする
コーディング
管理人をフォローする

コメント

タイトルとURLをコピーしました