【CSS】画像の上に文字を重ねたい!position: absolute と relative の完璧な使い方

FlexboxやMarginを使えば、要素を綺麗に並べることはできます。
でも、こんなデザインを作ろうとして手が止まったことはありませんか?

  • 「メイン画像の上に、キャッチコピーをドン!と重ねたい」
  • 「スクロールしても、メニューバーがずっと上についてきてほしい」
  • 「画像の右上に『NEW!』というアイコンを乗せたい」

これらに共通するのは「要素を重ねる」という動きです。
これを実現するのが、CSSの「position(ポジション)」プロパティです。

今回は、Webデザインの幅を一気に広げる「3つの配置ルール」をマスターしましょう!

1. 自由に配置する「Absolute(アブソリュート)」

positionの中で一番よく使うのがこれです。
position: absolute; を指定された要素は、「浮遊霊」のようになります。

他の要素の並び順(HTMLの順番)を無視して、指定した場所にフワッと浮いて配置されます。

.box {
    position: absolute;
    top: 10px;  /* 上から10px */
    right: 10px; /* 右から10px */
}

こう書くと、その要素は「画面の右上の角」に配置されます。

【最重要】「親=relative、子=absolute」のルール

しかし、absolute には初心者が必ずハマる罠があります。
ただ absolute と書いただけだと、基準が「ブラウザの画面全体」になってしまい、意図しない場所に飛んでいってしまいます。

「この画像の右上に置きたい!」というように、基準を決めたい場合は、「親要素」に目印をつける必要があります。

鉄板の書き方セット

  • 親要素(基準): position: relative;
  • 子要素(動かす物): position: absolute;

これをセットで覚えてください。「親がリラティブ、子がアブソリュート」です。
こうすることで、子要素は「親の箱の左上が原点(0,0)」になり、そこからの距離で配置できるようになります。

2. 画面に張り付く「Fixed(フィックスド)」

これは分かりやすいです。スクロールしても位置が変わらない「固定要素」を作ります。
追従するヘッダーや、画面右下の「トップへ戻るボタン」などで使います。

.header {
    position: fixed; /* 画面に固定! */
    top: 0;          /* 画面の一番上 */
    width: 100%;     /* 横幅いっぱいに */
    z-index: 100;    /* 他の要素より手前に表示(後述) */
}

3. 重なり順序を決める「z-index(ゼットインデックス)」

positionを使って要素を重ねると、「文字が画像の下に隠れちゃった!」ということが起きます。
そんな時は z-index で重なりの優先順位を指定します。

数字が大きいほど「手前」に来ます。

  • z-index: 0; (初期値)
  • z-index: 10; (少し手前)
  • z-index: 9999; (めちゃくちゃ手前)

※注:z-indexposition(static以外)が指定されている要素にしか効きません!

実践:画像の上に文字を重ねてみよう

では、おしゃれなWebサイトでよく見る「ヒーローヘッダー(トップ画像+文字)」を作ってみましょう。
top: 50%;left: 50%; に、transform という技を組み合わせて、「完全にど真ん中」に配置します。

<!DOCTYPE html>
<html lang="ja">
<head>
<style>
    /* 親要素(基準) */
    .hero-container {
        position: relative; /* ★ここが重要!子要素の基準点になる */
        width: 100%;
        height: 300px;
        background-image: url('https://placehold.jp/800x300.png'); /* ダミー画像 */
        background-size: cover;
    }

    /* 子要素(重ねる文字) */
    .hero-text {
        position: absolute; /* ★浮かせて自由に配置 */
        
        /* 親の真ん中に寄せる魔法の記述 */
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%); /* 自身の大きさの半分だけ戻る */
        
        color: white;
        font-size: 24px;
        font-weight: bold;
        text-shadow: 1px 1px 5px rgba(0,0,0,0.5); /* 文字を見やすくする影 */
    }
</style>
</head>
<body>

    <div class="hero-container">
        <p class="hero-text">Welcome to My Website</p>
    </div>

    <p>↑ 画像の上に文字が乗っていますか?</p>

</body>
</html>

まとめ:使い分けのポイント

positionは強力ですが、使いすぎるとレイアウトが崩壊します。
基本はFlexboxで並べて、どうしても「重ねたい」「固定したい」時だけpositionを使いましょう。

  • relative: 基準となる親につける。
  • absolute: 自由に動かしたい子につける。
  • fixed: 画面にずっと固定したい時につける。

これで「平面」だけでなく「奥行き」のあるWebサイトが作れるようになりました!

 

タイトルとURLをコピーしました