Day 7 です。
Phase 1 の最終日です。今日のテーマは Position です。
「スクロールしてもついてくるヘッダーや、画像の上に重なるバッジを実装する」 ことが今日の目標です。
📝 インプット:4 つの「基準」を知る
position プロパティを使う時、一番大事なのは「何(どこ)を基準に配置するか?」です。
| 値 | 基準となるもの | よく使う場面 |
|---|---|---|
static |
なし(デフォルト) | 何もしない普通の配置。 |
relative |
本来あるべき位置 | その場所から少しだけずらしたい時。または absolute の基準点(親)にしたい時。 |
absolute |
親要素 ※ | 親の左上を原点として、好きな場所に配置。「画像右上の NEW アイコン」など。 |
fixed |
ブラウザ画面 | スクロールしても画面の同じ場所に居続ける。「トップへ戻るボタン」「モーダル」など。 |
sticky |
スクロール位置 | スクロールして画面端に来たらピタッと張り付く。「追従ヘッダー」「目次」など。 |
※ absolute を使う時は、親要素(または祖先)に position: relative が指定されている必要があります。これがないと、画面全体(body)を基準にして配置されてしまいます。「親に relative、子に absolute」は CSS の定石です。
🎯 本日の目標
「Position 全部盛りの Web ページ」を作ってください。
以下の 3 つの要件を満たすシンプルなページを作ります。
- Sticky ヘッダー: ページをスクロールしても、途中から画面上部に張り付いてついてくるヘッダー。
- Absolute バッジ: コンテンツ内のボックスの「右上」に、「SALE」や「New」というバッジを重ねて表示する。
- Fixed ボタン: 画面の「右下」に、常に表示される「トップへ戻る(↑)」ボタンを置く。
📝 ミッション内容
雛形コード
今回は構造が少し複雑なので、ベースを使ってください。
<!-- 1. 追従するヘッダー -->
<header class="sticky-header">My Website</header>
<div class="container">
<p>↓ スクロールしてみてください ↓</p>
<!-- 2. 重ね合わせのデモ -->
<div class="box-wrapper">
<div class="box">
商品画像やコンテンツ
<!-- ここに絶対配置でバッジを乗せる -->
<span class="badge">SALE</span>
</div>
</div>
<!-- スクロール発生用のダミーテキスト(長い文章) -->
<p>
(ここに適当な長い文章を入れて、縦スクロールが発生するようにしてください...<br /><br /><br /><br /><br />スクロール...<br /><br /><br /><br /><br />もっとスクロール...)
</p>
</div>
<!-- 3. 画面固定ボタン -->
<a href="#" class="fab-btn">↑</a>
💻 実装サンプル
正解例
See the Pen CSSマスターへの道「Position」 by サカツ (@saka2jp) on CodePen.
🧠 解説と重要ポイント
-
stickyの挙動確認:-
top: 0を指定しないと機能しません。 - 「親要素の高さの中」でしか追従しません。今回は
body直下に近いのでずっとついてきますが、特定のセクション内で使うと「そのセクションが終わったら消える」という挙動になります。
-
-
relativeを外してみる:-
.boxのposition: relative;を一時的にコメントアウトしてみてください。「SALE」バッジがどこに移動するか確認しましょう(おそらくページの右上に移動します)。これが「基準点のロスト」です。
-
-
z-index(重なり順):- 固定ヘッダーやボタンが、他の画像の下に隠れてしまわないように、
z-indexで数値を指定して手前に持ってきます。
- 固定ヘッダーやボタンが、他の画像の下に隠れてしまわないように、
おわりに
これで Phase 1: レイアウトの達人 は修了です。
ボックスモデル、Flexbox、Grid、レスポンシブ、そして Position。
これらを組み合わせれば、一般的な Web サイトのレイアウトを再現できる基礎力がつきました。
次回からの Phase 2 は、「見た目」を充実させるパートです。
グラデーションや影を使って、リッチなデザインを作っていきましょう。