【CSS】画像に要素を重ねておしゃれなレイアウトを作る方法

【CSS】画像に要素を重ねておしゃれなレイアウトを作る方法

こんにちは、ジョージです!

今日は、おしゃれなウェブサイトでよく見かける

画像の上に他の要素を重ねるレイアウトのご紹介です。

今回は、レイアウトが1つの時のみのご紹介をしています。複数の時のコードが知りたい方はこちらの記事を参照ください。

要素を重ねるレイアウト

おしゃれなサイトでよくみかける画像の上に他の要素を重ねるレイアウト。

立体感があっていいですよね。

このレイアウトでよく見かけるパターンは

画像の上に解説の文章を重ねてあるというものです。

ウェブサイト上で、この重ねるレイアウトを実装する方法はすごく簡単で

HTMLとCSSだけで実装することができます。

positionプロパティを使って重ねる

要素を重ねるには

CSSのpositionというプロパティを使います。

positionというプロパティには4つの値あります。

説明
static初期値です。
relative要素を相対位置に配置します。
absolute要素を絶対位置に配置します。
fixed要素を絶対位置に配置し固定します。

この4つの中で使う値は

relativeabsoluteです。

position:relative;を指定した要素の子要素に

position:absolute;を指定することで

position:relative;を指定した要素の中で自由に配置することができます。

自由に配置するにはtopleftrightbottomというプロパティを使います。

具体的な記述を見てみましょう。

See the Pen mZBGQP by george (@ge_or_ge_or) on CodePen.

このコードをイラストで説明するとこういうことになります。

position:relative;を指定した親要素の中に

position:absolute;を指定した子要素をHTMLで記述します。

そうしたら、CSSでposition:absolute;を指定してある子要素に

配置を指定できるtopプロパティleftプロパティを指定します。

それぞれのプロパティに100pxを指定しているので

左上の起点からスタートして上から100px、左から100px移動して配置されているわけです。

こう書くことで親要素の中で子要素を自由に配置することができます。

2つの要素を重ねる

positionを使って要素を好きな位置に配置することはできましたので

次は配置する要素を2つにしてみます。

See the Pen pXWqKa by george (@ge_or_ge_or) on CodePen.

このコードも先ほどと同じように

position:absolute;がついた子要素を2つ記述し

それぞれの子要素にtopプロパティleftプロパティを記述することで

position:relative;のついた親要素の中に配置しています。

topプロパティleftプロパティの値の数字を2つの子要素で

違う数値を指定しているので

ズレて配置されているというわけですね。

画像の上に文章が書いてある要素を重ねる

2つの要素を重ねる記述をもとにして

画像の上に、文章が書いてある要素を重ねる記述を書いてみます。

See the Pen MMEZRq by george (@ge_or_ge_or) on CodePen.

pizzaクラスがついた親要素にposition:relative;を指定します。

子要素にimgタグpタグを入れ

それぞれにposition:absolute;を指定します。

そして、先ほどと同じように

topプロパティleftプロパティで位置を調整しています。

また、pタグには追加で

box-shadowプロパティで要素の枠に影をつけて少し浮いている感じを表現しています。

子要素が逆の時に重ねる場合

先ほどのピザのサンプルのHTMLの記述では

子要素を最初にimgタグ、次にpタグという順番で記述しましたが

これが最初にpタグ、次にimgタグという順番になっている場合

画像が文章より手前に表示されるので

画像が文章に被ってしまい

文章が読めなくなってしまいます。

この場合、CSSに少し加筆する必要があります。

ということで逆にしたパターンも見てみましょう。

See the Pen qzPzpp by george (@ge_or_ge_or) on CodePen.

見た目は同じですが

HTMLとCSSの記述が先ほどのサンプルとは少し違います。

HTMLはimgタグpタグが先ほどとは逆になっています。

CSSではpタグz-indexプロパティが追記しています。

z-indexプロパティは重なっている要素を手前に表示するか、奥に表示するかを指定することができるプロパティで

値には数字を入れます。

値は0が基準となっていて数字を大きくすれば手前に表示されるようになります。

ですので、今回は値を1としていますので

pタグが手前に表示されるようになったというわけです。

レスポンシブウェブデザインで利用する場合

今までは親要素の横幅が固定値の場合の配置方法をご紹介しましたが

このレイアウトをレスポンシブウェブデザインのページで使う方法もご紹介します。

レスポンシブウェブデザインの場合、スマホやタブレットでのデザインもどうするか考えなければなりません。

そのまま小さくするだけで良ければいいのですが

このレイアウトの場合、画像はかなり小さくなり何の画像かわからなくなる可能性が高いですし

文字もかなり小さくなるので何が書いてあるかわからなくなってしまいます。

ですので、スマホ、タブレットの場合は以下のようにレイアウトを変更することにします。

PCの時は横に並べていた要素を縦に並べることで画像もよくわかるようになりますし

文字の可読性も損なわれずにすみそうです。

レスポンシブ用にサンプルページを用意しましたので

こちらのページを見てみてください。

レスポンシブウェブデザインでレイアウトを作るときは

要素の位置を指定するtopプロパティleftプロパティの値や

要素の大きさを指定するwidthプロパティheightプロパティの値を

固定値ではなく相対値で指定しています。

このとき、横幅を広くとると

画像と文章の要素が離れてしまいますので

もしモニターの解像度が大きい方が見たとき

画像と文章が離れていると

関連のあるものと捉えてもらえず

見ている方が混乱してしまう可能性があります。

これを防ぐために

ブレイクポイントをもう1つ920pxのポイントで追加しました。

ブレイクポイントを追加したことで

横幅を広くしても文章の要素が画像の上に重なるようにしています。

まとめ

HTMLとCSSだけでおしゃれなレイアウトが簡単にできていいですよね。

レスポンシブウェブデザインで利用するとなると少し記述が増えてしまいますが。

positionプロパティを駆使すれば他にも色々なレイアウトを組むことが可能ですので

おしゃれなレイアウトを色々組んでみてください!