CSSポジショニング
CSSのポジショニングは強力なレイアウトツールで、ページ上の要素の配置を細かく制御できます。
positionプロパティ早見表
| 値 | 動作 | 基準点 | よく使うケース |
|---|---|---|---|
static |
通常フロー(デフォルト) | — | デフォルトの動作 |
relative |
通常位置からのオフセット | 自身の元の位置 | 微調整、配置コンテキスト |
absolute |
フローから除外 | 最近の配置された祖先 | バッジ、オーバーレイ |
fixed |
ビューポートに固定 | ビューポート | 固定ヘッダー、トップに戻る |
sticky |
ハイブリッド | スクロールコンテナ + ビューポート | 固定ヘッダー |
position: relative
通常位置からのオフセットで、ドキュメントフローから除外されません:
サンプル
HTML
<style>
.box {
position: relative;
top: 20px; /* 20px下に移動 */
left: 30px; /* 30px右に移動 */
background: #e3f2fd;
padding: 10px;
}
</style>
<div class="box">相対配置(元の位置からのオフセット)</div>
<p>この段落は通常フローのままです——ボックスはまだ元のスペースを占有しています。</p>
よく使うケース:
- 要素の位置の微調整
- absoluteの子要素の配置コンテキストの作成
position: absolute
フローから除外され、最近の配置された祖先に対して相対的に配置:
サンプル
HTML
<style>
.parent {
position: relative;
width: 300px;
height: 200px;
background: #f5f5f5;
border: 2px solid #333;
}
.badge {
position: absolute;
top: 10px;
right: 10px;
background: #e74c3c;
color: white;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
}
</style>
<div class="parent">
<div class="badge">HOT</div>
<p>商品カードコンテンツ</p>
</div>
重要: 配置された祖先が存在しない場合、absoluteはビューポートに対して相対的に配置されます。
position: fixed
ビューポートに固定され、ページと一緒にスクロールしません:
サンプル
HTML
<style>
.fixed-header {
position: fixed;
top: 0;
left: 0;
right: 0;
background: #2c3e50;
color: white;
padding: 10px 20px;
z-index: 1000;
}
</style>
<div class="fixed-header">固定ヘッダー——常に上部に表示</div>
よく使うケース:
- ナビゲーションバー
- トップに戻るボタン
- チャットウィジェット
position: sticky
relativeとfixedのハイブリッド——通常はスクロールし、しきい値で「固定」されます:
サンプル
HTML
<style>
.sticky-nav {
position: sticky;
top: 0;
background: #2c3e50;
color: white;
padding: 10px;
z-index: 100;
}
</style>
<div class="sticky-nav">スティッキーナビ——コンテンツと一緒にスクロールし、上部で固定</div>
使用上の注意:
- 動作するには
top、bottom、left、またはrightの値が必要 - 親要素に
overflow: hiddenまたはoverflow: autoを設定できない - 親の高さはスティッキー要素の高さより大きくなければならない
z-index(重なり順)
要素が重なる場合、z-indexがどちらが上に表示されるかを制御:
サンプル
HTML
<style>
.box1 {
position: absolute;
z-index: 10;
background: #e74c3c;
width: 100px;
height: 100px;
}
.box2 {
position: absolute;
z-index: 5;
background: #3498db;
width: 100px;
height: 100px;
left: 30px;
top: 30px;
}
</style>
<div class="box1">z-index: 10(前面)</div>
<div class="box2">z-index: 5(背面)</div>
注意: z-indexは配置された要素(static以外)でのみ機能します。
スタッキングコンテキスト
z-indexは同じ「スタッキングコンテキスト」内で比較されます。各配置された要素はスタッキングコンテキストを作成し、子のz-indexは親のコンテキスト内でのみ比較されます。
❓ よくある質問
Q position: relativeはいつ使いますか?
A 最も一般的には、absoluteの子要素の配置基準として使用されます。親に`position: relative`を追加すると(オフセットなし)、`position: absolute`の子要素はその親に対して相対的に配置されます。親にrelativeがない場合、absoluteはページ全体に対して相対的に配置されます。
Q fixedポジショニングはモバイルでうまく機能しませんか?
A fixedはモバイルSafariで一貫性のない動作をします。特にキーボードのポップアップやページスクロール時に顕著です。一部のシナリオでは`position: sticky`を代替として使用するか、JavaScriptでモバイルを検出して特別に処理します。
Q z-indexを高く設定してもまだブロックされますか?
A z-indexは同じスタッキングコンテキスト内でのみ機能します。親にz-indexがある場合、子のz-indexはその親のコンテキスト内でのみ比較されます——親の境界を越えることはありません。親のz-indexが低いか、`opacity`など新しいスタッキングコンテキストを作成するプロパティがないか確認してください。
📖 まとめ
- CSSのポジショニングは強力なレイアウトツールです
relativeは微調整と配置コンテキスト用absoluteは親の中で子を正確に配置fixedはビューポート固定要素(ナビゲーション、トップに戻る)用stickyは「位置で固定」シナリオ用z-indexスタッキングと組み合わせて、あらゆるレイアウトニーズに対応
📝 演習
position: absoluteを使用して、右上隅に「HOT」バッジを持つ「商品カード」を作成してください。position: fixedを使用して、固定の下部ナビゲーションバーまたは著作権表示を作成してください。- 「スティッキー見出し」を作成してください——スクロール時に次のタイトルが押し出すまで上部に固定されるセクションタイトル。
- 子要素の絶対中央揃えを実装してください(absolute + top/left + transformを使用)。



