position sticky 2026年:設定と効かないを即解決

position sticky 2026年:設定と効かないを即解決
はじめに:position: stickyとは?スクロール追従UIをCSSだけで実現
Webサイトを閲覧中、ページをスクロールしてもヘッダーが画面上部に固定されていたり、サイドバーの目次が特定の位置で停止したりするデザインを目にすることがあります。このような「スクロールに追従するUI」は、ユーザーの利便性を大きく向上させます。
かつてはJavaScriptが必須だったこの種の動きも、現在ではCSSのposition: sticky;プロパティを使えば、手軽に実装可能です。
position: stickyの基本的な考え方
position: stickyは、ひと言でいえば「通常時」と「固定時」という2つの状態を持つ配置方法です。
- 通常時:
position: relativeのように、HTMLの構造に従ってページ内の特定の位置に配置されます。 - 固定時: ユーザーがスクロールし、要素が画面の特定の位置(例: 画面上端)に達すると、
position: fixedのようにその場に「貼り付いて(sticky)」固定されます。
つまり、position: stickyはスクロール量に応じてrelativeとfixedの挙動を自動で切り替える、非常に便利なプロパティです。これにより、特定の範囲内でのみ要素を固定するといった、柔軟なレイアウトが実現できます。
この記事でわかること
この記事では、position: stickyを使いこなし、快適なWebサイトを構築するための知識を網羅的に解説します。単なる構文の紹介にとどまらず、実践で役立つ情報まで深く掘り下げます。
具体的には、以下の内容を学べます。
- 基本構文と仕組み:
position: stickyとtop,leftなどのプロパティの基本的な使い方 position: fixedとの違い: 似て非なる両者の挙動と使い分けのポイント- 実践的な活用例: ヘッダー、サイドバー、テーブル見出しなど、具体的なコード例を交えた実装方法
- トラブルシューティング: 「
position: stickyが効かない」といった、よくある問題の原因と解決策
CSSだけでリッチな表現ができるposition: stickyをマスターし、Webサイトの利便性をさらに高めましょう。
position: stickyの基本的な使い方と仕組み
それでは、position: stickyの基本的な使い方と、そのユニークな動作の仕組みを詳しく見ていきましょう。CSSの記述は非常にシンプルで、いくつかのポイントさえ押さえれば誰でも簡単に実装できます。
position: stickyの基本構文
position: stickyを機能させるには、最低でも2つのプロパティが必要です。要素にposition: stickyを指定し、さらにtop, right, bottom, leftのいずれか一つ以上で、固定を開始する位置(閾値)を設定します。
最も一般的な、画面上部に要素を固定する例を見てみましょう。
.sticky-element {
position: sticky; /* 要素をスティッキーに設定 */
top: 0; /* 画面上端から0pxの位置で固定 */
}
このCSSが適用された.sticky-elementは、スクロールによって要素の上端がビューポート(ブラウザの表示領域)の上端に達した瞬間に、その位置で固定されます。
スクロールで切り替わる仕組み
position: stickyの最大の特徴は、スクロールに応じて配置の基準が動的に切り替わる点にあります。
- 通常時(相対位置): スクロール位置が閾値に達するまでは、
position: relativeのように振る舞い、HTMLの記述通りの場所に表示されます。 - 固定時(固定位置): スクロールが進んで要素が
top: 0;などで指定した閾値に達すると、position: fixedのように振る舞い、ビューポートを基準にその場に固定されます。
ここで重要なのは、position: stickyを指定した要素は、その親要素の範囲内でしか固定されないという点です。スクロールして親要素が完全に画面外に出ると、固定されていた要素も一緒に画面外へ移動します。この挙動が、ページ全体で固定され続けるposition: fixedとの大きな違いです。

relative, fixedとの違い
position: stickyの挙動をより深く理解するために、他のpositionプロパティと比較してみましょう。
| プロパティ | 基準位置 | スクロール時の挙動 | 主な用途 |
|---|---|---|---|
relative |
要素自身の元の位置 | スクロールに追従する | absoluteの基準点、z-indexの適用など |
fixed |
ビューポート(表示領域) | スクロールしても常に同じ位置に固定 | ページ全体のヘッダー、追従ボタンなど |
sticky |
通常時: 元の位置 固定時: ビューポート |
特定の位置に達すると固定される | セクション見出し、サイドバー、テーブルヘッダーなど |
このように、position: stickyはrelativeの柔軟性とfixedの固定機能を併せ持った、非常に便利なプロパティと言えます。
実践的な活用例と「効かない」ときの原因・対処法
position: stickyの便利な挙動を理解したところで、実際のWebサイト制作での活用方法を具体的なコード例と共に見ていきましょう。また、多くの開発者がつまずく「効かない」問題の原因と、その対処法も詳しく解説します。
便利な活用シーンとコード例
position: stickyは、特定の要素をユーザーの視界に留めておきたい場合に非常に効果的です。
1. 追従ヘッダー
スクロールしてもヘッダーが画面上部に固定される、一般的なUIです。position: fixedでも実現できますが、stickyなら親要素の範囲内でのみ固定されるため、より柔軟なレイアウトが可能です。
.header {
position: -webkit-sticky; /* Safari向け */
position: sticky;
top: 0;
background-color: #fff;
z-index: 10; /* 他の要素より手前に表示 */
}
2. 追従サイドバー
記事コンテンツの横にある目次や広告などを、スクロールに追従させたい場合に役立ちます。
.sidebar {
position: -webkit-sticky;
position: sticky;
top: 20px; /* ヘッダーの高さなどを考慮して調整 */
}
3. テーブルの見出し固定
縦に長いテーブル(料金表やデータ一覧など)で、ヘッダー行(<th>)を固定すると、どのデータを見ているかが一目で分かります。
.table-container th {
position: -webkit-sticky;
position: sticky;
top: 0;
background-color: #f2f2f2;
}

position: stickyが効かない?主な原因と解決策
非常に便利なposition: stickyですが、「指定したのに動かない」という状況に陥ることがあります。その原因のほとんどは、以下のいずれかに当てはまります。
1. 親要素にoverflowが指定されている
これが最も一般的な原因です。position: stickyを指定した要素の親要素のいずれか(直接の親だけでなく、祖先要素も含む)にoverflow: hidden、overflow: auto、overflow: scrollが設定されていると、stickyは機能しません。
- 原因:
position: stickyは、最も近いスクロール可能な親コンテナ(スクロールコンテナ)内で動作します。親要素にoverflowが指定されると、その親要素自体がスクロールコンテナとなり、ウィンドウ全体のスクロールを基準にできなくなるためです。 - 対処法: 開発者ツールで
sticky要素の親要素を遡り、overflowプロパティが指定されていないか確認します。もし指定があれば、その指定を解除するか、HTMLの構造を見直す必要があります。
2. top, right, bottom, leftの閾値が指定されていない
position: sticky;と記述しただけでは、要素は固定されません。top: 0;のように、どの位置で固定を開始するかの閾値を必ず1つ以上指定してください。
3. 他の要素との重なり順(z-index)
スティッキー要素が、他の要素の背後に隠れてしまっているケースです。一見すると動いていないように見えますが、実際には固定されています。z-indexプロパティに適切な値を設定し、重なり順を調整しましょう。
これらの原因を一つずつ確認すれば、position: stickyが効かない問題のほとんどは解決できるはずです。
補足情報
基本的な使い方と注意点を押さえたところで、さらに一歩踏み込み、position: stickyをより効果的に活用するための追加情報や、開発現場で遭遇しやすい疑問について掘り下げていきます。これらの知識は、実装の幅を広げ、より洗練されたUIの構築に役立ちます。

JavaScriptと連携して表現力を高める
position: stickyはCSSだけで手軽に実装できるのが魅力ですが、JavaScriptと組み合わせることで、さらにインタラクティブな表現が可能になります。例えば、「要素が固定された瞬間にスタイルを変更する」といった挙動は、CSSだけでは実現できません。
この動的な変化を実装する際に強力なのがIntersection Observer APIです。これは、特定の要素がビューポートや他の要素と交差したことを非同期で監視できるブラウザの機能です。これを利用して、sticky要素がビューポートの上端に「くっついた」タイミングを検知できます。
具体的な実装手順は以下の通りです。
- 監視用の要素を設置する:
sticky要素の直上(または直下)に、高さ1px程度の目印となる要素(例:<div class="sentinel"></div>)を配置します。 Intersection Observerを設定する: この目印要素がビューポートから外れた(または入った)瞬間を監視します。- クラスを付け替える: 目印要素が画面外に出たということは、
sticky要素が上端に到達し固定状態になったことを意味します。このタイミングでJavaScriptを使い、sticky要素に特定のクラス(例:.is-sticky)を付与します。 - CSSでスタイルを定義する:
.is-stickyクラスが付与された際のスタイル(例:背景色を変更する、影をつける)をあらかじめCSSで定義しておきます。
この手法を用いれば、sticky状態になったヘッダーの背景を半透明にしたり、区切り線を表示したりと、ユーザーに状態変化を視覚的に伝えられます。スクロールイベントを直接監視する方法に比べてパフォーマンスへの負荷が格段に低く、スムーズな動作を維持できるのが大きな利点です。
position: stickyに関するよくある質問
ここでは、position: stickyに関して頻繁に寄せられる質問とその回答をまとめました。
Q1. テーブル(<table>)のヘッダーを固定できますか?
A1. はい、可能です。むしろ、position: stickyが非常に効果的なユースケースの一つです。行数の多いテーブルでは、スクロールするとヘッダーが見えなくなり、各列が何のデータを示しているのか分かりにくくなります。
<thead>内の<th>要素にposition: sticky;とtop: 0;を適用することで、テーブル本体をスクロールしてもヘッダー行が常に表示され続け、データの可読性が劇的に向上します。
th {
position: sticky;
top: 0;
background-color: #fff; /* 背景色を指定しないと下のコンテンツが透ける */
}
この際、thに背景色を指定することを忘れないでください。指定しないと、スクロールしてきたテーブルの行がヘッダーの下に透けて見え、文字が重なってしまいます。
Q2. position: fixedとの使い分けが分かりません。
A2. 両者の最も大きな違いは「固定される基準となる範囲」です。
position: fixed: ビューポート全体を基準に位置が固定されます。ページ内のどこをスクロールしていても、常に画面上の同じ場所に表示され続けます。ページ追従型のSNSシェアボタンや、「トップへ戻る」ボタンなどが代表例です。position: sticky: 親のスクロールコンテナを基準に動作します。通常は他の要素と同じようにスクロールしますが、指定した位置に到達すると、親コンテナの範囲内で固定されます。記事のサイドバーや、特定のセクション内だけで追従させたい広告バナーなどに適しています。
「常に画面内に表示したい」ならfixed、「特定の範囲内だけで固定したい」ならsticky、と覚えると良いでしょう。
パフォーマンスに関する考慮事項
position: stickyは、JavaScriptでスクロール位置を監視して要素の位置を変更する従来の手法に比べ、パフォーマンス面で非常に優れています。これは、ブラウザのレンダリングエンジンがネイティブに最適化を行うため、メインスレッドの処理を妨げることなく、滑らかなスクロールを実現できるからです。
しかし、無条件に多用して良いわけではありません。特に、box-shadowやfilterといった描画負荷の高いプロパティが適用された要素を多数stickyにすると、スクロール時の再描画コストが増加し、パフォーマンスに影響を与える可能性があります。
position: stickyは強力なツールですが、その特性と挙動を深く理解することが、意図した通りのレイアウトと快適なユーザー体験を実現する鍵となります。
まとめ:position: stickyを使いこなし、UI/UXを向上させよう
position: stickyは、スクロールに応じて要素を特定の位置に固定できる、非常に強力なCSSプロパティです。追従ヘッダーやサイドバーナビゲーション、テーブルの見出し固定など、ユーザーが常に情報を参照できるインターフェースを、JavaScriptに頼ることなく軽快に実装できます。これにより、ユーザー体験(UX)を大きく向上させることが可能です。
これまで見てきたように、position: stickyは直感的に使える一方で、いくつかの重要なルールが存在します。実装でつまずかないために、以下のポイントを必ず押さえておきましょう。
position: stickyを使いこなすためのチェックリスト
閾値(オフセット)を必ず指定する
position: sticky;と宣言するだけでは要素は固定されません。top: 0;のように、top,right,bottom,leftのいずれかで固定を開始する位置を必ず指定してください。-
親要素の
overflowプロパティを確認する これが最も一般的な「効かない」原因です。stickyを指定した要素の祖先要素にoverflow: hiddenやoverflow: autoが設定されていると、意図通りに動作しません。開発者ツールで親要素を遡り、不要なoverflow指定がないか確認しましょう。 -
親要素の高さが十分にあるか確認する
sticky要素は、親要素のコンテンツ領域をはみ出して固定され続けることはありません。親要素の高さが足りなければ、すぐに固定が解除されてしまいます。固定したい範囲をカバーできるだけの高さを親要素が持っているか、HTML構造を確認することが重要です。 -
重なり順を
z-indexで管理する 要素が固定されても、他の要素の背後に隠れてしまっては意味がありません。必要に応じてz-indexプロパティで重なり順を明示的に指定し、sticky要素が常に最前面に表示されるように調整しましょう。
position: relativeの配置とposition: fixedの固定という、両方の特性を併せ持つposition: stickyは、現代のWebデザインにおいて欠かせないテクニックの一つです。今回解説した注意点を理解すれば、これまで複雑なJavaScriptで実装していた動的レイアウトも、よりシンプルかつ効率的に作成できます。
これらの知識を武器に、あなたのWebサイトやアプリケーションでposition: stickyを積極的に活用してみてください。まずはサイトのナビゲーションなど、身近な要素から試してみることで、その便利さと効果をすぐに実感できるはずです。
