ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
position: sticky の基本
CSS の position: sticky は、スクロール位置が閾値を超えると要素がその位置で固定される挙動を実現します。サイドバー、ヘッダー、テーブルヘッダー固定によく使われます。
.sidebar {
position: sticky; /* これだけではダメ */
top: 0; /* 必ず top/bottom/left/right のいずれかが必要 */
}
/* ヘッダー固定 */
header {
position: sticky;
top: 0;
z-index: 100;
background: white;
}
/* テーブルヘッダー固定 */
thead th {
position: sticky;
top: 0;
background: #f0f0f0;
}
基本のレイアウト例(サイドバー固定)
<div class="container">
<main class="content">
<!-- 長い本文 -->
</main>
<aside class="sidebar">
<!-- ナビゲーション -->
</aside>
</div>
<style>
.container {
display: flex;
gap: 24px;
align-items: flex-start; /* これ重要! */
}
.content {
flex: 1;
}
.sidebar {
width: 240px;
position: sticky;
top: 16px; /* 上端から 16px 空ける */
max-height: calc(100vh - 32px);
overflow-y: auto;
}
</style>
動かないときのチェックリスト
| チェック項目 | 確認方法 | 修正 |
|---|---|---|
top / bottom / left / right 未指定 | DevTools で値確認 | top: 0 を追加 |
親に overflow: hidden / auto / scroll | 親をたどって overflow を確認 | overflow を visible に |
| 親の高さが sticky 要素と同じ | 親に高さ指定があるか | 親に align-items: flex-start や min-height |
| display: flex の影響 | 親が flex で要素が伸びている | align-self: flex-start |
| z-index 不足 | 固定後、他要素に隠れる | z-index: 100 追加 |
テーブル thead で効かない | 古いブラウザ仕様 | th 個別に sticky 指定 |
罠1: 親要素の overflow
祖先要素のどこかに overflow: hidden / auto / scroll があると sticky が無効になります。スクロールコンテナが別になり、ビューポートに対するスクロールを観測できないためです:
<body>
<div style="overflow: hidden;"> <!-- ← これが原因 -->
<div class="sidebar"
style="position: sticky; top: 0;">
サイドバー(動かない)
</div>
</div>
</body>
<!-- 修正: overflow を消すか、別の方法で hidden 効果を得る -->
罠2: 親要素の高さ
flex レイアウトの場合、デフォルトで全ての子が同じ高さに伸びます。サイドバー自身の高さ = コンテナの高さ となり、スクロールしてもくっつく余地がない:
/* NG: サイドバーが本文と同じ高さに伸びる */
.container {
display: flex;
}
.sidebar {
position: sticky;
top: 0;
/* スクロールする余地がない */
}
/* OK: コンテナ側で子の伸びを抑制 */
.container {
display: flex;
align-items: flex-start; /* これ */
}
/* または個別に */
.sidebar {
align-self: flex-start;
position: sticky;
top: 0;
}
テーブルヘッダーの固定
<style>
.table-wrap {
/* overflow を sticky の祖先に置かない! */
height: 400px;
overflow-y: auto; /* これがスクロールコンテナ */
}
.table-wrap th {
position: sticky;
top: 0;
background: #f5f5f5;
z-index: 1;
}
/* 左列も固定したいとき */
.table-wrap td:first-child,
.table-wrap th:first-child {
position: sticky;
left: 0;
background: #fff;
z-index: 2;
}
/* 左上の交点 */
.table-wrap th:first-child {
z-index: 3;
}
</style>
<div class="table-wrap">
<table>
<thead>
<tr><th>項目</th><th>値1</th><th>値2</th></tr>
</thead>
<tbody><!-- 大量の行 --></tbody>
</table>
</div>
scroll-margin と組み合わせる
sticky ヘッダーがあるとアンカーリンクで「ヘッダーの下に隠れる」問題が起きます。scroll-margin-top で解決:
header {
position: sticky;
top: 0;
height: 60px;
}
/* アンカーで飛んだとき、ヘッダー高さぶん余白を取る */
h2[id] {
scroll-margin-top: 80px;
}
html {
scroll-behavior: smooth; /* スクロールも滑らかに */
}
IE / 古いブラウザ対応
IE は完全非対応。Edge Legacy も限定的。フォールバックパターン:
.sidebar {
/* IE 用フォールバック */
position: fixed;
top: 0;
width: 240px;
}
/* sticky 対応ブラウザでは上書き */
@supports (position: sticky) {
.sidebar {
position: sticky;
top: 0;
}
}
JS でフォールバックするなら stickybits が定番。
Tailwind CSS
<!-- sticky top-0 で1行 -->
<aside class="sticky top-0 self-start w-64 max-h-screen overflow-y-auto">
サイドバー
</aside>
<!-- 上から 4 (1rem) 開ける -->
<header class="sticky top-0 z-10 bg-white">
ヘッダー
</header>
レスポンシブ
/* PC: 固定サイドバー */
.sidebar {
position: sticky;
top: 16px;
}
/* モバイル: sticky を解除 */
@media (max-width: 768px) {
.sidebar {
position: static;
}
}
FAQ
Q: position: -webkit-sticky は今も必要?
A: 2017 年以降のブラウザでは不要。Safari 13 以降は position: sticky 単独で動きます。
Q: 親に overflow が必要だが sticky も使いたい
A: 構造を変える必要があります。sticky 要素を overflow コンテナの外に移動するか、内側でスクロールする設計に変更してください。
Q: 複数の sticky を縦に並べたい
A: それぞれに違う top を指定(1 個目 top: 0、2 個目 top: 60px 等)。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?