position: stickyとは?
position: stickyの基本的な役割と特徴
position: sticky
は、要素をスクロールに応じて「通常のフローに従いつつ、特定の位置で固定できる」CSSのプロパティです。
ナビゲーションバーやサイドバーをスクロールに応じて固定したい場合に便利です。
position: fixed
やabsolute
との違い・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
の「固定する基準」が制限されるため、意図した動作になりません。
親要素の overflow
を visible
に変更する
.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
を適用しても、スクロールの影響を受けて固定されないことがある。
親要素のoverflow
をvisible
にする。
もしくは sticky
の親要素を見直し、ページ全体のスクロールに依存させる
.scroll-container {
overflow: visible;
}
5.position: stickyの対象要素がtableのtdやthの中にある
table
のth
やtd
にposition: sticky;
を適用すると、思ったように動作しないことがある。
thead
にposition: sticky;
を適用する
またはth
をdisplay: block;
にする(ただし、テーブルのデザインが崩れる可能性があります)
thead {
position: sticky;
top: 0;
background: white;
}
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の動作を試しながら、コードをカスタマイズしてみましょう!
コメント