makiyoshiya076
@makiyoshiya076

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【CSS】写真を横並びにして、テキストを上に載せたいがレイアウトが崩れる

スクリーンショット 2025-02-28 14.51.06.png
スクリーンショット 2025-02-28 14.51.43.png

【実現したいこと】
• 3枚の写真を横並びにする
• 各写真の上にテキストを載せる

【発生している問題】

最初は3枚の写真が横並びになっていましたが、左端の写真に position: absolute; を適用し、テキストを載せるコードを書いたところ、レイアウトが崩れました。

【知りたいこと】
• 写真を横並びにしつつ、上にテキストを載せる場合、どのような考え方で実装すればよいか?
• position: absolute; を使うとレイアウトが崩れる原因は何か?
• より適切な方法(例えば position: relative; を使う、display: flex; で管理する など)はあるのか?

【試したこと】
• display: flex; で横並びに配置する
• position: relative; を親要素に指定してみる

しかし、意図したように配置できませんでした。

【質問の意図】

「この場合はこう書けばOK」という正しいコードだけでなく、このようなレイアウトを実装するときの考え方 を知りたいです。
どのように設計すれば、意図したレイアウトを保ちつつテキストを配置できるか、ご教授いただけると助かります!

該当するソースコード

<!DOCTYPE html>
<html lang="Ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>宮崎製作所</title>
  <link rel="stylesheet" href="style.css">
  <!-- reset.css ress -->
  <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css" /> 
</head>
<body>
  <section>
    <h1>宮崎製作所について</h1>
    <div class="container">
      <div class="image">
        <div class="mountain">
          <img src="img/mountainーsikaku.jpg" alt="">
          <p>地域との歩み</p>
          <a href="">詳しく見る</a>
        </div>
        <img src="img/wolf-sikaku.jpg" alt="">
        <img src="img/apple-sikaku.jpg" alt="">
      </div>
    </div>
  </section>
</body>
</html>
* {
  font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif; 
  font-size: 1.2em;
}

h1 {
  text-align: center;
  font-weight: lighter;
}

.image .mountain {
  display: flex;
  justify-content: space-around;
}

.image img {
  max-width: 30%;
  /* height: auto;  */
}

.mountain {
  position: relative;
}

p {
  color: beige;
  font-size: 50%;
  position: absolute;
  top: 150px;
}

a {
  color: beige;
  font-size: 30%;
  position: absolute;
  top: 200px;
}
0

2Answer

考え方は間違っていないと思いますが、実装にはいくつか間違いがあるようです。

まずフレックスボックスは直下の要素を並列にするもので、この場合 .mountain を並列にしたいのだと思いますから、display: flex; 等は .image .mountain ではなく、親の .image に指定します。そして2枚目3枚目のimgも、1枚目同様に <div class="mountain"> を作ってその中に入れます。

クラス名からすると .mountain は1枚目のボックス専用を意図されているようにも伺えますが、専用にする意味はおそらく無いと思いますので、もっと適切な名前に変えたほうがよろしいかと思います。

あとはボックスのサイズとかいろいろ調整しなければならないと思いますが、上記が直ったらもう大丈夫ですよね。

2Like

Comments

  1. @makiyoshiya076

    Questioner

    ご回答ありがとうございました!

    ご指摘いただいた点を修正し、思い通りのレイアウトを実装できました!

    特に、
    • display: flex; を .image に適用すること
    • すべての画像を

    で統一すること(mountainはflexに変えました。)

    この2点を見直したことで、レイアウトが崩れず、テキストも正しく配置されました。
    また、クラス名の命名についてもアドバイスいただき、より分かりやすい構造になりました。

    とても分かりやすいご説明、ありがとうございました!🙌
    スクリーンショット 2025-02-28 17.31.49.png

写真を横並びにしつつ、上にテキストを載せる場合、どのような考え方で実装すればよいか?

フレックスボックスまたはグリッドレイアウトが適していると思いますので、考え方はあっていると思います。
現在は.mountainをフレックスボックスにしていると思いますが、横並びにするにはその親要素をフレックスボックスにする必要があります。


position: absolute; を使うとレイアウトが崩れる原因は何か?

この場合、position: absolute;は直接の原因ではないです。
imgは何も指定しなければdisplay:inlineですが、divdisplay:blockです。displayが変化したことが、直接の原因です。


より適切な方法(例えば position: relative; を使う、display: flex; で管理する など)はあるのか?

ひとまず、img{ display: block }としておくべきです。
最近のレイアウトで画像をインラインレベルで扱いたい場面というのはそうそうありません。

1Like

Your answer might help someone💌